2015-02-14 5 views
5

Я пишу небольшую программу, которая использует Qt5 QML в качестве уровня GUI и Python3-PyQt5 для реализации модели данных.Я хочу установить Qt QML Combobox в свойство объекта PyQt5

Теперь я хочу показать ComboBox в QML и установить его модель в список перечислений. Как я могу экспортировать enum как свойство класса python, чтобы я мог ссылаться на него в 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. Также он должен быть отмечен макросом Q_ENUMS. Затем вы можете взять 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)); 

Вы бы иметь комбо-бокс, содержащий ключ перечислимого и значениями, когда пункт выглядит следующим образом:

ComboBox { 
    model: myModel 
    ... 
} 
+0

Спасибо за ваши усилия, но я думаю, мне нужно больше прямые намеки PyQt. На этот раз больше нет типа QStringList. И моя вторая проблема заключается в том, что у меня есть только зарегистрированная основная модель, которая затем создается экземпляром QML-файла, который загружается загрузчиком. Я думаю, что я не могу добраться до qml-движка во время выполнения. Можно ли это сделать без вызова setContextProperty? – Fabian