c++ - Qt Signal/Slots发送完整结构

标签 c++ multithreading qt signals-slots qt-signals

我正在尝试通过两个线程之间的信号/槽发送一个结构,我的信号/槽已正确连接并且我已经能够发送包含我的部分数据的 QString 但现在我需要发送整个东西并且结构似乎最明智的。但是,当我尝试时,信号未发送/接收。问题似乎只是发送/接收结构,我尝试了很多方法之前和之后的处理。

我不能使用这样的指针 herehere因为我的数据生成速度太快,内存被覆盖或释放(我尝试过使用指针并假设引用也会受到类似的影响)。

我已经添加了 Q_DECLARE_METATYPE到我的结构。我的结构暂时只是一个小测试(后面会放大),在自己的头文件中。

#ifndef RETURNSTRUCT_H
#define RETURNSTRUCT_H

struct Datastruct
{
    int markeridone;
};

Q_DECLARE_METATYPE(Datastruct);

#endif //RETURNSTRUCT_H

为什么我的程序可能无法发送/接收结构?非常感谢任何帮助。

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

最佳答案

您的调试日志应该警告您 - 您只能发送 qt 元系统已知的类型。使用 Q_REGISTER_METATYPE 您最终注册了与进行定义的 namespace 关联的类型。

幸运的是,您可以像这样告诉 Qt 您的结构:

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

并且它不会尝试通过查看代码来推断命名空间。确保重新运行 qmake(或者最好做一次清理),否则在使用 QtCreator 构建时它可能会被忽略。

如果您稍后碰巧通过信号传递您的类型的模板类,请确保也注册它们,因为即使 Qt 知道 QList,它也不知道您类型的 QList:

qRegisterMetaType<QList<Datastruct>>("QList<Datastruct>");

另一个注意事项:如果您#define 类别名,请确保使用真实姓名注册它们。

#define std::shared_ptr model_ptr
// you can declare your signals like this:
void my_signal(model_ptr<my_model>);
// but have to register the type like this:
qRegisterMetaType<std::shared_ptr<my_model>>("std::shared_ptr<my_model>");

关于c++ - Qt Signal/Slots发送完整结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495926/

相关文章:

c++ - 私有(private)成员的 QT/C++ 类声明对构造函数不可见?

c++ - 带有 GMock 的 EXPECT_DEATH - 未能死亡

c++ - 我应该期望 CentOS6 和 CentOS7 之间 fstream 异常处理的不同行为吗?

c# - 如何在我的 C# 代码中调用库中的 C 方法?

java - 同步每分钟节拍/发送量化消息

c - 在Linux中,pthread_exit()和pthread_cancel()如何调用清理例程?

multithreading - 有哪些学习线程编程的好资源?

c++ - Qt5 加载 .qm 翻译文件

c++ - 如何将关键点复制到另一个 vector

c++ - '->' 的基操作数具有非指针类型 'QStandardItemModel'