从可检查组合框中捕获操作

时间:2015-12-09 10:44:54

标签: python pyqt qtoolbutton

受到以下主题的启发:PyQt: How to set Combobox Items be Checkable?
我能够创建一个简单的可检查"组合框"使用QToolButton并使用addAction向其添加可检查项。 请参阅简单的代码示例:

from PyQt4 import QtCore, QtGui
import sys
class Ui_Dialog(object):
   def setupUi(self, Dialog):
       Dialog.setObjectName("Dialog")
       Dialog.resize(198, 157)
       self.toolButton = QtGui.QToolButton(Dialog)
       self.toolButton.setGeometry(QtCore.QRect(60, 50, 71, 19))
       self.toolButton.setObjectName("toolButton")
       self.toolButton.setText("MyButton")
       QtCore.QMetaObject.connectSlotsByName(Dialog)

class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.toolMenu = QtGui.QMenu(self.ui.toolButton)
        for i in range(3):
            action = self.toolMenu.addAction("Category " + str(i))
            action.setCheckable(True)
        self.ui.toolButton.setMenu(self.toolMenu)
        self.ui.toolButton.setPopupMode(QtGui.QToolButton.InstantPopup)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyDialog()
    myapp.show()
    sys.exit(app.exec_())  

但是如何捕获在对话框中检查过的QToolButton操作(即 Category 1 和/或 Category 2/3 )?

2 个答案:

答案 0 :(得分:1)

或者,您可以定义QActionGroup以收集所有action,然后将connect信号triggered定义为回调方法,这样:

class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.toolMenu = QtGui.QMenu(self.ui.toolButton)
        group = QtGui.QActionGroup(self.toolMenu)
        for i in range(3):
            action = self.toolMenu.addAction("Category %d" % i)
            action.setCheckable(True)
            action.setActionGroup(group)
            action.setData(i)
        self.ui.toolButton.setMenu(self.toolMenu)
        self.ui.toolButton.setPopupMode(QtGui.QToolButton.InstantPopup)
        group.triggered.connect(self.test)

    def test(self, act):
        print 'Action' , act.data().toInt()[0]

test()方法中,阅读每个data的{​​{1}}会返回QVariant,您需要使用{{1}将其转换回action返回int元组的方法,因此toInt

答案 1 :(得分:0)

首先我们需要遍历菜单的操作。这样做没有便利功能,但每个小部件都有一个方法findChildren。要获取QAction类型的所有子项的列表,请执行以下操作:

 self.toolMenu.findChildren(QtGui.QAction)

对于每个操作,我们都可以使用QAction.isChecked()来获取布尔值。

完整示例:

def whatIsChecked(self):
    for action in self.toolMenu.findChildren(QtGui.QAction):
        if action.isChecked():
            print(action.text(),"is checked")
        else:
            print(action.text(),"is not checked")