将文本用作 QItemDelegate 和 QTableView 时如何将文本设置为 QLineEdit
How to set text to QLineEdit when it is used as QItemDelegate with QTableView
下面的代码创建了一个 QTableView
。然后创建 QAbstractTableModel
的实例并将其分配给它作为其模型。最后,QItemDelegate
被分配给 QTableView
.
第 0 列正在填充 QLineEdit
。虽然第 1 列填充了 QComboBox
。
但是即使 QLineEdit
被分配了一个自定义文本值,QLineEdit
仍然是空白的。 QComboBox
不会发生这种情况,它正确地获得三个项目:'Somewhere'、'Over'、'The Rainbow'。
要用文本预填充第 0 列 QLineEdits,应该怎么做?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Delegate(QtGui.QItemDelegate):
def __init__(self):
QtGui.QItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
if index.column()==0:
lineedit=QtGui.QLineEdit(parent)
lineedit.setText('Somewhere over the rainbow')
return lineedit
elif index.column()==1:
combo=QtGui.QComboBox(parent)
combo.addItems(['Somewhere','Over','The Rainbow'])
combo.setCurrentIndex(index.row())
return combo
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', None], [2, 'two', None], [3, 'three', None]]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole:
return self.items[row][column]
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())
for row in range(tableModel.rowCount()):
for column in range(tableModel.columnCount()):
index=tableModel.index(row, column)
tableView.openPersistentEditor(index)
tableView.show()
app.exec_()
稍后编辑:
非常感谢 Fabio 的技巧。
下面发布了工作代码。
我们应该实现 Delegate.setEditorData(editor, index)
,而不是在 Delegate.createEditor()
方法中处理赋值。
在 setEditorData
内部,我们可以获得:index.column()
和 index.row()
以及使用 index
参数访问模型使用的 self.items
变量 value = index.model().items[row][column]
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Delegate(QtGui.QItemDelegate):
def __init__(self):
QtGui.QItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
if index.column()==0:
lineedit=QtGui.QLineEdit(parent)
return lineedit
elif index.column()==1:
combo=QtGui.QComboBox(parent)
return combo
def setEditorData(self, editor, index):
row = index.row()
column = index.column()
value = index.model().items[row][column]
if isinstance(editor, QtGui.QComboBox):
editor.addItems(['Somewhere','Over','The Rainbow'])
editor.setCurrentIndex(index.row())
if isinstance(editor, QtGui.QLineEdit):
editor.setText('Somewhere over the rainbow')
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return self.items[row][column]
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())
for row in range(tableModel.rowCount()):
for column in range(tableModel.columnCount()):
index=tableModel.index(row, column)
tableView.openPersistentEditor(index)
tableView.show()
app.exec_()
项目委托通过 setEditorData
方法设置编辑器数据,该方法获取模型数据并将其设置到编辑器。在这种情况下,项目委托获取模型数据(可能为空)并将其设置为 QLineEdit
,因此它设置了一个空字符串。
如果你想在编辑器中初始化数据,你必须重新实现setEditorData
,或者在你的模型中初始化数据。
对于 QComboBox
,项目显示正确,因为 setEditorData
不会更改组合框的项目。通常,您必须重新实现 setEditorData
以根据模型数据设置组合框的当前索引。
我建议阅读文档:Model/View Programming and Delegate Classes
下面的代码创建了一个 QTableView
。然后创建 QAbstractTableModel
的实例并将其分配给它作为其模型。最后,QItemDelegate
被分配给 QTableView
.
第 0 列正在填充 QLineEdit
。虽然第 1 列填充了 QComboBox
。
但是即使 QLineEdit
被分配了一个自定义文本值,QLineEdit
仍然是空白的。 QComboBox
不会发生这种情况,它正确地获得三个项目:'Somewhere'、'Over'、'The Rainbow'。
要用文本预填充第 0 列 QLineEdits,应该怎么做?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Delegate(QtGui.QItemDelegate):
def __init__(self):
QtGui.QItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
if index.column()==0:
lineedit=QtGui.QLineEdit(parent)
lineedit.setText('Somewhere over the rainbow')
return lineedit
elif index.column()==1:
combo=QtGui.QComboBox(parent)
combo.addItems(['Somewhere','Over','The Rainbow'])
combo.setCurrentIndex(index.row())
return combo
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', None], [2, 'two', None], [3, 'three', None]]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole:
return self.items[row][column]
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())
for row in range(tableModel.rowCount()):
for column in range(tableModel.columnCount()):
index=tableModel.index(row, column)
tableView.openPersistentEditor(index)
tableView.show()
app.exec_()
稍后编辑:
非常感谢 Fabio 的技巧。
下面发布了工作代码。
我们应该实现 Delegate.setEditorData(editor, index)
,而不是在 Delegate.createEditor()
方法中处理赋值。
在 setEditorData
内部,我们可以获得:index.column()
和 index.row()
以及使用 index
参数访问模型使用的 self.items
变量 value = index.model().items[row][column]
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Delegate(QtGui.QItemDelegate):
def __init__(self):
QtGui.QItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
if index.column()==0:
lineedit=QtGui.QLineEdit(parent)
return lineedit
elif index.column()==1:
combo=QtGui.QComboBox(parent)
return combo
def setEditorData(self, editor, index):
row = index.row()
column = index.column()
value = index.model().items[row][column]
if isinstance(editor, QtGui.QComboBox):
editor.addItems(['Somewhere','Over','The Rainbow'])
editor.setCurrentIndex(index.row())
if isinstance(editor, QtGui.QLineEdit):
editor.setText('Somewhere over the rainbow')
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
row = index.row()
column = index.column()
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return self.items[row][column]
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())
for row in range(tableModel.rowCount()):
for column in range(tableModel.columnCount()):
index=tableModel.index(row, column)
tableView.openPersistentEditor(index)
tableView.show()
app.exec_()
项目委托通过 setEditorData
方法设置编辑器数据,该方法获取模型数据并将其设置到编辑器。在这种情况下,项目委托获取模型数据(可能为空)并将其设置为 QLineEdit
,因此它设置了一个空字符串。
如果你想在编辑器中初始化数据,你必须重新实现setEditorData
,或者在你的模型中初始化数据。
对于 QComboBox
,项目显示正确,因为 setEditorData
不会更改组合框的项目。通常,您必须重新实现 setEditorData
以根据模型数据设置组合框的当前索引。
我建议阅读文档:Model/View Programming and Delegate Classes