我在32位Windows 7旗舰版上使用Qt Creator 2.0.1和Qt 4.7.0 (32位)。
考虑以下代码,这是产生错误的最低要求:
class T : public QObject, public QGraphicsItem
{
Q_OBJECT
public:
T() {}
QRectF boundingRect() const {return QRectF();}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget) {}
};
int main()
{
T t;
return 0;
}上面的代码片段会导致以下链接器错误:
T‘的函数T': undefined reference tovtable中的
未定义对vtable for T' In function~T‘的引用:
未定义对T‘的vtable for T' undefined reference tovtable的引用
如果我注释掉包含Q_OBJECT的行,它编译得很好。我需要信号和QGraphicsItem插槽,所以我需要Q_OBJECT。
代码有什么问题?谢谢。
发布于 2011-01-23 22:33:58
这是因为MOC生成的单元不包括在链接过程中。或者它根本不会生成。我要做的第一件事是把类声明放在一个单独的头文件中,也许构建系统不会扫描实现文件。
另一种可能是这个类曾经不属于Qt元对象系统(也就是说,它没有Q_OBJECT或者根本不是从QObject继承的),所以需要再次运行qmake,以便为MOC创建必要的规则。强制运行qmake的最简单方法是对项目文件进行一些无关紧要的更改以更新其时间戳,比如添加然后删除一些空格。或者,如果您使用的是Qt Creator,那么只需从项目上下文菜单中选择“Run qmake”即可。
发布于 2011-01-23 23:45:15
如果要在源文件中定义QObject子类,则需要添加以下行
#include "file.moc"在类定义之后的某个点,其中源文件的名称是file.cpp。当然,您需要重新运行qmake,以便将运行moc的适当规则添加到Makefile中。
只有当头文件中存在类定义中的Q_OBJECT时,才会导致调用moc。如果是源文件,则需要额外的一行来强制使用moc。
我相信以前也有人问过类似的问题,但我找不到。
发布于 2011-01-23 23:18:02
将您的Q_OBJECT类放在单独的文件中。也就是说,每个类有一个.h和一个.cpp。Qt的元对象宏在这方面有点挑剔。
此外,您还可以使用QGraphicsObject来实现您的目的。为你节省了一些时间。
编辑:我看到你在使用Creator。在新建文件或项目中使用其新建C++类函数以“正确的方式”创建文件:)
https://stackoverflow.com/questions/4774291
复制相似问题