Har*_*ton 6 c++ qt multithreading signals-slots qt-signals
我试图通过两个线程之间的信号/插槽发送一个结构,我的信号/插槽正确连接,我已经能够发送包含我的数据部分的QStrings但现在我需要发送整个东西,结构似乎最明智.但是,当我尝试信号没有发送/收到.问题似乎只是发送/接收结构,我尝试了很多方法之前和之后的处理.
我不能在这里或这里使用指针,因为我的数据生成得太快,内存被重写或释放(我已尝试使用指针并假设引用将同样受影响).
我已经将Q_DECLARE_METATYPE添加到我的结构中.我的结构现在只是一个小测试(稍后会放大)并且在它自己的头文件中.
#ifndef RETURNSTRUCT_H
#define RETURNSTRUCT_H
struct Datastruct
{
int markeridone;
};
Q_DECLARE_METATYPE(Datastruct);
#endif //RETURNSTRUCT_H
Run Code Online (Sandbox Code Playgroud)
为什么我的程序无法发送/接收结构?任何帮助深表感谢.
我使用的是Windows 7,MinGW 32位,Qt 5.7.0,Qt Creator 4.0.3
mar*_*-nm 11
您的调试日志应警告您 - 您只能发送qt元系统已知的类型.使用Q_REGISTER_METATYPE,您最终会注册与定义所在的命名空间相关联的类型.
幸运的是,您可以告诉Qt您的结构如下:
// after QApplication was instantiated
qRegisterMetaType<Datastruct>("Datastruct");
// but before any class is instantiated that connects signals with this type
Run Code Online (Sandbox Code Playgroud)
并且它不会尝试通过查看代码来推断命名空间.确保重新运行qmake(或者更好地干净),或者在使用QtCreator构建时可能会忽略它.
如果您以后碰巧通过信号传递类型的模板类,请确保也注册它们,因为即使Qt知道QList,它也不知道您的类型的QList:
qRegisterMetaType<QList<Datastruct>>("QList<Datastruct>");
Run Code Online (Sandbox Code Playgroud)
另请注意:如果您#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>");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3171 次 |
| 最近记录: |