信号和插槽的未定义引用链接器错误

时间:2010-06-10 01:25:20

标签: qt signals signals-slots slot moc

使用Qt Creator,我在Qt中创建了一个带有自定义插槽的类:


class CustomEdit : public QTextEdit
{
    Q_OBJECT

public:
    CustomEdit(QWidget* parent);

public slots:
    void onTextChanged ();
};

但是,我收到此链接器错误:

undefined reference to 'vtable for CustomEdit'

文档说:

  

如果您在“未定义的LtableNtable引用”中遇到编译器错误,您可能忘记运行moc或在链接命令中包含moc输出。

......但这并不明显意味着什么。

我需要添加到我的班级或.pro文件中吗?

编辑 - 这是我的.pro文件:

QT += network \
    script \
    webkit \
    xml
TARGET = MyApp
TEMPLATE = app
SOURCES += main.cpp \
    MainWindow.cpp \
    CustomEdit.cpp 
HEADERS += MainWindow.h \
    CustomEdit.h
FORMS += mainwindow.ui

编辑:

This question处理同样的问题,但答案并不清楚如何在Qt Creator中修复此问题。我是否需要将moc生成的.cpp文件显式添加到我要链接的文件列表中?这似乎是一种痛苦。

1 个答案:

答案 0 :(得分:2)

Qt creator是一个用于创建Qt项目的IDE。就这样。但是qmake允许你建立项目。来自qmake manual

qmake自动生成Makefile,因此创建每个Makefile只需要几行信息。 qmake根据项目文件中的信息生成Makefile。 qmake包含支持Qt开发的其他功能,自动包含moc和uic的构建规则。

您不必单独包含moc文件,但必须运行qmake,其中包含有关所需moc文件的所有信息。在qmake之后查看生成的Makefile.debugMakefile.release,您可以找到所有moc文件。

现在在Qt创建者中运行qmake,只需转到将运行qmake的Build->RebuildAll,所有(moc)文件也将生成并链接(在Makefile.debug中)。

希望这会使未定义的引用变得更加灵活。