相关疑难解决方法(0)

如何在多个线程中使用模板类型作为插槽和信号参数?

我可以以任何方式使用模板类型作为插槽或信号参数吗?作为一个例子,我试图定义以下内容:

void exampleSignal(std::map<non_template_type_1,non_template_type_2> arg);
void exampleSlot(std::map<non_template_type_1,non_template_type_2> arg);
Run Code Online (Sandbox Code Playgroud)

这会在运行时导致以下结果:

QObject::connect: Cannot queue arguments of type 
    'std::map<non_template_type_1,non_template_type_2>'
(Make sure 'std::map<non_template_type_1,non_template_type_2>' 
    is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)

试图注册std::map<non_template_type_1,non_template_type_2>Q_DECLARE_METATYPE()在编译失败的结果,显然不支持.

作为一种解决方法,我正在使用QVariantMap而不是std::map.但我真的想知道解决这个问题的正确方法; 一个无法修改模板类的地方.

编辑:我忘了提到信号和插槽是在不同的线程中发出和接收的.显然,单线程方案中不会发生运行时错误.

c++ qt templates signals-slots

6
推荐指数
1
解决办法
3016
查看次数

在Qt中传递结构信号

我想在Qt中发送一个带有信号的结构.我怎样才能做到这一点?我知道如何用信号发送整数,字符串,图像等,但与结构部分混淆.我读了一些帖子,发现了Q_DECLARE_METATYPE(),但我不明白如何使用它.

typedef struct
{
    int EmpId;
    QString Name; 
} StandardData; 

class Data::public QObject
{
    Q_DECLARE_METATYPE(StandardData);

    signals:
        void SignalData(const StandardData &f_objStandardCan);
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误1.非命名空间范围类中的显式特化.2.模板的专用化必须出现在命名空间范围3中.struct QMetaTypeId使用不同的访问权重新声明.有人可以告诉我哪里出错了.

c++ qt qt-signals

4
推荐指数
1
解决办法
4652
查看次数

标签 统计

c++ ×2

qt ×2

qt-signals ×1

signals-slots ×1

templates ×1