gpt4 book ai didi

qt - 发射自定义类型的信号不起作用

转载 作者:行者123 更新时间:2023-12-04 04:59:28 26 4
gpt4 key购买 nike

我正在尝试发出自定义类型的信号。使用 Q_DECLARE_METATYPE 声明类型,并使用 qRegisterMetaType 注册。

当我发出信号时,输出流会出现下一个错误:

Type "MyType" has id:  1024 ; register status:  true
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)

仅当使用排队连接(当对象位于不同的线程中或使用显式的 Qt::QueuedConnection时)并且在 namespace 中声明了 MyType时,Bug才可重现。

样例代码:
MyType.h
#define SHOW_BUG

#ifdef SHOW_BUG

namespace NS
{
struct MyType
{
int val;
};
}
Q_DECLARE_METATYPE( NS::MyType );

#else

struct MyType
{
int val;
};
Q_DECLARE_METATYPE( MyType );

#endif

MyClass.h:
#include "MyType.h"

namespace NS
{

class MyClass
: public QObject
{
Q_OBJECT
public:
MyClass( QObject *parent = NULL );
~MyClass();

signals:
void sendMyType( const MyType& tt );

public slots:
void invokeBug();
void getMyType( const MyType& tt );
};

}

MyClass.cpp
#include <QDebug>

namespace NS
{

MyClass::MyClass(QObject *parent)
: QObject(parent)
{
qRegisterMetaType< MyType >();
}

MyClass::~MyClass()
{
}

void MyClass::invokeBug()
{
const int id = qMetaTypeId< MyType >();
const bool test = QMetaType::isRegistered( id );
qDebug() << "Type \"MyType\" has id: " << id << "; register status: " << test;

MyType tt;
tt.val = 42;
emit sendMyType( tt );
}

void MyClass::getMyType( MyType const& tt )
{
qDebug() << "Slot fired: " << tt.val;
}

}

Main.cpp
#include "MyClass.h"

int main(int argc, char *argv[])
{
QCoreApplication a( argc, argv );

NS::MyClass c1;
NS::MyClass c2;
QThread thread;
thread.start();

c2.moveToThread( &thread );

QObject::connect( &c1, &NS::MyClass::sendMyType, &c2, &NS::MyClass::getMyType );
QTimer::singleShot( 0, &c1, SLOT( invokeBug() ) );

return a.exec();
}

最佳答案

下面的代码说明了故障以及解决方案。它适用于Qt 4和Qt 5。

Now we fail 
QObject::connect: No such signal NS::Object::badSignal(NS::MyType) in ../metatype-21119397/main.cpp:32
Now we succeed
Successful slot call 1

#include <QCoreApplication>
#include <QDebug>

namespace NS {
struct MyType
{
int val;
MyType() {}
MyType(int v) : val(v) {}
};

class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void goodSignal(const NS::MyType &);
Q_SIGNAL void badSignal(const MyType &);
Q_SLOT void slot(const NS::MyType & x) {
qDebug() << "Successful slot call" << x.val;
}
};
}
Q_DECLARE_METATYPE(NS::MyType)

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
NS::Object src, dst;
qRegisterMetaType<NS::MyType>();

qDebug() << "Now we fail";
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
QObject::connect(&src, &NS::Object::badSignal, &dst, &NS::Object::slot, Qt::QueuedConnection);
#else
dst.connect(&src, SIGNAL(badSignal(NS::MyType)), SLOT(slot(NS::MyType)), Qt::QueuedConnection);
#endif
emit src.goodSignal(NS::MyType(1));

qDebug() << "Now we succeed";
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
QObject::connect(&src, &NS::Object::goodSignal, &dst, &NS::Object::slot, Qt::QueuedConnection);
#else
dst.connect(&src, SIGNAL(goodSignal(NS::MyType)), SLOT(slot(NS::MyType)), Qt::QueuedConnection);
#endif
emit src.goodSignal(NS::MyType(1));

return a.exec();
}

#include "main.moc"

关于qt - 发射自定义类型的信号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com