我已经阅读了很多有关此问题的帖子,但我找不到这个答案
在我的Qt应用程序中,我使用QSignalSpy来捕获信号。它为其中一个参数提供了用户定义的数据类型。要捕获这样的参数,我必须首先使用QMetaType和使用宏Q_DECLARE_METATYPE向Qt注册该数据类型。它说
只要它提供了一个公共默认构造函数,一个公共复制构造函数和一个公共析构函数,这个宏就会使QMetaType知道类型Type。需要在QVariant中使用Type类型作为自定义类型。
问题:我有一个CustomData类,只定义了构造函数。现在,除非我显式声明析构函数和复制构造函数,否则Qt会抛出错误。我想使用C ++提供的隐式析构函数和复制构造函数。对于析构函数,我使用了
~CustomData() = default;
使用默认的析构函数。但我不能对复制构造函数使用类似的语句。将使用
CustomData( const CustomData& ) {};
调用隐式复制构造函数?
(我这样做是因为我想保留隐式复制构造函数的行为) 提前谢谢。
CustomData类如下所示
#include <QMetaType>
#include <QString>
class CustomData : public QObject
{
Q_OBJECT
public:
CustomData(QObject *parent = NULL);
~CustomData() = default; // I added this line
//Will the next line call the implicit copy constructor?
CustomData(const CustomData&) {}; //I added this line
enum CustomMode {mode1, mode2, mode3};
void somePublicMethod();
signals:
void completed(CustomData *data);
private slots:
void customComplete();
private:
CustomMode _mode;
QString _path;
CustomData *_chained;
};
Q_DECLARE_METATYPE(CustomData)
答案 0 :(得分:1)
总之 - 没关系。您的实施不会(希望)导致任何影响。
如果您浏览Qt documentation,则说明如下
QObject既没有复制构造函数也没有赋值运算符。这是设计的。实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中。实际上,从QObject(直接或间接)派生的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的。
完成此操作 - Q_DISABLE_COPY()。
这表明你使用指针来完成工作。请看这个讨论如何在Qt中复制对象的thread。
答案 1 :(得分:1)
实际上,给定代码在Visual Studio 2013上编译时没有错误。但是,如果信号的签名更改为void completed(CustomData data);
,则会发生类似的错误。由于您尚未指定编译器,但我认为它是gcc / clang,您可能会收到错误,因为模板处理有所不同。如果是这样,那么错误很可能是由Q_DECLARE_METATYPE(CustomData)
引起的,因为它试图在里面生成复制构造函数。将其更改为Q_DECLARE_METATYPE(CustomData*)
(因为这是您真正需要的,您排队CustomData*
而不是CustomData
的参数,至少在给定的示例中)如果您确实没有信号按值发送CustomData
个实例,您应该没问题。
此外,如果您通过指针传递对象,则应使用Q_DECLARE_METATYPE(CustomData*)
。但我建议将其传递给std::unique_ptr
或std::shared_ptr
以防止内存泄漏。