Qt 源文件中的 Q_OBJECT

简述

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"

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值