我正在尝试将属性标题添加到我的应用程序的主窗口中。但是当我尝试编译它时,编译器给了我这个错误:
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上工作。
答案 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