我正在尝试通过两个线程之间的信号/槽发送一个结构,我的信号/槽已正确连接,并且我已经能够发送包含部分数据的 QString,但现在我需要发送整个数据,而结构似乎是最明智的。但是,当我尝试时,信号未发送/接收。问题似乎仅与发送/接收结构、前后处理有关,我尝试了很多方法。
我不能使用这样的指针here https://stackoverflow.com/questions/19397567/using-structure-s-signal-in-qt or here https://stackoverflow.com/questions/15567838/signal-emitting-a-structure因为我的数据生成得太快并且内存被覆盖或释放(我尝试过使用指针并假设引用也会受到类似的影响)。
我已经添加了Q_DECLARE_METATYPE http://doc.qt.io/qt-5/qmetatype.html#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 您最终会注册与进行定义的名称空间关联的类型。
幸运的是,您可以像这样告诉 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>");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)