2015-04-04 2 views

ответ

1

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

Использование QButtonGroup и его глобальный сигнал buttonClicked также поможет управлять набором кнопок в общем виде. Но вы также можете подключить каждую кнопку к одному слоту с помощью partial для передачи пользовательских данных, которые помогут вам определить, какая кнопка сгенерировала обратный вызов.

import sys 
import string 
from PyQt5 import QtWidgets, QtCore 

class Window(QtWidgets.QDialog): 
    def __init__(self): 
     super().__init__() 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 

     self.letters = list(string.ascii_lowercase) 

     self.lay = QtWidgets.QVBoxLayout(self) 
     self.group = QtWidgets.QButtonGroup() 

     # Create all the buttons 
     for letter in self.letters: 
      btn = QtWidgets.QRadioButton(letter, self) 
      # In case you want to find it back later using findChild 
      btn.setObjectName("btn_"+letter) 
      self.group.addButton(btn) 
      self.lay.addWidget(btn) 

     self.group.buttonClicked.connect(self.btnCliked) 

    def btnCliked(self, btn): 
     # Do something with the button 
     print(btn.text()) 

def main(): 
    qApp = QtWidgets.QApplication(sys.argv) 
    win = Window() 
    win.show() 
    sys.exit(qApp.exec_()) 

if __name__ == '__main__': 
    main() 

Пример с partial:

from functools import partial 

[...] 

for letter in self.letters: 
    btn = QtWidgets.QRadioButton(letter, self) 
    self.lay.addWidget(btn) 
    btn.clicked.connect(partial(self.btnClicked, letter)) 

[...] 

def btnCliked(self, letter): 
    print(letter) 
+0

только один флажок может быть выбран? Я хочу выбрать несколько коробок ... Как я могу написать? спасибо – manChan

+0

http://doc.qt.io/qt-5/qbuttongroup.html#exclusive-prop – Cilyan

1

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

import string 
from QtGui import QRadioButton 

class RadioButtons(object):  
    def __init__(self, keys=string.ascii_lowercase): 
     self.buttons = {c: QRadioButton() for c in keys} 

Это создаст словарь (с использованием словаря) понимание имени self.buttons в качестве переменной экземпляра в объекты класса RadioButtons. Вы можете получить доступ к отдельной кнопке, используя поиск по словарю:

rb.buttons['z'] 
>>> rb = RadioButtons() 
>>> rb.buttons['a'] 
<__main__.QRadioButton object at 0x7f576c3666d0> 
>>> rb.buttons['z'] 
<__main__.QRadioButton object at 0x7f576c36a550> 

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

class RadioButtons(object):  
    def __init__(self, keys=string.ascii_lowercase): 
     self.__dict__.update({c: QRadioButton() for c in keys}) 

>>> rb = RadioButtons() 
>>> rb.a 
<__main__.QRadioButton object at 0x7f576c3666d0> 
>>> rb.z 
<__main__.QRadioButton object at 0x7f576c36a550> 
Смежные вопросы