2015-12-09 6 views
1

Вдохновленный следующей веткой: PyQt: How to set Combobox Items be Checkable?
Мне удалось создать простую проверенную «combobox» с помощью QToolButton и добавить к ней проверенные элементы с помощью addAction. См простой пример кода:Захват действий из checkable 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 и/или Категория 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, который необходимо преобразовать обратно в., используя метод toInt(int, bool) возвращающегося кортеж, таким образом [0]

+1

Следует отметить, что со второй версией [PyQt API] (http://pyqt.sourceforge.net/Docs/PyQt4/pyqt_qvariant.html) (по умолчанию в Python 3) , 'QVariant' автоматически преобразуются в типы python. – Mel

+0

Это решение заставило toolButton принять одно действие, поэтому я не могу выполнить многосегмент действий. – emblixt

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")