【发布时间】:2018-12-22 08:17:20
【问题描述】:
我有一个 Qmenu,我通过使用 Qsettings 加载列表来创建它,并且我试图通过在 QListQWidget 中加载列表并删除所选项目来从菜单中删除项目。目前,我能够删除列表小部件中的菜单项,并且它也将它们从 qsettings 中删除,但我无法弄清楚如何在不重新启动的情况下从菜单中删除这些项目。我已经尝试了各种方法,例如 removeAction 等,但无法弄清楚。
这是我的代码:
import functools
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, \
QApplication, QAction, QMenu, QListWidgetItem, \
QListWidget, QGridLayout
class MainWindow(QWidget):
settings = QtCore.QSettings('test_org', 'my_app')
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.layout = QHBoxLayout()
self.menu_btn = QPushButton()
self.menu = QMenu()
self.add_menu = self.menu.addMenu("Menu")
self.menu_btn.setMenu(self.menu)
self.open_list_btn = QPushButton('open list')
self.load_items = self.settings.value('menu_items', [])
for item in self.load_items:
self.action = QAction(item[0], self)
self.action.setData(item)
self.add_menu.addAction(self.action)
self.action.triggered.connect(functools.partial(self.menu_clicked, self.action))
self.layout.addWidget(self.menu_btn)
self.layout.addWidget(self.open_list_btn)
self.setLayout(self.layout)
self.open_list_btn.clicked.connect(self.open_window)
def open_window(self):
self.create_menu_item = List()
self.create_menu_item.show()
def menu_clicked(self, item):
itmData = item.data()
print(itmData)
class List(QWidget):
settings = QtCore.QSettings('test_org', 'my_app')
def __init__(self, parent=None):
super(List, self).__init__(parent)
self.menu_items = self.settings.value('menu_items', [])
self.layout = QGridLayout()
self.list = QListWidget()
self.remove_btn = QPushButton('Remove')
self.layout.addWidget(self.list, 1, 1, 1, 1)
self.layout.addWidget(self.remove_btn, 2, 1, 1, 1)
self.setLayout(self.layout)
self.remove_btn.clicked.connect(self.remove_items)
for item in self.menu_items:
self.item = QListWidgetItem()
self.item.setText(str(item[0]))
self.list.addItem(self.item)
def remove_items(self):
self.menu_items = self.settings.value('menu_items', [])
del self.menu_items[self.list.currentRow()]
self.settings.setValue('menu_items', self.menu_items)
listItems = self.list.selectedItems()
if not listItems: return
for item in listItems:
self.list.takeItem(self.list.row(item))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
有人有什么想法吗?
编辑:
这是 QSettings 中列表的结构。我用这个加载菜单,我用这个加载 QlistWidget。当我为 QListWidget 删除项目时,我试图让菜单也删除它们。
mylist = ['item_name',['itemdata1', 'itemdata2', 'itemdata3'],
'item_name2',['itemdata1', 'itemdata2', 'itemdata3'],
'item_name3',['itemdata1', 'itemdata2', 'itemdata3']]
【问题讨论】:
-
你可以显示配置文件
-
我目前只是使用 qsettings 手动将列表添加到注册表中。它们看起来像这样 mylist = ['item_name',['itemdata1', 'itemdata2', 'itemdata3']]
-
几乎只是第一个项目的项目名称,然后是一个包含随机数据的列表。我已经用对象名弄明白了,但对我来说尝试这种方法仍然效果不佳。
-
据我了解,您有一个带有 QAction 名称的 QListWidget,您希望如果您删除一些 QListWidgetItem,它将删除其相应的 QAction,而无需重新启动应用程序,对吗?跨度>
-
是的,这是正确的。当我从列表中删除时,我希望更新菜单以反映删除情况。
标签: python pyqt pyqt5 qmenu qsettings