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信号槽接收不到的情况(自定义数据类型+多线程)的主要内容,如果未能解决你的问题,请参考以下文章