如何设置多个显示选项并做出反应?

How to set up and react to multiple display options?

我正在开发一个 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 方法?

首先,您不想在单击单选按钮时立即做出反应,因此您不需要连接到他们的 clicked 信号。

相反,用户可以选择单选按钮(在同一父项中自动独占),在单击显示按钮的那一刻,您只需读出选择了哪个单选按钮(可以在大多数)并根据选择的一个做一些事情。

对于四个单选按钮,您可以通过按钮 isChecked() 上的 if else 子句来实现。

对于更多的按钮,我建议另外使用 QButtonGroup (documentation),它允许在 addButton() 方法中为每个按钮分配一个整数,然后轻松检索整数所选按钮的 checkedId()。如果未选择任何按钮,则 return 值为 -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_()

看起来像: