在队列连接中传递参数的良好实践

时间:2019-01-29 11:49:48

标签: qt

我想要一个简单明了的示例,说明如何在排队连接中执行信号和插槽机制。 以下面的行为例。认为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?

如果有人对此有经验,请分享您的所有良好做法和简单的代码片段,我对带有参数的排队连接是陌生的。请帮忙。

1 个答案:

答案 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)
{
}