QTreeWidget 双击编辑当前条目是树形目录的一个常用功能,但是在开发实现这一功能的过程中,走了很多弯路,绕了不少圈子。目前网络上关于实现这一功能的,基本都是基于Qt的实现方法,没有PyQt的案例,对于不熟悉C++ 的开发者,看来看去都觉得过于复杂。
一、参考资料
关于C++实现过程,参见下面的链接:
QTreeWidget支持双击编辑Item节点的内容_itemiseditable-CSDN博客
QT实现双击编辑QTreeWidget节点-高性能服务器开发
CSDN、B站和某园翻了个遍,也没有找到pyqt或者pyside版解决这个问题的。最后没办法去找和
,
网上找了不少资料,看到用下面的语句可以解决:
二、实现过程
item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsEditable)
但此时,出现条目不能拖动的情况。唉,太难了我。。。
等于实现了一个功能,又废了一个功能。
最后在油管上找到了一个视频,讲实现方法的(視频资源已上传CSDN,参见https://download.csdn.net/download/qq_58168857/88530963?spm=1001.2014.3001.5503),看了后进行模仿:
item = self.tree.selectedItems()
if item:
item = item[0]
item.setFlags(item.flags() | Qt.ItemFlags.ItemIsEditable)
但是出现了以下报错:
item.setFlags(item.flags() | Qt.ItemFlags.ItemIsEditable) ditable'
AttributeError: type object 'ItemFlags' has no attribute 'ItemIsEditable'
国内的网站上找了个遍,试了好几种方法,都不行。最后我把注意力集中在item.setFlags(item.flags() | Qt.ItemFlags.ItemIsEditable) 这个句上。参照C++的代码,它是可以正常执行的,但是不知道为什么在这里不行。
于是检查官方开发说明文件:
并参照【QT】QTableWidgetItem.setFlags()_qt setflags函数-CSDN博客 这篇文章,对应的值改成了2:
item = self.tree.selectedItems()
if item:
item = item[0]
item.setFlags(item.flags() | 2)
系统能够正常运行了。
考虑到用2做参数,实在是不易理解,程序可读性不好,官方文件中C++的语法是
Qt::ItemIsEditable
对应的Python语法是Qt.ItemIsEditable,
item = self.tree.selectedItems()
if item:
item = item[0]
item.setFlags(item.flags() | Qt.ItemIsEditable)
BingGo,问题得到圆满解决。
三、核心代码
核心代码如下:
# 编辑Item部分信号槽连接
self.tree.itemDoubleClicked.connect(self.edit_Item)
# 编辑部分槽函数
def edit_Item(self):
item = self.tree.selectedItems()
print(item)
if item:
item = item[0]
item.setFlags(item.flags() | Qt.ItemIsEditable) # 使用2或者是ItemIsEditable的值,使用这一条命令,可拖动,可编辑
#item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsEditable) # 使用这一条后,条目不能拖动
四、感悟
Qt功能实在强大,功能模块参数太过烦杂,而开发证明基本都是基于C++的,而Qt的语法和Pyqt的语法差别比较大,这就造成在开发过程中,对于没有C++背景的开发者,遇到问题翻阅说明非常困难,所以要想用好pyqt,一些基本的C++语法常识还是要了解一些。
由于在这里卡的时间比较长,所以就不把这一部分写到前面那个QTreeWidget的文章里,单独形成一篇文章,有利于有缘的朋友检索到,从而解决您的困惑。后续我会把自己整理的QtreeWidget使用方法发出来,供大家一起参阅。
您还有什么其他好的方法,或者在开发过程中还没有解决问题,欢迎留言讨论。
您的一键三连是我的最大动力!