简述
Q_OBJECT 为QObject 对象提供了信号与槽的基础,如果我们需要使用信号与槽,最简单方便的方式就是继承QObject,并在类开头放置Q_OBJECT 这个宏,在预编译前moc 会自动扫描所有头文件,根据 signals 和 slot 关键字,提取信号与槽的所有及对应的信息索引,并为信号生成相对应的函数。但有时候我们需要在源文件cpp 中定义一个继承于QObject 的类,并使用信号与槽,这时候问题就出现了。
moc 仅扫描头文件,不理会源文件中的 Q_OBJECT ,导致编译器报错,所以这时候我们还需要在源文件结尾包含"文件名.moc",如 #include "xxxx.moc"
,再重新 qmake->构建 即可。
如编译出错,可能需要包含moc文件所在位置的目录,一般是生成在 release 目录下
INCLUDEPATH += $$PWD/release
环境
系统:Windows10 / ubuntu12
IDE : Qt5.9.6 / Qt4.8.1 / Qt4.8.5
代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
class Test : public QObject
{
Q_OBJECT
public:
Test(QObject *p = 0) : QObject(p)
{
}
~Test()
{
}
void test()
{
emit send();
}
signals:
void send();
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Test t(this);
//connect(&t, SIGNAL(send()), this, SLOT(receive())); //Qt 4.8
connect(&t, &Test::send, this, &MainWindow::receive); //Qt 5.9
t.test();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::receive()
{
qDebug()<< "test";
}
#include "mainwindow.moc"