【问题标题】:Capture actions from checkable combobox从可选中的组合框中捕获操作
【发布时间】:2015-12-09 10:44:54
【问题描述】:

灵感来自以下主题: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)?

【问题讨论】:

    标签: python pyqt qtoolbutton


    【解决方案1】:

    或者你可以定义你的QActionGroup来收集你所有的actions,然后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() 方法中,读取每个actiondata 返回一个QVariant,您需要使用toInt 方法将其转换回int,返回(int, bool) 元组,因此@987654336 @

    【讨论】:

    • 请注意,PyQt API 的第二个版本(默认在 Python 3 中),QVariant 会自动转换为 python 类型。
    • 这个解决方案使 toolButton 只接受一个动作,所以我不能进行多选动作。
    【解决方案2】:

    首先我们需要遍历菜单的动作。没有方便的函数来做到这一点,但每个小部件都有一个方法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")
    

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多