Я изменяю пример Qt' collidingmice ', который поставляется с кодом Qt.
В исходном источнике QApplication содержит QView и QScene, но я создал класс CollidingMice, содержащий QView и QScene, чтобы убить представление и сцену с помощью ввода с клавиатуры. Я хочу отправить входной сигнал клавиатуры в класс CollidingMice. Я прочитал 4 или 5 вопросов в переполнении стека о «неопределенной ссылке на vtable for ..», но не смог найти подходящий мне случай. Я проверил, что
1. В родительских классах нет виртуальной функции, которая не определена.
2. Я попытался добавить определение деструктора ~ CollidingMices() {}
3. И я на 99% уверен, что в коде CollidingMice ниже нет неопределенной функции-члена.просмотр неопределенной ссылки на `vtable for CollidingMice '
#include "mouse.h"
#include <QtGui>
#include <math.h>
static const int MouseCount = 7;
class CollidingMice : public QMainWindow
{
Q_OBJECT
private:
QGraphicsView *view;
QGraphicsScene scene;
QTimer *timer;
public:
CollidingMice(QWidget *parent = 0): QMainWindow(parent) {
scene.setSceneRect(-300, -300, 600, 600);
scene.setItemIndexMethod(QGraphicsScene::NoIndex);
for (int i = 0; i < MouseCount; ++i) {
Mouse *mouse = new Mouse;
mouse->setPos(::sin((i * 6.28)/MouseCount) * 200,
::cos((i * 6.28)/MouseCount) * 200);
scene.addItem(mouse);
}
view = new QGraphicsView(this);
view->setRenderHint(QPainter::Antialiasing);
view->setBackgroundBrush(QPixmap(":/images/cheese.jpg"));
view->setCacheMode(QGraphicsView::CacheBackground);
view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view->setDragMode(QGraphicsView::ScrollHandDrag);
view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Colliding Mice"));
#if defined(Q_WS_S60) || defined(Q_WS_MAEMO_5) || defined(Q_WS_SIMULATOR)
view->showMaximized();
#else
view->resize(600, 450);
view->move(30,30);
view->show();
#endif
timer = new QTimer;
QObject::connect(timer, SIGNAL(timeout()), &scene, SLOT(advance()));
timer->start(1000/33);
}
private:
void keyPressEvent(QKeyEvent *event);
};
void CollidingMice::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_q) {
close();
}
}
int collidingmice_main(int argc, char **argv)
{
QApplication app(argc, argv);
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
CollidingMice w;
return app.exec();
}
ADD и EDIT: После удаления QObject выше, как svlasov сказал мне, и после фиксации конструктора, как показано ниже (см setScene..my Colleage предложил мне.)
view = new QGraphicsView(this);
view->resize(600,500);
view->setScene(&scene);
view->setRenderHint(QPainter::Antialiasing);
я мог скомпилировать его и выполнить.
О, что сделали это компилируется! Благодарю. –
BTW, я не вижу вид встречной мысли. Можете ли вы сказать мне, что случилось? Я когда-то видел, что мой предыдущий код (который я удалил по ошибке) написал таким образом, по крайней мере, показал движущихся мышей. –
Вам нужно показать его 'w.show();'. – svlasov