Как настроить и отреагировать на несколько вариантов отображения?

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

Это сводится к чему-то вроде этого

import myFunction

class myUi(QtGui.QWidget):
    def retranslateUi(self, myUi):
        self.option1.clicked.connect(self.option1task)
        self.option2.clicked.connect(self.option2task)
        self.display.clicked.connect(self.displaytask)

    def option1task(self):
        #do something

    def option2task(self):
        #do something

    def displaytask(self):
        #if option 1 was clicked, run myFunction.option1()
        #if option 2 was clicked, run myFunction.option2()

У меня просто проблемы с этим. Есть какой-то способ решить это, просто передав переменные, или мне нужно будет использовать метод сигнал / слот?

1 ответ

Решение

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

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

Для четырех переключателей вы можете сделать это ifelse пункт о isChecked() кнопок.

Для большего количества кнопок я рекомендую дополнительно использовать QButtonGroup ( документация), которая позволяет назначить целое число для каждой кнопки в пределах addButton() метод, а затем легко получить целое число выбранной кнопки с checkedId(), Если ни одна кнопка не выбрана, возвращаемое значение равно -1.

Мой пример (используя PySide, очень похожий на PyQt):

from PySide import QtGui

def do_something():
    id = g.checkedId()
    if id == -1:
        print('no option selected')
    else:
        print('selected option {}, read for display'.format(id))

app = QtGui.QApplication([])

w = QtGui.QWidget()
l = QtGui.QVBoxLayout(w)

# three radio buttons
b1 = QtGui.QRadioButton('Option 1')
l.addWidget(b1)
b2 = QtGui.QRadioButton('Option 2')
l.addWidget(b2)
b3 = QtGui.QRadioButton('Option 3')
l.addWidget(b3)

# a button group (mapping from buttons to integers)
g = QtGui.QButtonGroup(w)
g.addButton(b1, 1)
g.addButton(b2, 2)
g.addButton(b3, 3)

# display button
b = QtGui.QPushButton('Display')
b.clicked.connect(do_something)
l.addWidget(b)

w.show()

app.exec_()

И это выглядит так:

Другие вопросы по тегам