Большое количество кнопок и умная проверка, которая проверяется - PullRequest
1 голос
/ 20 марта 2012

У меня есть диалог:

Dialog

Он содержит много плоских QPushButtons, QTextEdit и другой QPushButton.После нажатия «Получить список» мы можем увидеть список проверенных кнопок в QTextEdit.

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

    if self.ui.bq6o.isChecked():
        cards.append("Q6o")
    if self.ui.bk2o.isChecked():
        cards.append("K2o")
    if self.ui.bq3o.isChecked():
        cards.append("Q3o")
    if self.ui.bt7s.isChecked():
        cards.append("T7s")
    if self.ui.bq4o.isChecked():
        cards.append("Q4o")
    if self.ui.bt4s.isChecked():
        cards.append("T4s")
    if self.ui.b98o.isChecked():
        cards.append("98o")
    if self.ui.bjto.isChecked():
        cards.append("JTo")
    if self.ui.btt.isChecked():
        cards.append("TT")
    if self.ui.bq7o.isChecked():
        cards.append("Q7o")

    [...]

Очевидно, мне не нравится такой код.Я искал какой-то виджет "кнопочной матрицы" вроде, но без удачи.Буду благодарен за советы.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

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

parent = dialog  # or whatever
cards = [widget.text() for widget in parent.children() if isinstance(widget, QPushButton) and widget.isChecked()]

Возможно, вам потребуется включить некоторый код в оператор if, чтобыисключите кнопку «Получить список» или любые другие кнопки в вашем диалоговом окне, для которых можно установить флажок, но их не следует включать в список карточек.

1 голос
/ 20 марта 2012

Как подсказал @Brendan в другом вопросе, вы можете просмотреть их в едином списке.Но еще один подход заключается в подключении каждой кнопки переключенного сигнала к слоту, который позволяет им регистрироваться при их проверке.

# somewhere in your class
self.checkedList = set()

def buttonChecked(self, checked):
    button = self.sender()
    if checked:
        self.checkedList.add(button)
    else:
        if button in self.checkedList:
            self.checkedList.remove(button)

# when you create a new button
button.toggled.connect(self.buttonChecked)

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

Обновление

Вот еще одна версия, которая объединяет цикл @Brendans и мое предложение сигнала.Это может помочь в ситуации, когда ваши кнопки немного более распределены по всему пользовательскому интерфейсу, а не все под одним родителем ... но сначала предположим, что все они под родителем ...

parent = dialog
for widget in parent.children():
    if isinstance(widget, QPushButton):
        widget.toggled.connect(self.buttonChecked)

Вы можете повторить это в вашем __init__() для всех расположений ваших кнопок и зарегистрировать их все в слоте.

...