除非使用 PySide 恰好选择了一项,否则禁用菜单项

Posted

技术标签:

【中文标题】除非使用 PySide 恰好选择了一项,否则禁用菜单项【英文标题】:Disable menu item unless exactly one item is selected with PySide 【发布时间】:2015-11-06 15:31:59 【问题描述】:

在 PySide 中使用 QMenu,我想禁用基于 QListWidget 选择计数的菜单项。如果选择计数正好是 1,则应启用“编辑项目”操作,否则应禁用。我该怎么做?

#!/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_())

【问题讨论】:

【参考方案1】:

您需要进行一些更改,但您可以通过禁用 QAction 来做到这一点。

首先进行更改,让您的 editItem 变量在整个班级中都可以访问。

self.editItem = self.edit_menu.addAction('Edit Item')
self.editItem.triggered.connect(self.EditItem)

(您可能也想对remoteItem 执行此操作,以保持一致性)

接下来,在on_context_menu 中,您需要检查您选择了多少项目。然后根据该逻辑启用/禁用菜单选项:

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))

例子:

只选择了一项:

选择了多个项目:

【讨论】:

以上是关于除非使用 PySide 恰好选择了一项,否则禁用菜单项的主要内容,如果未能解决你的问题,请参考以下文章

除非禁用 UAC,否则尝试访问报表管理器 URL 时出现权限错误

css 除非单击地图,否则禁用嵌入式Google地图上的滚轮。

美联储警告-除非提高债务上限,否则证券市场将出现“极端”反应

PySide/Cython 和 GIL 多线程使用

AG 网格:禁用编辑行,除非保存已编辑的行

使用 PyQt/PySide 禁用 QTableWidget 中特定列中的排序箭头