2010-08-25 50 views
1

所以我有一個模型,其中一列包含一個國家。但是因爲我想顯示一個組合框來從選項列表中選擇國家,所以我不直接在模型中存儲國家名稱。相反,我將索引值存儲在允許國家的列表中。這允許我在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) 

回答

4

不同的數據模型有不同的item data roles。其中有Qt::DisplayRole,Qt::EditRoleQt::UserRole等等。在這種情況下,您希望顯示與實際數據不同的內容,因此請添加一個新角色,例如Qt::UserRole+1用於您的索引。

然後你希望你的代表在setModelData設置適當的數據:

def setModelData(self, editor, model, index): 
    cbIndex = editor.currentIndex() 
    model.setData(index, cbIndex, Qt.UserRole+1) 
    # we want a nice displayable though 
    model.setData(index, countryIndexToDisplayable(cbIndex), Qt.DisplayRole) 

當然,你會找回在編輯器中設置以類似的方式中的數據:

def setEditorData(self, widget, index): 
    widget.setCurrentIndex(index.data(Qt.UserRole+1)) 

根據您的型號和視圖,您可能可以使用Qt::EditRole,這非常適用於此目的。如果您使用原生類型作爲展示角色,則不需要進行任何自定義繪畫,儘管您可以隨意繪製。

+0

+1傑出,謝謝。我不知道你可以創建用戶定義的角色。我的感覺是,如果您使用一個角色更新數據,模型應該處理更新數據的所有其他角色,但在示例中難以顯示。 – 2010-08-26 09:49:01

+0

小問題,在委託的setModelData方法中,我必須將cbIndex轉換爲QVariant,如下所示:model.setData(index,QVariant(cbIndex),Qt.UserRole + 1)。這是因爲我有一個使用QDataWidgetMapper訪問數據的表單,並且它始終將QVariants發送到模型,我需要保持一致。模型應該總是返回數據並且在Qt本地數據類型中設置數據,而不是Python類型? – 2010-08-26 13:02:26

+0

@Simon - 我的首選是擁有豐富的模型,代表您正在使用的域的詞彙表。所以我希望有一個名爲'setCountry'的方法,它有一個幫助器將索引轉換爲一個國家。我喜歡創建一個不是'QAbstractItemModel'的豐富模型,而是我可以輕鬆地在GUI模型中委託的模型。如果我不這樣做,我只是在'QAbstractItemModel'上創建訪問器來提供更豐富的API。 RE:QVariant(cbIndex),因爲我已經完成了任何PyQt,並且我認爲它會自動轉換,就像在C++中一樣。 – 2010-08-26 15:27:27

相關問題