我想要一个简单明了的示例,说明如何在排队连接中执行信号和插槽机制。 以下面的行为例。认为obj1是后端功能对象,它从另一个线程异步发出信号,并连接到GUI(主线程)中的插槽:
connect(obj1, SIGNAL(Mysignal(vector<mystruct> )), this, slot(myslot(vector <mystruct>)))
我已阅读您必须注册类型(元类型)。 请为上面的示例提供一个清晰,简单且易于使用的代码行,以便在运行时出现错误,例如vector,未定义我的struct或字符串等。我不会面对。
此外,还有更好的方法来处理此问题,例如发送如下指针:
connect(obj1, SIGNAL(Mysignal(obj2 *)), this, slot(myslot(obj2 *)))
Obj2包含mystruct的向量。我是否仍需要使用这些元类型注册obj2?
如果有人对此有经验,请分享您的所有良好做法和简单的代码片段,我对带有参数的排队连接是陌生的。请帮忙。
答案 0 :(得分:1)
如果要排队连接,则需要使用5.参数Qt::QueuedConnection
来调用connect。否则,您将在发送信号的线程内获得直接连接。 编辑:请参见下面的Tobys评论。
您必须将QVector <>包装到typedef中,否则注册将不起作用(在Qt中是臭虫吗?)。也不要使用对您的typedef的引用,也将不起作用。
标题
typedef struct {
int a;
int b;
} mystruct;
typedef QVector<mystruct> myvector;
Q_DECLARE_METATYPE(myvector);
来源
void MainWindow::test()
{
qRegisterMetaType<myvector>();
connect(this, SIGNAL(sigRec(myvector)), SLOT(slotRec(myvector)), Qt::QueuedConnection);
mystruct x = {1,2};
myvector v;
v.append(x);
emit sigRec(v);
}
void MainWindow::slotRec(myvector s)
{
}