使用 Qt5 框架(通过 Python 的 pyQt5),我需要创建一个带有参数 - 值列的 QTreeView 小部件,其中某些行的值项必须具有内部“浏览”按钮以打开文件浏览对话框并放置选定的文件到相应值的字段中。
阅读关于项目委托的 Qt 手册,我整理了以下代码:
自定义 BrowseEdit 类(QLineEdit + Browse 操作)
class BrowseEdit(QtWidgets.QLineEdit):
def __init__(self, contents='', filefilters=None,
btnicon=None, btnposition=None,
opendialogtitle=None, opendialogdir=None, parent=None):
super().__init__(contents, parent)
self.filefilters = filefilters or _('All files (*.*)')
self.btnicon = btnicon or 'folder-2.png'
self.btnposition = btnposition or QtWidgets.QLineEdit.TrailingPosition
self.opendialogtitle = opendialogtitle or _('Select file')
self.opendialogdir = opendialogdir or os.getcwd()
self.reset_action()
def _clear_actions(self):
for act_ in self.actions():
self.removeAction(act_)
def reset_action(self):
self._clear_actions()
self.btnaction = QtWidgets.QAction(QtGui.QIcon(f"{ICONFOLDER}/{self.btnicon}"), '')
self.btnaction.triggered.connect(self.on_btnaction)
self.addAction(self.btnaction, self.btnposition)
#self.show()
@QtCore.pyqtSlot()
def on_btnaction(self):
selected_path = QtWidgets.QFileDialog.getOpenFileName(self.window(), self.opendialogtitle, self.opendialogdir, self.filefilters)
if not selected_path[0]: return
selected_path = selected_path[0].replace('/', os.sep)
# THIS CAUSES ERROR ('self' GETS DELETED BEFORE THIS LINE!)
self.setText(selected_path)
QTreeView 的自定义项目委托:
class BrowseEditDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, model_indices=None, thisparent=None,
**browse_edit_kwargs):
super().__init__(thisparent)
self.model_indices = model_indices
self.editor = BrowseEdit(**browse_edit_kwargs)
self.editor.setFrame(False)
侃侃尔雅
相关分类