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

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

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

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()

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


person Emily C    schedule 12.02.2015    source источник
comment
Может потребоваться сигнал/слот. Но ваш вопрос не выглядит ясным. @Emily C, не могли бы вы объяснить немного больше?   -  person smitkpatel    schedule 13.02.2015
comment
Вы уже используете Signal/Slot в вызовах connect.   -  person Trilarion    schedule 13.02.2015


Ответы (1)


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

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

Для четырех переключателей вы можете сделать это с помощью предложения if else на 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_()

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

введите здесь описание изображения

person Trilarion    schedule 13.02.2015