2016-04-07 38 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'。 –