Qt 信号和插槽发送结构数组

Posted

技术标签:

【中文标题】Qt 信号和插槽发送结构数组【英文标题】:Qt Signals and Slots sending arrays of structures 【发布时间】:2016-09-16 11:21:49 【问题描述】:

我希望发送大小不同的数据(取决于跟踪标记的数量)。我有一个结构,旨在保存一个标记的所有信息。然后我需要通过信号和插槽将其发送到另一个线程进行处理。我已经为结构添加了必要的元类型声明。我已经正确连接了所有信号和插槽,并且一切都适用于一个结构。但是,当我尝试发送标记数组时,不会发送/接收信号。为什么我只能发送结构的单个实例而不是它们的数组,即使结构本身包含一个数组?

我尝试过信号和槽定义,例如:

插槽:

void update(Datastruct output[])

和 信号:

void updatemarkers(Datastruct&)

这是我的结构:

#ifndef RETURNSTRUCT_H
#define RETURNSTRUCT_H

struct Datastruct

    int markerid;
    double markererror;
    double markertrans[3];
    double markerrotation[3][3];

;

Q_DECLARE_METATYPE(Datastruct);

#endif //RETURNSTRUCT_H

还包括此行以避免使用类型声明推断命名空间。

// after QApplication was instantiated
qRegisterMetaType<Datastruct>("Datastruct");
// but before any class is instantiated that connects signals with this type

为什么我只能发送结构的单个实例而不是它们的数组,即使结构本身包含一个数组??

我正在使用 Windows 7、MinGW 32 位、Qt 5.7.0、Qt Creator 4.0.3

【问题讨论】:

您使用的是 C++,而不是 C,使用 C 样式的数组通常在 C++ 代码中没有位置。 【参考方案1】:

尝试使用 Qt 数据结构而不是简单的数组。类似于QList 或QVector。它们已经是一种元类型,可以默认通过信号和槽发送。 让我知道它是否有效。

【讨论】:

当你使用这样的容器时,你可以注意线程。也许是一篇关于 Qt 数据结构的有趣文章:blog.qt.io/blog/2009/08/25/… 好的:我没有尝试使用任何指针,因为数据生成速度很快,并且内存在由我的其他线程处理之前被覆盖或重新分配(我已经尝试过)我现在尝试使用QVector 模板包含我的结构的向量,但没有任何反应,我没有收到任何错误/警告我只是没有在另一端获得我的数据:( 以这种方式使用 QVector 有什么意义。它也不必是指针。您可以传递整个向量或对其的引用。 是否无法取消引用数据并发送我的结构数组的完整副本? (抱歉之前不清楚) @LucaAngioloni 不,你是对的,也许是另一个小提示......我不会使用信号将所有信息提供给另一种方法,尤其是在像列表这样的大数据结构的情况下,它不会在我看来感觉不错。我会提示有一些新数据可用并重新考虑我的数据结构。

以上是关于Qt 信号和插槽发送结构数组的主要内容,如果未能解决你的问题,请参考以下文章

信号和插槽的连接(关于 qlistview) - Qt

QT 插槽和信号参数

如何使方法发送信号并在返回之前等待插槽?

如何在 Qt 中将插槽连接到信号 QProcess::started()?

将结构传递给Qt中的信号

将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)