所以我有一個模型,其中一列包含一個國家。但是因爲我想顯示一個組合框來從選項列表中選擇國家,所以我不直接在模型中存儲國家名稱。相反,我將索引值存儲在允許國家的列表中。這允許我在Qt文檔中建議的表單視圖中使用QComboBox
。問題是我也有一個表視圖,表視圖顯示索引整數,而不是國家名稱。我建立了一個QStyledItemDelegate
並實施createEditor
,所以如果你點擊世界單元格,它會彈出ComboBox
,但是當你不編輯國家時,你會看到索引值。在QStyledItemDelegate中顯示QComboBox文本而不是索引值
我是解決方案的一部分。我已經實現了一個繪製方法來完成這個工作,但是它顯示的是偏移量正確的位置,我不知道如何讓它正確顯示。我認爲在render方法中option.rect.topLeft()
是錯誤的,但我無法弄清楚如何正確設置繪圖。
def paint(self, painter, option, index):
if index.column() == COUNTRY:
painter.save()
countryRef, ok = inex.data().toInt()
countryStr = country_list[countryRef]
widget = QLineEdit()
widget.setGeometry(option.rect)
widget.setText(countryStr)
widget.render(painter, option.rect.topLeft())
painter.store()
else:
QStylyedItemDelegate.paint(self, painter, option, index)
+1傑出,謝謝。我不知道你可以創建用戶定義的角色。我的感覺是,如果您使用一個角色更新數據,模型應該處理更新數據的所有其他角色,但在示例中難以顯示。 – 2010-08-26 09:49:01
小問題,在委託的setModelData方法中,我必須將cbIndex轉換爲QVariant,如下所示:model.setData(index,QVariant(cbIndex),Qt.UserRole + 1)。這是因爲我有一個使用QDataWidgetMapper訪問數據的表單,並且它始終將QVariants發送到模型,我需要保持一致。模型應該總是返回數據並且在Qt本地數據類型中設置數據,而不是Python類型? – 2010-08-26 13:02:26
@Simon - 我的首選是擁有豐富的模型,代表您正在使用的域的詞彙表。所以我希望有一個名爲'setCountry'的方法,它有一個幫助器將索引轉換爲一個國家。我喜歡創建一個不是'QAbstractItemModel'的豐富模型,而是我可以輕鬆地在GUI模型中委託的模型。如果我不這樣做,我只是在'QAbstractItemModel'上創建訪問器來提供更豐富的API。 RE:QVariant(cbIndex),因爲我已經完成了任何PyQt,並且我認爲它會自動轉換,就像在C++中一樣。 – 2010-08-26 15:27:27