Как получить выбранный qRadioButton из массива qRadioButton в QHBoxLayout - PullRequest
0 голосов
/ 01 октября 2018

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

создание массива переключателей

a=QtWidgets.QHBoxLayout()
for j in range(10):
    a.addWidget(QtWidgets.QRadioButton(str(j+1))

проверка выбора переключателя

for j in a.children():
    if j.isChecked():
           print(j.text())

, который никогда не возвращает текст и a.children() это []

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

После нескольких необычно безумных поисков я пришел к этому решению:

for j in range(10):
    if a.itemAt(j).widget().isChecked():
        print(a.itemAt(j).widget().text())
0 голосов
/ 01 октября 2018

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

Для проверки я буду использовать следующий пример:

app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QHBoxLayout(w)
for j in range(10):
    lay.addWidget(QtWidgets.QRadioButton(str(j+1)))
print("children of layout: ", lay.children())
print("children of widget: ", w.children())
w.show()
sys.exit(app.exec_())

Вывод:

children of layout:  []
children of widget:  [<PyQt5.QtWidgets.QHBoxLayout object at 0x7fbf0ee2d288>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d1f8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d168>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d0d8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d048>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d828>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d8b8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860d38>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860dc8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860e58>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860ee8>]

Как видите, макет не имеет дочерних элементов, но у виджета w есть дочерние элементы виджетов, которые были добавлены в макет, поскольку макет был установлен внутри w.


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

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

Очень простое и питоническое решение - использовать список для хранения виджетов:

import sys
from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        hlay = QtWidgets.QHBoxLayout()
        self.radio_buttons = []
        for j in range(10):
            btn = QtWidgets.QRadioButton(str(j+1))
            btn.setAutoExclusive(False)
            hlay.addWidget(btn)
            self.radio_buttons.append(btn)

        lay = QtWidgets.QVBoxLayout(self)
        button = QtWidgets.QPushButton("Press me")
        button.clicked.connect(self.on_clicked)
        lay.addWidget(button)
        lay.addLayout(hlay)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        for btn in self.radio_buttons:
            if btn.isChecked():
                print(btn.text())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...