繁体   English   中英

我想将Qt QML Combobox设置为PyQt5对象属性

[英]I want to set a Qt QML Combobox to a PyQt5 object property

我正在编写一个小程序,它使用Qt5 QML作为GUI层,使用Python3-PyQt5来实现数据模型。

我现在想在QML中显示一个ComboBox并将其模型设置为枚举列表。 我如何将枚举作为python类的属性导出,以便我可以在QML中引用它?

我最好用QML写这个:

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

这是我的解决方案,对我来说足够好。 在python代码中,我有以下内容:

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
}

您应该将枚举放在从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项目如下时,您将拥有一个包含枚举键和值的ComboBox

ComboBox {
  model: myModel
  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM