如何设置和响应多个显示选项?

时间:2015-02-12 20:05:14

标签: python qt pyqt pyside qradiobutton

我正在开发一个GUI,最终将根据用户选择的内容运行多个数据分析之一。在这部分GUI中,我有四个带选项的单选按钮,然后是一个显示按钮。我想在用户点击显示时运行四个导入函数中的一个。

归结为这样的事情

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

我在制作它时遇到了麻烦。有没有办法通过传递变量来解决它,还是需要使用signal / slot方法?

1 个答案:

答案 0 :(得分:1)

首先,您不希望在单击单选按钮时立即做出反应,因此您无需连接到clicked信号。

相反,用户可以选择单选按钮(在同一父节点中自动排除),单击显示按钮时,您只需读出选中的单选按钮(最多可以是一个)并根据选择的一个做某事。

对于四个单选按钮,您可以通过if按钮上的else isChecked()子句执行此操作。

对于更大数量的按钮,我建议另外使用QButtonGroupdocumentation),它允许为addButton()方法中的每个按钮分配一个整数,然后轻松检索整数选中checkedId()的按钮。如果未选择任何按钮,则返回值为-1。

我的例子(使用与PyQt非常相似的PySide):

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

它看起来像:

enter image description here