2015-02-14 29 views
5

Piszę mały program, który używa Qt5 QML jako warstwy GUI i Python3-PyQt5 do implementacji modelu danych.Chcę ustawić Combobox Qt QML na właściwość obiektu PyQt5

Chcę teraz wyświetlić w QML wersję ComboBox i ustawić jej model na listę wyliczeń. W jaki sposób wyeksportować wyliczenie jako właściwość klasy Python, tak aby móc odwoływać się do niej w QML?

Korzystnie chciałbym napisać to w QML:

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

Odpowiedz

2

Oto moje rozwiązanie, które działa wystarczająco dobrze dla mnie. W kodzie Pythona Mam następujący:

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() 

aw QML mam:

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

Należy umieścić enum w swojej klasie, która wywodzi się z QObject. Powinien również zostać oznaczony makrem Q_ENUMS. Następnie możesz pobrać QMetaEnum swojego wyliczenia z metaobiektu klasy, iterować za pomocą kluczy i ich wartości i dodawać je do QStringList.

w C++ byłoby jak:

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

Teraz można użyć QQmlContext::setContextProperty wystawiać listy ciągu do QML:

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

to masz combo-box zawierający klucz enum i wartości, gdy pozycja ComboBox jest podobna:

ComboBox { 
    model: myModel 
    ... 
} 
+0

Dzięki za twój wysiłek, ale myślę, że trzeba bardziej bezpośrednie wskazówki pyqt. Po raz kolejny nie ma już typu QStringList. Drugim problemem jest to, że mam zarejestrowany tylko główny model, który jest następnie tworzony przez plik QML, który jest ładowany przez program ładujący. Więc nie mogę już dostać się do silnika qml w czasie pracy. Czy można to zrobić bez wywołania setContextProperty? – Fabian