2015-02-14 8 views
5

पर सेट करना चाहता हूं, मैं एक छोटा प्रोग्राम लिख रहा हूं जो डेटा मॉडल को लागू करने के लिए QI5 QML का उपयोग GUI परत और पायथन 3-PyQt5 के रूप में करता है।मैं एक QQ QML Combobox को एक PyQt5 ऑब्जेक्ट प्रॉपर्टी

अब मैं QML में ComboBox प्रदर्शित करना चाहता हूं और इसके मॉडल को enums की सूची में सेट करना चाहता हूं। मैं पाइथन कक्षा की संपत्ति के रूप में enum निर्यात कैसे करूं ताकि मैं इसे QML में संदर्भित कर सकूं?

अधिमानतः मैं QML में यह लिख होगा:

ComboBox { 
    model: mymodel.car_manufacturers 
    onCurrentIndexChanged: mymodel.selected_manufacturer = currentIndex 
} 

उत्तर

2

यहां है मेरा समाधान जो मेरे लिए काफी अच्छा काम करता है।

class CarManufacturers(enum.Enum): 
    BMW, Mercedes = range(2) 

mfcChanged = pyqtSignal() 

@pyqtProperty('QStringList', constant=True) 
def carmanufacturers(self): 
    return [mfc.name for mfc in CarManufacturers] 

@pyqtProperty('QString', notify=mfcChanged) 
def mfc(self): 
    return str(CarManufacturers[self._mfc].value) 

@modus.setter 
def mfc(self, mfc): 
    print('mfc changed to %s' % mfc) 
    if self._mfc != CarManufacturers(int(mfc)).name: 
     self._mfc = CarManufacturers(int(mfc)).name 
     self.mfcChanged.emit() 

और QML में मेरे पास है: अजगर कोड में मैं निम्नलिखित है

ComboBox { 
    model: myModel.carmanufacturers 
    currentIndex: myModel.mfc 
    onCurrentIndexChanged: myModel.mfc = currentIndex 
} 
0

आप अपने वर्ग कि QObject से निकला में enum रखना चाहिए। इसके अलावा इसे Q_ENUMS मैक्रो के साथ चिह्नित किया जाना चाहिए। इसके बाद आप कक्षा के मेटाबोजेक्ट से अपने enum के QMetaEnum ले सकते हैं, कुंजी और उनके मानों के माध्यम से पुनरावृत्त कर सकते हैं और प्रत्येक को QStringList पर जोड़ सकते हैं।

C++ जैसे कि यह होगा:

MyClass myObj; 
const QMetaObject* metaObj = myObj.metaObject(); 
QMetaEnum enumType = metaObj->enumerator(metaObj->indexOfEnumerator("MyEnumType")); 

QStringList list; 
for(int i=0; i < enumType.keyCount(); ++i) 
{ 
    QString item = QString::fromLatin1(enumType.key(i)) + " " 
       + QString::number(enumType.value(i)); 
    list.append(item); 
} 

अब आप QQmlContext::setContextProperty उपयोग कर सकते हैं QML को स्ट्रिंग सूची का पर्दाफाश करने के:

QQmlContext *context = engine.rootContext(); 
context->setContextProperty("myModel", QVariant::fromValue(list)); 

आप एक कॉम्बो बॉक्स enum कुंजी वाला होता है और मान जब ComboBox आइटम जैसा है:

ComboBox { 
    model: myModel 
    ... 
} 
+0

आपके प्रयास के लिए धन्यवाद, लेकिन मुझे लगता है मैं और अधिक प्रत्यक्ष PyQt संकेत की जरूरत है। एक बार अब QStringList प्रकार अब नहीं है। और मेरी दूसरी समस्या यह है कि मेरे पास केवल एक मुख्य मॉडल पंजीकृत है जिसे तत्काल एक क्यूएमएल फ़ाइल द्वारा तत्काल किया जाता है जिसे लोडर द्वारा खींचा जाता है। तो मैं अब लगता है कि रनटाइम पर qml इंजन नहीं मिल सकता है। क्या यह setContextProperty कॉल के बिना किया जा सकता है? – Fabian

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