2013-06-06 13 views
9

Ho un set di parametri che devo modificare, alcuni dei quali sono enumerazioni.Qt: uso di enumerazioni con QComboBox

A partire da oggi, utilizzo il valore grezzo dell'enumerazione in un QSpinBox, che non è affatto amichevole. Bisogna ricordare i valori da soli e impostare quello buono:

my parameter editor

Per esempio, potrebbe E_Range presenterà una casella combinata con questi:

typedef enum { 
    ERANGE_2_5 = 0, /*!< +/- 2.5 V */ 
    ERANGE_5 = 1, /*!< +/- 5 V */ 
    ERANGE_10 = 2, /*!< +/- 10 V */ 
    ERANGE_AUTO = 3 /*!< Auto range */ 
} TVoltageRange_e; 

non ho trovato nulla su come utilizzare un enum in un QComboBox. È possibile?
Se sì, quali sono i passaggi?

Voglio dire, suppongo che dovrò dichiarare l'enum tramite Qt in modo che sia "enumerabile" con il metaoggetto Qt. Ma da lì, non ne sono sicuro.

+0

Hai provato questo? http: //www.qtcentre.org/threads/49122-Joining-together-a-QComboBox-QStringList-and-enum – NightWhisper

+0

Mi sono imbattuto in questo, ma non ero soddisfatto del metodo: penso che sia troppo specifico. Mi piacerebbe avere componenti generici. – Gui13

risposta

11

Ovviamente è sempre possibile eseguire l'hardcode dei valori, ma non appena modifichi l'enumerazione devi ricordare di modificare il codice che popola la tua casella combinata.

Voglio dire, suppongo che dovrò dichiarare l'enum tramite Qt in modo che sia "enumerabile" con il metaoggetto Qt. Ma da lì, non ne sono sicuro.

Esattamente, utilizzare l'introspezione è una mossa intelligente. Segna l'enum con Q_ENUMS e aggiungi la macro Q_OBJECT. Poi:

  • Prendi il tuo metaobject classe via Class::staticMetaObject()
  • Prendi il QMetaEnum per la vostra enum tramite QMetaObject::indexOfEnumerator() + QMetaObject::enumerator()
  • Prendi il numero di tasti tramite QMetaEnum::keyCount(), e iterare ottenere i nomi chiave ei corrispondenti valori (QMetaEnum::key(), QMetaEnum::keyToValue()).

Con questo sarete in grado di popolare il combobox di programmazione (il modello tipico è quello di aggiungere la chiave enum come stringa visibile all'utente e il corrispondente valore come il suo "dati voce", cf. QComboBox 's documentazione)

+1

Sono sorpreso che Qt non lo includa come metodo standard di QComboBox ?! – Gui13

+2

Perché è facile da fare e abbastanza specifico per essere veramente di uso generale. Ma vi incoraggio ad andare avanti e [presentare una patch] (http://qt-project.org/contribute), poi convincermi che ne vale la pena :-) – peppe

+0

Nel caso qualcuno, come me, abbia dei dubbi su come usa metaobject, c'è un bel tutorial su come convertire un valore enum in Qstring [qui] (https://srikanthsombhatla.wordpress.com/2010/08/13/convert-enum-to-qstring/) –

5

un altro modo, utilizzando un QMap:.

dichiarare e riempire un QMap<QString, QSomeObject::SomeEnum> con i valori enum che volete nella vostra casella combinata, quindi riempire il vostro QComboBox con un QStringList di chiavi del QMap.

Eventualmente ottenere il valore enum selezionato dall'utente utilizzando il metodo value() di QMap in combinazione con il metodo currentText() di QComboBox.

un esempio con il QSerialPort classe e la QSerialPort :: FlowControl enum:

QMap<QString, QSerialPort::FlowControl> *flowControlOptions = new QMap<QString, QSerialPort::FlowControl>; 

flowControlOptions->insert("None",QSerialPort::NoFlowControl); 
flowControlOptions->insert("Software",QSerialPort::SoftwareControl); 
flowControlOptions->insert("Hardware",QSerialPort::HardwareControl); 

QComboBox *flowControl = new QComboBox; 

flowControl->addItems(QStringList(flowControlOptions->keys())); 
flowControl->setCurrentIndex(2); 

QSerialPort *sPort = new QSerialPort; 

// Some code after... The user has selected an option 

sPort->setFlowControl(flowControlOptions->value(flowControl->currentText())); 
+0

I'm un fan più grande di questo approccio perché il nome della variabile enum effettiva potrebbe essere un candidato scarso per la visualizzazione dell'utente. Ad esempio, le mie variabili hanno caratteri di sottolineatura, ma gli utenti non vogliono brutti caratteri di sottolineatura. – Mikhail