QT未定义信号上的参考编译错误

时间:2015-02-07 18:53:23

标签: c++ qt signals

我正在尝试将属性标题添加到我的应用程序的主窗口中。但是当我尝试编译它时,编译器给了我这个错误:

mainwindow.cpp:19: undefined reference to `MainWindow::titleChanged(QString const&)'

我在mingw上尝试过,msvc2013在这个错误的同一行都失败了。标头/源文件:

mainwindow.h:

#ifndef MAINWINDOW
#define MAINWINDOW

#include <QObject>
#include <QString>

class MainWindow : public QObject {
    QOBJECT_H

    Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged)

public:
    MainWindow();

    QString getTitle();

public slots:
    void setTitle(const QString& title);

signals:
    void titleChanged(const QString& title);

private:
    QString title_;
};

#endif // MAINWINDOW

mainwindow.cpp:

#include "mainwindow.h"

#include <QString>

MainWindow::MainWindow()
{
}

QString MainWindow::getTitle()
{
    return title_;
}

void MainWindow::setTitle(const QString& title)
{
    if (title_ != title) {
        title_ = title;

        emit titleChanged(title);
    }
}

如果我将下面的方法添加到mainwindow.cpp文件的末尾,那么应用程序将编译并运行,但不会发出信号:

void MainWindow::titleChanged(const QString&)
{
}

我试图清理项目的构建文件夹,它没有帮助:(。我正在使用QT 5.4并在QT Creator上工作。

1 个答案:

答案 0 :(得分:0)

其他人的评论已经回答了这个问题。我只是想突出答案。我的案例中的错误是在头文件

mainwindow.h:

class MainWindow : public QObject {
   QOBJECT_H  // This should be Q_OBJECT

...

我把QObject.h头文件中使用的QOBJECT_H宏混淆为QT的moc工具使用的Q_OBJECT宏的包含保护。由于intellisense将为您提供两种选择,因此很容易混淆。

我还指出了一个关于信号/插槽常见问题的好读物:My signal / slot connection does not work