2012-06-03 2 views
0

У меня есть GUI с двумя переключателями внутри контейнера QButtonGroup, который сам находится внутри QGroupBox (эта группа кнопок нуждается в контекстном меню правой кнопки мыши, а поскольку QButtonGroup не иметь визуальное представление не кажется, есть метод setContextMenuPolicy) следующий фрагмент кода должен обновить состояние взаимоисключающих кнопок в ответ на входящие данные из последовательного канала:.PyQT - метод button.toggle() не работает

elif widgetName in self.buttonBoxDict: 
      buttonGroup = getattr(self.ui, self.buttonBoxDict[widgetName]) 
      checkedButton = buttonGroup.checkedButton() 
      checkedButtonName = str(checkedButton.objectName()) 
      if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue: 
       checkedButton.toggle() 
       assert(not checkedButton.isChecked()) 
       self.windowHandler.buttonChanged(self, self.onValue, cc) 
      elif value < self.onValue and self.buttonDict[checkedButtonName][1] == self.onValue: 
       checkedButton.toggle() 
       self.windowHandler.buttonChanged(self, self.offValue, cc) 

к сожалению это не работает, я знаю, что первоначально выбранная здесь кнопка отмечена, но состояние кнопки в графическом интерфейсе никогда не изменяется, и утверждение всегда выходит из строя, даже несмотря на то, что код, похоже, выполняется правильно. Любые идеи относительно того, почему это может пойти не так?

+0

Это трудно понять без контекста. Можете ли вы предоставить runnable пример проблемы? – Avaris

+0

@Avaris Спасибо за ответ - я посмотрю, смогу ли я поставить что-то более прямое, что иллюстрирует проблему. – Bitrex

ответ

1

Проблема, с которой вы столкнулись, основана на том факте, что вы используете QButtonGroup, которая установлена ​​как эксклюзивная. Если вы посмотрите на documentation вы увидите, что в нем говорится следующее:

пользователь не может снять в данный момент проверяются кнопки, нажав на нее; вместо этого, другой кнопки в группе должна быть нажата

Я не знаю логику вашего приложения, но если вы используете эксклюзивную группу кнопок вам необходимо установить кнопку диффа для проверки или сделать не использовать эксклюзивную группу и выполнять проверки самостоятельно.

Ниже приведен небольшой пример того, что вы видите:

import sys 
from PyQt4 import QtGui 

app = QtGui.QApplication(sys.argv) 
button1 = QtGui.QCheckBox('test 1') 
group = QtGui.QButtonGroup() 
group.setExclusive(True) 
group.addButton(button1) 
print button1.isChecked() 
button1.toggle() 
print button1.isChecked() 
button1.toggle() 
print button1.isChecked() 
# toggle seems not to work, add a second button 
button2 = QtGui.QCheckBox('test 2') 
group.addButton(button2) 
print button2.isChecked() 
button2.toggle() 
print button1.isChecked() 
print button2.isChecked() 
+0

Отлично - спасибо, что поймали это для меня! – Bitrex

0

Быстрое исправление, благодаря хэдз-апе Манделем, чтобы получить вещи, чтобы вести себя так, как я «ожидаемый» их в течение группа с двумя кнопками - это изменить код на что-то вроде этого:

if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue: 
    for button in buttonGroup.buttons(): 
      if button != checkedButton: 
       button.toggle() 
Смежные вопросы