我正在修改Qt代码附带的Qt示例'collidingmice' 在原始源代码中,QApplication包含QView和QScene,但是我创建了一个包含QView和QScene的类CollidingMice来使用键盘输入来终止视图和场景。我想将键盘输入发送到CollidingMice类。 我在堆栈溢出中读了4或5个关于'未定义引用vtable for ..'的问题但是找不到适合我的情况。我查了一下 1.未定义的父类中没有虚函数 2.我尝试添加析构函数~CollidingMices(){}的定义 3.我99%确定下面的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();
}
添加和编辑:删除上面的QOBJECT后,svlasov告诉我,并在修复构造函数后如下(参见setScene..my colleage建议我。)
view = new QGraphicsView(this);
view->resize(600,500);
view->setScene(&scene);
view->setRenderHint(QPainter::Antialiasing);
我可以编译并执行它。
答案 0 :(得分:2)
如果在类定义中使用Q_OBJECT
,则必须将类提取到单独的头文件中。
如果您未在CollidingMice
类中声明信号和广告位,请删除Q_OBJECT
并进行编译。
<强>更新强>
正如@KubaOber评论的那样,您可以简单地包含在file.cpp
文件的末尾:
#include "file.moc"
和qmake
将完成所有工作。
答案 1 :(得分:1)
看来你的类是用.cpp而不是.h
声明的 Qt MOC不喜欢它。您可以在文件末尾添加#include "mysrcfile_moc.cpp"
或将类声明移动到mysrcfile.h。不要忘记清理&amp;之后重建。
答案 2 :(得分:1)
您的代码有3个问题......
Qt解析类头并构造与QObject层次结构相关的底层函数,包括用于导出的符号。这是一个基本的解析器,需要一个显式的头文件 - 既易于解析也适用于符号导出。 创建标题 - 相信我,创建文件需要5秒钟,剪切粘贴类声明并将其包含回来......并节省了大量时间来解决Qt编译问题。
场景有一个场景矩形,但视图是一个常规的QWidget - 这意味着Window应该使用一个布局类并像其他QWidget一样包含它。如果不这样做,视图的大小将调整为QSize(1,1)并默认位于pos(0,0)。这就是你无法看到的原因。
对于QGraphicsScene,您正在寻找广告位update()
而不是advance()