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

Posted onecing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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














以上是关于qt信号槽接收不到的情况(自定义数据类型+多线程)的主要内容,如果未能解决你的问题,请参考以下文章

Python Qt GUI设计入门自建信号与槽函数关联

QT 信号槽 异步事件驱动 单线程 多并发

[转]QT子线程与主线程的信号槽通信-亲测可用!

Qt::浅谈信号槽连接,参数在多线程中的使用

Qt信号槽传递自定义类型参数(qRegisterMetaType)

qt多线程信号槽传输方式