2
我使用自定義代理來在我的QTableView中顯示組合框的列。 所有組合框的值都是相同的,所以它不是真正的人口部分給我帶來麻煩。從QTableView中自定義代表組合框的選定項目
我希望它們顯示爲選定的項目,我可以從數據庫中檢索到一些值。我可以從代理訪問數據庫,但爲了發送我的請求,我需要comboBox的行。
所以我想我的問題是:你如何迭代表中的所有行,並從自定義委託內部執行一些操作?
如果它可以幫助這裏是我的自定義委託類:
class ComboBoxDelegate(QtGui.QItemDelegate):
def __init__(self, parent, itemslist):
QtGui.QItemDelegate.__init__(self, parent)
self.itemslist = itemslist
self.parent = parent
def paint(self, painter, option, index):
# Get Item Data
value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
# value = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
# fill style options with item data
style = QtGui.QApplication.style()
opt = QtGui.QStyleOptionComboBox()
opt.currentText = str(self.itemslist[value])
opt.rect = option.rect
# draw item data as ComboBox
style.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt, painter)
self.parent.openPersistentEditor(index)
def createEditor(self, parent, option, index):
##get the "check" value of the row
# for row in range(self.parent.model.rowCount(self.parent)):
# print row
self.editor = QtGui.QComboBox(parent)
self.editor.addItems(self.itemslist)
self.editor.setCurrentIndex(0)
self.editor.installEventFilter(self)
self.connect(self.editor, QtCore.SIGNAL("currentIndexChanged(int)"), self.editorChanged)
return self.editor
# def setEditorData(self, editor, index):
# value = index.data(QtCore.Qt.DisplayRole).toInt()[0]
# editor.setCurrentIndex(value)
def setEditorData(self, editor, index):
text = self.itemslist[index.data(QtCore.Qt.DisplayRole).toInt()[0]]
pos = self.editor.findText(text)
if pos == -1:
pos = 0
self.editor.setCurrentIndex(pos)
def setModelData(self,editor,model,index):
value = self.editor.currentIndex()
model.setData(index, QtCore.QVariant(value))
def updateEditorGeometry(self, editor, option, index):
self.editor.setGeometry(option.rect)
def editorChanged(self, index):
check = self.editor.itemText(index)
id_seq = self.parent.selectedIndexes[0][0]
update.updateCheckSeq(self.parent.db, id_seq, check)
,我把它叫做fromthe QTableView中是這樣的:
self.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
self.viewport().installEventFilter(self)
self.setItemDelegateForColumn(13,ComboBoxDelegate(self, self.checkValues))
希望我很清楚的,感謝您的關注
那麼我設法在compboBoxes中顯示正確的選定項目。但正如你所說,我正在從代理訪問數據庫,但我真的不知道如何實現你的建議。我仍然有一個問題:當我重新排列tableView時,comboBoxes不會「跟隨」.. – Johanna 2011-05-12 10:17:08
是否可以從模型中調用委託的重繪? – Johanna 2011-05-12 12:15:01
但模型如何知道委託,確定您可以將委託引用傳遞給模型。代表是他們改進表示(即更好的觀點)使模型和委託相互依存會使你的代碼變得脆弱。 – sateesh 2011-05-12 13:37:44