pyqt5 中的qlistwidget item 右键菜单
程序员文章站
2022-06-08 23:49:19
...
想法
我的想法就是在qlistwidget中右键显示一个菜单,然后可以用户添加,删除,重命名item.因为pyqt的非常的少,所以记录下来.
整体代码
self.leftWidget =QListWidget()
#禁止双击可编辑
self.leftWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
#右键菜单
self.leftWidget.setContextMenuPolicy(Qt.CustomContextMenu)
self.leftWidget.customContextMenuRequested.connect(self.myListWidgetContext)
def myListWidgetContext(self,position):
#弹出菜单
popMenu = QMenu()
creAct =QAction("新建分组",self)
delAct =QAction("删除分组",self)
renameAct =QAction(u'重命名', self)
#查看右键时是否在item上面,如果不在.就不显示删除和修改.
popMenu.addAction(creAct)
if self.leftWidget.itemAt(position):
popMenu.addAction(delAct)
popMenu.addAction(renameAct)
creAct.triggered.connect(self.CreateNewItem)
renameAct.triggered.connect(self.RenameItem)
delAct.triggered.connect(self.DeleteItem)
popMenu.exec_(self.leftWidget.mapToGlobal(position))
#创建新的分组
def CreateNewItem(self):
#创建一个没有名字的item
item =QListWidgetItem("")
item.setTextAlignment(Qt.AlignCenter)
#使得item是可以编辑的.
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.leftWidget.addItem(item)
#创建后就可以编辑item,用户自己起名字.
self.leftWidget.editItem(item)
#删除分组
def DeleteItem(self):
self.leftWidget.takeItem(self.leftWidget.currentRow())
#重命名分组
def RenameItem(self):
curRow =self.leftWidget.currentRow()
item=self.leftWidget.item(curRow)
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.leftWidget.editItem(item)
self.leftWidget.itemChanged.connect(lambda :self.ChangeItem(item))
def ChangeItem(self,item):
print("test")
代码解释
- 首先呢创建一个listwidget,这个很简单.
self.leftWidget =QListWidget()
- 第二步,就是禁止双击可以编辑item,因为我想让只能通过右键菜单的重命名重新编辑item.所以需要禁止掉这个东西.
self.leftWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
- 然后实现在listwidget内部邮件触发contextmune.
self.leftWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.leftWidget.customContextMenuRequested.connect(self.myListWidgetContext)
- connect绑定了
myListWidgetContext
函数,所以就会调用这个函数实现创建一个菜单. -
myListWidgetContext
就是创建了三个action
,然后分别绑定了下面的三个函数. - 下面两行代码就是先获取你重名的是哪一个
item
,通过第一行获取行,第二行获取你要重命名的item
curRow =self.leftWidget.currentRow()
item=self.leftWidget.item(curRow)