从可检查的组合框中捕获操作
Capture actions from checkable combobox
受以下线程启发:PyQt: How to set Combobox Items be Checkable?
我能够通过使用 QToolButton 并使用 addAction 向其添加可检查项目来创建一个简单的可检查 "combobox"。
见简单代码示例:
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 操作(即 类别 1 and/or 类别 2/3)已在我的对话框中检查过?
首先我们需要循环遍历 menu.There 的无便利函数来执行此操作,但每个小部件都有一个方法 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")
或者你可以定义你的 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()
方法中,读取每个action
returns的data
一个QVariant
,你需要将它转换回int
使用 toInt
方法返回 (int, bool)
元组,因此 [0]
受以下线程启发:PyQt: How to set Combobox Items be Checkable?
我能够通过使用 QToolButton 并使用 addAction 向其添加可检查项目来创建一个简单的可检查 "combobox"。
见简单代码示例:
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 操作(即 类别 1 and/or 类别 2/3)已在我的对话框中检查过?
首先我们需要循环遍历 menu.There 的无便利函数来执行此操作,但每个小部件都有一个方法 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")
或者你可以定义你的 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()
方法中,读取每个action
returns的data
一个QVariant
,你需要将它转换回int
使用 toInt
方法返回 (int, bool)
元组,因此 [0]