防止在StyledItemDelegate中编辑组合框

问题描述 投票:1回答:1

我正在尝试使当前代码显示的所有内容均不可编辑。

先前的搜索都建议修改模型的flags()函数或使用表的setEditTriggers。我在这段代码中都做到了,但是它们都不起作用。

[通过小部件查看小部件的情况,我可以找到LineEdit和其他控件的只读模式,但不能找到ComboBox的只读模式。因此,我什至不能修改委托以强制执行只读约束,而不是我一定要这样做。

编辑:为了澄清,当我说我希望用户无法“编辑”时,我的意思是他不应该以任何方式更改小部件的状态。例如。他将无法单击组合框(或至少更改当前选定的项目/索引)。

from PyQt5 import QtCore, QtWidgets
import sys


class MyWindow(QtWidgets.QWidget):
    def __init__(self, *args):
        super().__init__(*args)
        tableview = TableView()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(tableview)
        self.setLayout(layout)


class Delegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, model):
        super().__init__()
        self.model = model

    def createEditor(self, parent, option, index):
        widget = QtWidgets.QComboBox(parent)
        widget.addItems(['', 'Cat', 'Dog'])
        return widget

    def setModelData(self, widget, model, index):
        self.model.setData(index, widget.currentIndex())


class Model(QtCore.QAbstractTableModel):
    def __init__(self, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent=parent)
        self.value = 0

    def flags(self, index):
        return QtCore.Qt.ItemIsEnabled

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid() or role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()
        return QtCore.QVariant(self.value)

    def setData(self, index, value, role=QtCore.Qt.EditRole):
        self.value = value
        print("data[{}][{}] = {}".format(index.row(), index.column(), value))
        return True

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 1

    def columnCount(self, parent=QtCore.QModelIndex()):
        return 1


class TableView(QtWidgets.QTableView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.model = Model(self)
        delegate = Delegate(self.model)
        self.setItemDelegate(delegate)
        self.setModel(self.model)
        self.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        for row in range(self.model.rowCount()):
            for column in range(self.model.columnCount()):
                index = self.model.index(row, column)
                self.openPersistentEditor(index)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
python pyqt pyqt5
1个回答
1
投票

说明:

必须澄清一些概念:

  • 用于Qt禁用编辑视图(QListView,QTableView,QTreeView等)或视图项仅表示该编辑器不会通过用户事件(如单击,双击等)打开。

  • Qt中的用户交互遵循以下路径:

    1. 用户通过操作系统使用鼠标,键盘等进行交互
    2. 操作系统将该交互通知Qt。
    3. Qt创建QEvent并将其发送到小部件。
    4. 小部件分析关于接收到的QEvent您应该修改的内容。

在您的情况下,使用QEvent显示小部件,因此从Qt的角度考虑,可编辑性在这种情况下无效。

解决方案:

考虑到上述情况,可能使小部件不可编辑的一般方法是:阻止用户小部件交互路径的某些点。在这种情况下,最简单的方法是阻止小部件通过事件过滤器接收QEvent

考虑到上述,解决方法是:

openPersistentEditor()
openPersistentEditor()
© www.soinside.com 2019 - 2024. All rights reserved.