我想将 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 class 的 属性 以便我可以在 QML 中引用它?
我最好用 QML 写这个:
ComboBox {
model: mymodel.car_manufacturers
onCurrentIndexChanged: mymodel.selected_manufacturer = currentIndex
}
您应该将枚举放入派生自 QObject
的 class 中。它也应该用 Q_ENUMS
宏标记。然后,您可以从 class 的元对象中获取枚举的 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 {
model: myModel
...
}
这是我的解决方案,对我来说效果很好。
在 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
}
我正在编写一个小程序,它使用 Qt5 QML 作为 GUI 层和 Python3-PyQt5 来实现数据模型。
我现在想在 QML 中显示一个 ComboBox
并将其模型设置为枚举列表。我如何将枚举导出为 python class 的 属性 以便我可以在 QML 中引用它?
我最好用 QML 写这个:
ComboBox {
model: mymodel.car_manufacturers
onCurrentIndexChanged: mymodel.selected_manufacturer = currentIndex
}
您应该将枚举放入派生自 QObject
的 class 中。它也应该用 Q_ENUMS
宏标记。然后,您可以从 class 的元对象中获取枚举的 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 {
model: myModel
...
}
这是我的解决方案,对我来说效果很好。 在 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
}