2016-04-07 36 views
1

我特林在非基于QT类使用Q_ENUMS非Qt类使用Q_ENUMS

#include <QMetaType> 
#include <QObject> 

class SignalSpec: public QObject 
{ 
    Q_ENUMS(Modulations) 
public: 
    enum Modulations { PSK , QAM , FSK, PAM }; 

    SignalSpec(); 

private: 
    Q_DISABLE_COPY(SignalSpec) 
}; 

Q_DECLARE_METATYPE(SignalSpec::Modulations); 

但我发现了这个错误在编译行Q_DISABLE_COPY(SignalSpec)

​​

问题是什么?
如何在基于非QT的课程中使用Q_ENUMS

编辑
我只是从创建一个对象:

SignalSpec *s=new SignalSpec(); 
s->setModulation(ui->modulationCombo->currentData().value<SignalSpec::Modulations>()); 

我也有这个类的一个QVector:

QHash<QString,QVector<SignalSpec> > signalConfig; 
+4

你必须有更多的代码,你没有显示。该错误在调用复制构造函数时触发。它与枚举无关。 – Pemdas

+0

@Pemdas:是的,我知道错误不是枚举,我只是继承QObject才能够使用'Q_ENUMS';错误是在这个文件和那一行(即使我没有从那个类创建一个对象,但我仍然有错误!),但是我添加了我也在使用的部分;谢谢 – RYN

+0

我想知道是否添加Q_OBJECT宏使这项工作。 – Pemdas

回答

4
  1. 你不需要Q_DISABLE_COPY,因为拷贝构造函数已在基类QObject中被禁用。
  2. 在Qt 5.5及更高版本中,您可以使用Q_ENUM而不是Q_ENUMS。它提供了更多功能,但需要在枚举声明之后放置。
  3. 你可以使用Q_GADGET如果你不想sublass QObject,但仅限于类无信号,插槽和Q_INVOKABLE方法
+0

without Q_DISABLE_COPY我得到''QObject :: QObject(const QObject&)'是private'! – RYN

+2

@RYN,因为它被删除。你不能构造一个不可拷贝类实例的向量,但是你可以使用指针向量(或智能指针)到你的'SignalSpec'。另外,你可以使用'Q_GADGET'并避免继承'QObject'。 –