如何在 PyQt5 中自定义 Qtreewidget 项目编辑器?

问题描述

我正在制作一个项目可编辑的 QtreeWidget,但问题出在项目编辑器或 QAbstractItemDelegate(可能会这样调用,不确定)。我无法更改样式表,实际上我不知道该怎么做。而且我希望选定的行(编辑器中的蓝色)应该按照我的意愿。如下图

enter image description here

这里我希望蓝色选定的行变成“.jpg”,这样任何人都不能更改那个“.jpg”。只有,一个可以改变到这个".jpg"

这是我的代码

import sys
from PyQt5 import QtCore,QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.button = QtWidgets.QPushButton('Edit')
        self.button.clicked.connect(self.edittreeitem)
        self.tree = QtWidgets.QTreeWidget()
        self.tree.setStyleSheet('background:#333333;color:grey')
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tree)
        layout.addWidget(self.button)
        columns = 'ABCDE'
        self.tree.setColumnCount(len(columns))
        for index in range(50):
            item=QtWidgets.QTreeWidgetItem(
                self.tree,[f'{char}{index:02}.jpg' for char in columns])
            item.setFlags(item.flags()|QtCore.Qt.ItemIsEditable)
    def edittreeitem(self):
        getSelected = self.tree.selectedItems()
        self.tree.editItem(getSelected[0],0)  

if __name__ == '__main__':
    
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setwindowTitle('Test')
    window.setGeometry(800,100,540,300)
    window.show()
    sys.exit(app.exec_())

解决方法

您可以创建自己的委托,只考虑基本名称而不考虑扩展名,然后使用现有的扩展名设置数据。

class BaseNameDelegate(QtWidgets.QStyledItemDelegate):
    def setEditorData(self,editor,index):
        editor.setText(QtCore.QFileInfo(index.data()).completeBaseName())

    def setModelData(self,model,index):
        name = editor.text()
        if not name:
            return
        suffix = QtCore.QFileInfo(index.data()).suffix()
        model.setData(index,'{}.{}'.format(name,suffix))


class Window(QtWidgets.QWidget):
    def __init__(self):
        # ...
        self.tree.setItemDelegate(BaseNameDelegate(self.tree))

唯一的缺点是扩展在编辑过程中不可见,但这需要一个比这更复杂的实现,因为 QLineEdit(委托字符串值的默认编辑器)不提供这种行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...