首页 > 解决方案 > 在排队连接中传递参数的良好做法

问题描述

我想要一个简单明了的例子来说明如何在队列连接中执行信号和槽机制。以下面的行为例。认为 obj1 是从另一个线程异步发出信号的后端功能对象,并连接到 GUI(主线程)中的插槽:

connect(obj1, SIGNAL(Mysignal(vector<mystruct> )), this, slot(myslot(vector <mystruct>)))

我读过你必须注册类型(元类型)。请为我需要的上述示例提供一个清晰、简单且易于使用的代码行,以便在运行时出现错误,例如向量、未定义的结构或字符串等。我不会面对。

另外,有没有更好的方法来处理这个问题,比如发送指针:

connect(obj1, SIGNAL(Mysignal(obj2 *)), this, slot(myslot(obj2 *)))

Obj2 包含 mystruct 的向量。我还需要用这些元类型注册 obj2 吗?

如果有人有这方面的经验,请分享您所有的良好实践和简单的代码片段,我是排队连接参数的新手。请帮忙。

标签: qt

解决方案


如果你想要一个排队的连接,你需要使用 5. 参数调用 connect Qt::QueuedConnection。否则,您将在发送信号的线程内获得直接连接。编辑:参见下面的 Tobys 评论。

您必须将 QVector<> 包装到 typedef 中,否则注册将不起作用(错误?在 Qt 中来自 Stoneage)。也不要使用对你的 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)
{
}

推荐阅读