Захват действий из проверяемого выпадающего списка
Вдохновлен следующей веткой: PyQt: Как настроить элементы Combobox для проверки?
Мне удалось создать простой проверяемый "комбинированный список" с помощью 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 (т.е. Категория 1 и / или Категория 2/3) было проверено в моем диалоге?
2 ответа
В качестве альтернативы вы можете определить свой 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
каждого action
возвращает QVariant
который нужно преобразовать обратно в int
с помощью toInt
метод возврата (int, bool)
кортеж, таким образом [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")