2013-06-06 7 views
9

के साथ enums का उपयोग करके मेरे पास पैरामीटर का एक सेट है जिसे मुझे संपादित करने की आवश्यकता है, जिनमें से कुछ enums हैं।क्यूटी: QComboBox

आज तक, मैं क्यूएसपीनबॉक्स में enum के कच्चे मूल्य का उपयोग करता हूं, जो बिल्कुल अनुकूल नहीं है।

my parameter editor

उदाहरण के लिए, E_Range इन के साथ एक combobox पेश किया जा सकता है:

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; 

मैं उपयोग के बारे में कुछ भी नहीं मिला आप खुद मूल्यों को याद करने और सेट अच्छा एक है एक QComboBox में एक enum। क्या यह संभव है?
यदि हां, तो क्या कदम हैं?

मेरा मतलब है, मुझे लगता है कि मुझे क्यूटी के माध्यम से enum घोषित करना होगा ताकि यह Qt metaobject के साथ "गणना योग्य" हो। लेकिन वहां से, मुझे यकीन नहीं है।

+0

आप इस कोशिश की? http: //www.qtcentre।संगठन/धागे/49122-जॉइनिंग-साथ-ए-क्यूम्बोबॉक्स-क्यूस्ट्रिंगलिस्ट-एंड-एनम – NightWhisper

+0

मैंने इस पर ठोकर खाई लेकिन विधि से संतुष्ट नहीं था: मुझे लगता है कि यह बहुत विशिष्ट तरीका है। मैं सामान्य घटक रखना चाहता हूं। – Gui13

उत्तर

11

बेशक आप हमेशा मूल्यों को हार्डकोड कर सकते हैं, लेकिन जैसे ही आप उस enum को संशोधित करते हैं, आपको अपने combobox को पॉप करने वाले कोड को बदलने के लिए याद रखना होगा।

मेरा मतलब है, मुझे लगता है कि मुझे क्यूटी के माध्यम से enum घोषित करना होगा ताकि यह Qt metaobject के साथ "गणना योग्य" हो। लेकिन वहां से, मुझे यकीन नहीं है।

वास्तव में, आत्मनिरीक्षण का उपयोग करना एक स्मार्ट चाल है। Q_ENUMS के साथ enum चिह्नित करें और Q_OBJECT मैक्रो जोड़ें। तब:

  • पकड़ो Class::staticMetaObject()
  • के माध्यम से अपने वर्ग 'metaobject के माध्यम से QMetaObject::indexOfEnumerator() + QMetaObject::enumerator()
  • अपने enum के लिए QMetaEnum जाओ QMetaEnum::keyCount() के माध्यम से चाबियों का नंबर प्राप्त करें, और कुंजी नाम उनके संबंधित मान रही पुनरावृति (QMetaEnum::key(), QMetaEnum::keyToValue())।

इस आप प्रोग्राम आपके बता गया पॉप्युलेट करने के लिए सक्षम हो जाएगा के साथ (विशिष्ट पैटर्न, cf QComboBox के उपयोगकर्ता के लिए दृश्यमान स्ट्रिंग और अपने "आइटम डेटा" के रूप में संबंधित मान के रूप में enum कुंजी जोड़ने के लिए है प्रलेखन)

+1

मुझे आश्चर्य है कि क्यूटी को QComboBox की मानक विधि के रूप में शामिल नहीं किया गया है ?! – Gui13

+2

क्योंकि यह करना आसान है, और वास्तव में सामान्य उद्देश्य के लिए काफी विशिष्ट है। लेकिन मैं आपको आगे बढ़ने के लिए प्रोत्साहित करता हूं और [पैच सबमिट करता हूं] (http://qt-project.org/contribute), फिर मुझे विश्वास दिलाएं कि यह इसके लायक है :-) – peppe

+0

यदि किसी के जैसा, मुझे इस पर संदेह है कि कैसे मेटाबोजेक्ट का उपयोग करें, क्यूस्ट्रिंग [यहां] (https://srikanthsombhatla.wordpress.com/2010/08/13/convert-enum-to-qstring/) –

5

एक अन्य तरीके से, एक QMap का उपयोग कर:।

घोषित करने और enum मूल्यों आप अपने कॉम्बो बॉक्स में चाहते हैं के साथ एक QMap<QString, QSomeObject::SomeEnum> भरें, फिर QMap की कुंजियों की एक QStringList के साथ अपने QComboBox भरें।

अंततः QComboBox की currentText() विधि के साथ संयोजन में QMap के मान() विधि का उपयोग करके उपयोगकर्ता द्वारा चुने गए enum मान प्राप्त करें।

QSerialPort वर्ग और 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

पर एनम वैल्यू को कन्वर्ट करने के तरीके पर एक अच्छा ट्यूटोरियल है। इस दृष्टिकोण का एक बड़ा प्रशंसक क्योंकि वास्तविक enum चर नाम उपयोगकर्ता प्रदर्शन के लिए एक गरीब उम्मीदवार हो सकता है। उदाहरण के लिए, मेरे चर के अंडरस्कोर हैं, लेकिन उपयोगकर्ता कोई बदसूरत अंडरस्कोर नहीं चाहते हैं। – Mikhail

संबंधित मुद्दे