繁体   English   中英

在QTableView中用作QItemDelegate时如何设置文本到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的the俩。

工作代码如下。

而不是在Delegate.createEditor()方法内部处理值分配,我们应该改为实现Delegate.setEditorData(editor, index) setEditorData内部,我们可以同时获取: index.column()index.row() ,以及使用index参数value = index.model().items[row][column]访问模型使用的self.items变量

在此处输入图片说明

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编程委托类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM