看到未定义的对“CollidingMice 的 vtable”的引用

Posted

技术标签:

【中文标题】看到未定义的对“CollidingMice 的 vtable”的引用【英文标题】:seeing undefined reference to `vtable for CollidingMice' 【发布时间】:2015-03-25 13:40:45 【问题描述】:

我正在修改 Qt 代码附带的 Qt 示例“collidingmice”。 在原始源代码中,QApplication 包含 QView 和 QScene,但我创建了一个包含 QView 和 QScene 的类 CollidingMice,以使用键盘输入终止视图和场景。我想将键盘输入发送到 CollidingMice 类。 我在堆栈溢出中阅读了 4 或 5 个关于“未定义对 vtable 的引用”的问题,但找不到适合我的案例。我检查了 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();

添加和编辑:在按照 svlasov 告诉我的方式删除上面的 QOBJECT 之后,并在修复如下构造函数之后(请参阅 setScene..my colleage 建议我。)

               view = new QGraphicsView(this);
                view->resize(600,500);
                view->setScene(&scene);
                view->setRenderHint(QPainter::Antialiasing);

我可以编译并执行它。

【问题讨论】:

【参考方案1】:

如果在类定义中使用Q_OBJECT,则必须将类提取到单独的头文件中。

如果你没有在 CollidingMice 类中声明信号和槽,只需删除 Q_OBJECT 即可编译。

更新

正如@KubaOber 评论的那样,您可以简单地将file.cpp 文件包含在末尾:

#include "file.moc"

qmake 将完成所有工作。

【讨论】:

哦,编译成功了!谢谢。 顺便说一句,我看不到碰撞小鼠视图。你能告诉我有什么问题吗?我曾经看过我以前这样写的代码(我错误地删除了)至少显示了移动的老鼠。 构造函数中的line view->show()不做吗? 查看我的编辑。 (缺少 setScene) 我添加了an answer about how to invoke moc on .cpp files。【参考方案2】:

您的课程似乎是在 .cpp 而不是 .h 中声明的

Qt MOC 不喜欢它。您可以在文件末尾添加#include "mysrcfile_moc.cpp" 或将类声明移动到 mysrcfile.h 之后不要忘记清理和重建。

【讨论】:

【参考方案3】:

您的代码存在 3 个问题...

    Qt 解析类头并构造与 QObject 层次结构相关的底层函数,包括用于导出的符号。这是一个基本的解析器,需要一个显式的头文件——为了便于解析和符号导出。 创建标头 - 相信我,创建文件、剪切粘贴类声明并将其包含回来只需要 5 秒的时间……并且可以节省大量排除 Qt 编译问题的时间。

    场景有一个场景矩形,但是视图是一个常规的 QWidget——这意味着 Window 应该使用一个布局类,并像其他 QWidget 一样包含它。否则,视图将被调整为类似 QSize(1,1) 的大小,并且默认位于 pos(0, 0) 处。这就是你看不到它的原因。

    对于 QGraphicsScene,您正在寻找插槽 update() 而不是 advance()

【讨论】:

好的,至少现在可以编译,但是在将其更改为 'view = new GraphicsView(&scene);' 之后窗口大小还可以,少了老鼠和奶酪的图片。我会在一秒钟内发布新的捕获。

以上是关于看到未定义的对“CollidingMice 的 vtable”的引用的主要内容,如果未能解决你的问题,请参考以下文章

Opencv '未定义的对 `cv::namedWindow....' 的引用(链接错误)

尝试使用 -pg [Termux] 时出现“未定义的对 `mcount' 的引用”

如何解决在开发 C++ 中未定义的对 readimagefile 的引用错误 [重复]

未定义的对静态constexpr char []的引用

这些'未定义的对 __glut*WithExit' OpenGL 链接器错误的引用是啥意思? [复制]

未定义的对main,makefile的引用