我正在开发一个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方法?
答案 0 :(得分:1)
首先,您不希望在单击单选按钮时立即做出反应,因此您无需连接到clicked
信号。
相反,用户可以选择单选按钮(在同一父节点中自动排除),单击显示按钮时,您只需读出选中的单选按钮(最多可以是一个)并根据选择的一个做某事。
对于四个单选按钮,您可以通过if
按钮上的else
isChecked()
子句执行此操作。
对于更大数量的按钮,我建议另外使用QButtonGroup
(documentation),它允许为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_()
它看起来像: