以下是自定义委托QComboBox
的示例。当我做出选择时,点击(或以QComboBox
失去焦点),然后选择TAB(获得焦点),我将丢失原始选择。例如,如果我选择"Item 2"
,请使用以下代码,点击,然后选择TAB,选择将返回"Item 1."
如何保持选择?
我假设发生此问题是因为我每次初始化时都会在addItem()
TheEditor
类中使用QComboBox
,但我不太确定我应该如何处理此方法。我是应该在TheEditor
EditDelegate
类中进行__ init __
初始化,以便它只被初始化一次,而不是每次都被重点化?我怎么能这样做呢?
import sys
from PySide import QtCore, QtGui, QtSql
class EditDelegate(QtGui.QStyledItemDelegate):
def __init__(self, parent=None):
super(EditDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
editor = TheEditor(parent)
return editor
class TheEditor(QtGui.QComboBox):
def __init__(self, parent=None):
super(TheEditor, self).__init__(parent)
self.addItem("Item 1")
self.addItem("Item 2")
self.addItem("Item 3")
self.setEditable(True)
class TheTable(QtGui.QTableWidget):
def __init__(self, columns, parent=None):
super(TheTable, self).__init__(parent)
self.setItemDelegate(EditDelegate())
self.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
self.setColumnCount(1)
self.setRowCount(1)
self.setHorizontalHeaderLabels(["QCombo"])
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setCentralWidget(TheTable(self))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()
app.exec_()
注意:PySide v1.2.0
答案 0 :(得分:0)
正如QT(Model/View Programming)简介所说
请注意,我们不需要保留指向编辑器小部件的指针,因为视图负责在不再需要时销毁它。
编辑器是临时对象。但您可以尝试从旧编辑器中捕获选择并将其传递给新编辑器,如下所示:
class EditDelegate(QtGui.QStyledItemDelegate):
editorsLastIndex=None
def __init__(self, parent=None):
super(EditDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
editor = TheEditor(parent)
if self.editorsLastIndex != None:
editor.setCurrentIndex(self.editorsLastIndex)
editor.currentIndexChanged.connect(self.editorIndexChanged)
return editor
def editorIndexChanged(self, index):
self.editorsLastIndex = index