2016-04-07 17 views
1

Ben olmayan bir QT tabanlı sınıfta Q_ENUMS kullanmaya tring ediyorum:kullanma 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); 

Ama hat Q_DISABLE_COPY(SignalSpec) için derleme bu hatayı alıyorum:

error: 'SignalSpec::SignalSpec(const SignalSpec&)' is private 
    Q_DISABLE_COPY(SignalSpec) 
        ^

Sorun nedir?
Q_ENUMS'u QT tabanlı olmayan bir sınıfta nasıl kullanabilirim?

Düzenleme:

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

için Sen göstermedi fazla kodu olması gerekir. Bu hata, bir kopya kurucusu çağrıldığında tetiklenir. Enumlarla ilgisi yok. – Pemdas

+0

@Pemdas: Evet, hata enumlar için değil, QObject 'i sadece Q_ENUMS kullanabilmek için miras aldığını biliyorum; Hata bu dosyada ve bu satırda (o sınıftan bir Nesne oluşturmama rağmen hala hatam var!) Ama bunu da kullandığım bölümü ekledim; teşekkürler – RYN

+0

Q_OBJECT makrosunun eklenmesi bu işe yarar mı acaba? – Pemdas

cevap

4
  1. ihtiyacınız yoktur: Ben de bu sınıfın bir QVector sahip

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

    : Ben sadece bir nesne oluşturuyorum
    Q_DISABLE_COPY, çünkü kopya yapıcılar QObject temel sınıfında devre dışı bırakılmıştır.

  2. Qt 5.5 ve sonrası Q_ENUMS yerine Q_ENUM'u kullanabilirsiniz. Daha fazla işlevsellik sağlar, ancak enum beyanından sonra yerleştirilmelidir.
  3. Eğer QObject sublass istemiyorsanız eğer Q_GADGET kullanabilirsiniz, ancak sadece sinyal, yuvaları olmadan sınıflar ve Q_INVOKABLE yöntemlerle
+0

'QObject :: QObject (const QObject &)' özel 'var'! – RYN

+2

@RYN, çünkü silinir. Kopyalanamayan sınıf örneklerinin bir vektörünü oluşturamazsınız, ancak SignalSpec'inize işaretçi (veya akıllı işaretçiler) vektörünü kullanabilirsiniz. Ayrıca, 'Q_GADGET' özelliğini kullanabilir ve "QObject" alt sınıfından kaçınabilirsiniz. –