2015-02-14 17 views
5

Tôi đang viết một chương trình nhỏ sử dụng Qt5 QML làm lớp GUI và Python3-PyQt5 để triển khai mô hình dữ liệu.Tôi muốn đặt Qt QML Combobox thành thuộc tính đối tượng PyQt5

Bây giờ tôi muốn hiển thị ComboBox trong QML và đặt mô hình của nó thành danh sách các enums. Làm thế nào tôi sẽ xuất khẩu enum như là một tài sản của lớp python để tôi có thể tham khảo nó trong QML?

Tốt Tôi sẽ viết những dòng này trong QML:

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

Trả lời

2

Đây là giải pháp của tôi hoạt động tốt đủ cho tôi. Trong đoạn code python Tôi có những điều sau:

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

và trong QML tôi có:

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

Bạn nên đặt enum trong lớp học của bạn có nguồn gốc từ QObject. Ngoài ra, nó phải được đánh dấu bằng macro Q_ENUMS. Sau đó bạn có thể lấy QMetaEnum của enum của bạn từ metaobject của lớp, lặp qua các khóa và giá trị của chúng và thêm mỗi một vào một số QStringList.

Trong C++ chúng ta sẽ như thế nào:

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

Bây giờ bạn có thể sử dụng QQmlContext::setContextProperty để lộ danh sách các chuỗi để QML:

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

Bạn sẽ có một combo-box chứa khóa enum và các giá trị khi mục ComboBox giống như:

ComboBox { 
    model: myModel 
    ... 
} 
+0

Cám ơn nỗ lực của bạn nhưng tôi đoán tôi cần gợi ý PyQt trực tiếp hơn. Đối với một lần không còn là một loại QStringList nữa. Và vấn đề thứ hai của tôi là tôi chỉ có một mô hình chính được đăng ký và sau đó được khởi tạo bởi một tệp QML được một Trình tải (Loader) kéo vào. Vì vậy, tôi không thể vào động cơ qml khi chạy nữa. Nó có thể được thực hiện mà không cần gọi setContextProperty không? – Fabian

Các vấn đề liên quan