除非使用 PySide 选择了一个项目,否则禁用菜单项
Disable menu item unless exactly one item is selected with PySide
使用 QMenu
in PySide, I want to disable a menu item based on a QListWidget
选择计数。如果选择计数恰好为 1,则应启用 'Edit Item' 操作,否则应禁用它。我该怎么做?
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Modules
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
# Variables
# ------------------------------------------------------------------------------
listItems = ["A","B","C","D","E","F","G"]
# widget
# ------------------------------------------------------------------------------
class Example(QtGui.QWidget):
def __init__(self,):
super(Example, self).__init__()
self.initUI()
def initUI(self):
# formatting
self.setGeometry(300, 300, 250, 300)
self.setWindowTitle("Input List")
# widgets
self.itemList = QtGui.QListWidget()
self.itemList.addItems(listItems)
self.itemList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
# context menu
self.edit_menu = QtGui.QMenu()
removeItem = self.edit_menu.addAction('Remove Item')
removeItem.triggered.connect(self.RemoveItem)
editItem = self.edit_menu.addAction('Edit Item')
editItem.triggered.connect(self.EditItem)
self.itemList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.itemList.customContextMenuRequested.connect(self.on_context_menu)
self.itemList.itemDoubleClicked.connect(self.EditItem)
# layout
self.mainLayout = QtGui.QGridLayout(self)
self.mainLayout.addWidget(self.itemList, 0, 0)
self.show()
def on_context_menu(self, pos):
self.edit_menu.exec_(self.mapToGlobal(pos))
def EditItem(self):
print "Edit Item"
def RemoveItem(self):
print "Remove Item"
# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
您需要进行一些更改,但您可以通过禁用 QAction
。
第一个更改,使您的 editItem
变量在整个 class 中都可访问。
self.editItem = self.edit_menu.addAction('Edit Item')
self.editItem.triggered.connect(self.EditItem)
(为了保持一致性,您可能也想对 remoteItem
执行此操作)
接下来,在on_context_menu
中,您需要检查您选择了多少项。然后你enable/disable你的菜单选项基于那个逻辑:
def on_context_menu(self, pos):
if len(self.itemList.selectedItems()) == 1:
self.editItem.setEnabled(False)
else:
self.editItem.setEnabled(True)
self.edit_menu.exec_(self.mapToGlobal(pos))
示例:
只选择了一项:
选择了不止一项:
使用 QMenu
in PySide, I want to disable a menu item based on a QListWidget
选择计数。如果选择计数恰好为 1,则应启用 'Edit Item' 操作,否则应禁用它。我该怎么做?
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Modules
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
# Variables
# ------------------------------------------------------------------------------
listItems = ["A","B","C","D","E","F","G"]
# widget
# ------------------------------------------------------------------------------
class Example(QtGui.QWidget):
def __init__(self,):
super(Example, self).__init__()
self.initUI()
def initUI(self):
# formatting
self.setGeometry(300, 300, 250, 300)
self.setWindowTitle("Input List")
# widgets
self.itemList = QtGui.QListWidget()
self.itemList.addItems(listItems)
self.itemList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
# context menu
self.edit_menu = QtGui.QMenu()
removeItem = self.edit_menu.addAction('Remove Item')
removeItem.triggered.connect(self.RemoveItem)
editItem = self.edit_menu.addAction('Edit Item')
editItem.triggered.connect(self.EditItem)
self.itemList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.itemList.customContextMenuRequested.connect(self.on_context_menu)
self.itemList.itemDoubleClicked.connect(self.EditItem)
# layout
self.mainLayout = QtGui.QGridLayout(self)
self.mainLayout.addWidget(self.itemList, 0, 0)
self.show()
def on_context_menu(self, pos):
self.edit_menu.exec_(self.mapToGlobal(pos))
def EditItem(self):
print "Edit Item"
def RemoveItem(self):
print "Remove Item"
# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
您需要进行一些更改,但您可以通过禁用 QAction
。
第一个更改,使您的 editItem
变量在整个 class 中都可访问。
self.editItem = self.edit_menu.addAction('Edit Item')
self.editItem.triggered.connect(self.EditItem)
(为了保持一致性,您可能也想对 remoteItem
执行此操作)
接下来,在on_context_menu
中,您需要检查您选择了多少项。然后你enable/disable你的菜单选项基于那个逻辑:
def on_context_menu(self, pos):
if len(self.itemList.selectedItems()) == 1:
self.editItem.setEnabled(False)
else:
self.editItem.setEnabled(True)
self.edit_menu.exec_(self.mapToGlobal(pos))
示例:
只选择了一项:
选择了不止一项: