2015-11-06 109 views
-1

在PySide中使用QMenu,我想根据QListWidget选择计数禁用菜单项。如果选择计数恰好为1,则应启用“编辑项目”操作,否则应禁用它。我怎样才能做到这一点?禁用菜单项,除非PySide只选择一个项目

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

例子:

只有一个项目中选择:

One item selected

随着多个项目的选择:

More than one item selected