qt信号槽接收不到的情况(自定义数据类型+多线程)


一般的基本数据类型,qt都认识,包括QString,所以信号和槽一般都可以正常使用。

今天发现一种情况,如果信号的参数是自定义的数据类型,并且在不同的线程中被发送,对应的槽就不会收到。

当然也有解决办法

直接看例子:


a.h

#include <QWidget>
#include <QSignalMapper>

struct Info
{
    Info(int age = 0, const QString &name = "") : m_nAge(age), m_sName(name) { }
    int m_nAge;
    QString m_sName;
};

class ButtonWidget : public QWidget
{
    Q_OBJECT

public:
    ButtonWidget();

signals:
    void clicked(const Info &info);

private:
    void onCliecked(const Info &info);

    void onTest();

    QSignalMapper *signalMapper;
};


a.cpp

#include <QGridLayout>
#include <QPushButton>
#include <QMessageBox>
#include "a.h"
#include "Windows.h"

DWORD WINAPI fun(LPVOID p)
{
    Info a(10, "liming");
    emit ((ButtonWidget*)p)->clicked(a);
    return 0;
}

ButtonWidget::ButtonWidget() :
    signalMapper(NULL)
{
    QPushButton *pBtn1 = new QPushButton("hello");

    connect(this, &ButtonWidget::clicked, this, &ButtonWidget::onCliecked);

    QHBoxLayout *pHblMain = new QHBoxLayout;
    pHblMain->addWidget(pBtn1);

    setLayout(pHblMain);

    // 通过按钮点击,测试同一线程中发送信号
    connect(pBtn1, &QPushButton::clicked, this, &ButtonWidget::onTest);
    // 测试不同线程中发送信号
    // qRegisterMetaType<Info>("Info");
    CreateThread(NULL, 0, fun, this, 0, NULL);
}

void ButtonWidget::onCliecked(const Info &info)
{
    QMessageBox::information(this, "title", info.m_sName);
}

void ButtonWidget::onTest()
{
    Info a(10, "liming");
    emit clicked(a);
}


main.cpp

#include <QApplication>
#include "a.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    ButtonWidget bw;

    bw.show();

    app.exec();


    return 0;
}


运行程序,发现,线程中发送的信号,并没有被槽接收。奇怪是吧。

当然如果换成int或QString就可以了,但是这里是自定义的,怎么办呢?


打开上面的注释

// qRegisterMetaType<Info>("Info");
就好了。这就使qt认识了我们的类型。


参考:

http://blog.csdn.net/zb872676223/article/details/38778125














  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值