如何设置多个显示选项并做出反应?
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_()
看起来像:
我正在开发一个 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_()
看起来像: