如何在 PyQt5 中自定义 Qtreewidget 项目编辑器?
How to customize Qtreewidget item editor in PyQt5?
我正在制作一个项目可编辑的 QtreeWidget,但问题出在项目编辑器或 QAbstractItemDelegate(可能这样称呼,不确定)。我无法更改样式表,实际上我不知道该怎么做this.And 我还希望所选的行(编辑器中的蓝色)应该根据我的 wish.like 下面的图片
这里我希望蓝色选择行最多为“.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, editor, 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(委托字符串值的默认编辑器)不不提供此类行为。
我正在制作一个项目可编辑的 QtreeWidget,但问题出在项目编辑器或 QAbstractItemDelegate(可能这样称呼,不确定)。我无法更改样式表,实际上我不知道该怎么做this.And 我还希望所选的行(编辑器中的蓝色)应该根据我的 wish.like 下面的图片
这里我希望蓝色选择行最多为“.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, editor, 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(委托字符串值的默认编辑器)不不提供此类行为。