treewidget的一些使用心得
问题一:获取当前选中的item的层级关系
想要实现获取当前item的结构内容,类似于:
新建目录1_新建目录2_新建目录3_新建文件1
实现方法
可利用循环item.parent以及数组操作reverse翻转数据实现
path = []
while item:
path.append(item.text(0))
item = item.parent()
path.reverse()
item_path = '_'.join(path)
问题二:区分层级类型
例如最后一层item为文件层,支持双击或单击显示其内容,而路径层不进行该操作。
实现方法
在新建item时,添加flag标志位,例如路径层添加flag为False,文件层为True
# 路径层
newItem.setText(0, f'新建目录{self.number1}')
flag = 'False'
newItem.setData(0, Qt.UserRole, flag)
# 文件层
newItem.setText(0, fileName)
flag = 'True'
newItem.setData(0, Qt.UserRole, flag)
这样就可以通过判断当前选中的item类型进行区分操作。
if item.data(0, Qt.UserRole) == 'True':
问题三:在treewidget区域右击出现菜单
实现该功能,需要关联预设好的事件。
实现方法
关联信号与槽
self.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu)
self.treeWidget.customContextMenuRequested.connect(self.showContextMenu)
其中self.showContextMenu是菜单函数,通过QMenu()新建菜单。
menu = QMenu()
rename_action = QAction('重命名', self)
saveAction = QAction('保存', self)
delAction = QAction('删除', self)
rename_action.triggered.connect(lambda: self.renameTreeItem(self.item))
saveAction.triggered.connect(lambda: self.UPDATEToDB(self.item))
delAction.triggered.connect(lambda: self.deletename(self.item))
menu.addAction(rename_action)
menu.addAction(saveAction)
menu.addAction(delAction)
# 显示菜单
menu.exec_(self.treeWidget.viewport().mapToGlobal(position))
问题四:判断右击位置是item,还是根目录下
不同位置,菜单内容设置不同内容
实现方法
self.item = self.treeWidget.itemAt(position)
if self.item:
# 右击位置为item
else:
# 右击位置为根目录
更多内容持续关注
如果急于求成,咸鱼未来视觉科技与你不见不散。