2016-04-07 7 views
1

Ich bin Tring Q_ENUMS in einer nicht-QT-basierte Klasse zu verwenden:Mit Q_ENUMS in nicht-QT Klassen

#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); 

Aber ich immer diese Fehlermeldung auf der Kompilierung für die Linie Q_DISABLE_COPY(SignalSpec):

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

Was ist das Problem? Wie kann ich Q_ENUMS in einer nicht QT-basierten Klasse verwenden?

bearbeiten:
Ich bin ein Objekt aus es nur zu schaffen:

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

Ich habe auch eine QVector dieser Klasse:

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

Sie müssen mehr Code haben Sie zeigen sich nicht. Dieser Fehler wird ausgelöst, wenn ein Kopierkonstruktor aufgerufen wird. Es hat nichts mit Enums zu tun. – Pemdas

+0

@Pemdas: Ja Ich weiß, dass der Fehler nicht für Enums ist Ich habe gerade das QObject geerbt, nur um 'Q_ENUMS' zu verwenden; Der Fehler ist in dieser Datei und in dieser Zeile (selbst wenn ich kein Objekt aus dieser Klasse erstelle, habe ich immer noch den Fehler!), Aber ich habe den Abschnitt hinzugefügt, den ich auch benutze; danke – RYN

+0

Ich frage mich, ob das Hinzufügen des Q_OBJECT-Makros das funktioniert. – Pemdas

Antwort

4
  1. Sie nicht brauchen, Q_DISABLE_COPY, da Kopierkonstruktoren in der Basisklasse QObject bereits deaktiviert sind.
  2. können Sie Q_ENUM anstelle von Q_ENUMS in Qt 5.5 und höher verwenden. Es bietet mehr Funktionalität, muss jedoch nach der Deklaration der Enumeration platziert werden.
  3. können Sie Q_GADGET verwenden, wenn Sie sublass QObject nicht wollen, sondern nur für die Klassen ohne Signal, Slots und Q_INVOKABLE Methoden
+0

ohne Q_DISABLE_COPY Ich bekomme '' QObject :: QObject (const QObject &) 'ist privat'! – RYN

+2

@ RYN, weil es gelöscht wird. Sie können einen Vektor nicht kopierbarer Klasseninstanzen nicht konstruieren, aber Sie können einen Vektor von Zeigern (oder intelligenten Zeigern) für Ihre 'SignalSpec' verwenden. Außerdem können Sie 'Q_GADGET' verwenden und das Unterklassen' QObject' vermeiden. –