qt - 在排队连接中传递参数的良好做法
问题描述
我想要一个简单明了的例子来说明如何在队列连接中执行信号和槽机制。以下面的行为例。认为 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 吗?
如果有人有这方面的经验,请分享您所有的良好实践和简单的代码片段,我是排队连接参数的新手。请帮忙。
解决方案
如果你想要一个排队的连接,你需要使用 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)
{
}
推荐阅读
- python - 比较 2 个大小不均匀的 Pandas DataFrames 的匹配值并组合在一起,然后用最接近的数据替换 NaN 值
- python - 将带有列表的 Pandas 列转换为字符串
- r - 根据成员资格从 igraph 对象绘制“迷你”图
- android - 房间数据库元素未显示
- mysql - 如何在 SELECT 子句的子查询中使用别名?PostgreSQL
- permission-denied - Poedit - 更新源代码失败 - 拒绝权限
- javascript - React Native:孩子对父母道具的变化没有反应
- typescript - 将数组值约束到接口的键
- angular - 观察变量变化 Angular
- git - 提交到git中的某个远程存储库时如何忽略文件?