我有四种不同的组合:
cmb_filtermode_1 = QtGui.QComboBox()
cmb_filtermode_1.addItem("High Pass")
cmb_filtermode_1.addItem("Low Pass")
我已经知道如何连接选择选项时触发的信号
cmb_filtermode_1.activated.connect( combo_chosen )
但是它只向插槽发送一个整数值。我想知道是否有可能让触发信号的组合为所有人提供一个插槽。
def combo_chosen( combo ):
if combo == 0: #0 is the index of Low-Pass
#Do something here with the selected value and the combo who triggered
elif combo == 1: #is the index of High-pass
#Do something here with the selected value and the combo who triggered
答案 0 :(得分:1)
不要为复杂的事情烦恼。您只需使用lambda
表达式将组合传递给插槽。
cmb_filtermode_1 = QtGui.QComboBox()
cmb_filtermode_1.addItem("High Pass")
cmb_filtermode_1.addItem("Low Pass")
cmb_filtermode_1.activated.connect( lambda index: combo_chosen(cmb_filtermode_1) )
lambda
创建一个匿名函数,组合的信号连接到此函数,该函数调用其中的实际插槽,将组合对象传递给插槽。
def combo_chosen(combo):
# combo is QComboBox that sent the signal
print combo.currentText() # prints the selected items text
答案 1 :(得分:1)
如果您不想使用self.sender()
,因为您想要调用函数而不是方法,那么您可以连接到lambda
表达式,该表达式又调用您的函数,传入参考组合框。
例如
cmb_filtermode_1.activated.connect( lambda index, combobox=cmb_filtermode_1: combo_chosen(index, combobox) )
cmb_filtermode_2.activated.connect( lambda index, combobox=cmb_filtermode_2: combo_chosen(index, combobox) )
现在您只需为每个combobox
调整默认参数(参见上面的示例)。
相应地修改你的功能:
def combo_chosen( index, combobox ):
if index == 0: #0 is the index of Low-Pass
#Do something here with the selected value and the combo who triggered
elif index == 1: #is the index of High-pass
#Do something here with the selected value and the combo who triggered
注意:如果变量稍后重用以指向不同的组合框,则保持combobox=cmb_filtermode_x
参数如图所示(而不是直接将其传递给combo_chosen
函数)非常重要。 This SO answer涵盖了为什么需要这样做(尽管请注意其中一些使用旧的信号/插槽语法,因此可能会造成混淆)。
答案 2 :(得分:0)
是的,可以在你的插槽中使用sender()
方法。例如:
sender = self.sender()
Sender变量包含发出信号的小部件。很好的例子,您也可以找到here。
我认为您将插槽编写为简单函数,而不是QObject
的子类方法。 sender()
是QObject
的方法,因此您只能在课堂上使用此方法。
您的错误例如:
def buttonClicked(self):
sender = self.sender()
sender.setText('2')
class Example(QMainWindow):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
btn1 = QtGui.QPushButton("Button 1", self)
btn1.move(30, 50)
btn2 = QtGui.QPushButton("Button 2", self)
btn2.move(150, 50)
btn1.clicked.connect( buttonClicked)
btn2.clicked.connect(buttonClicked)
self.statusBar()
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Event sender')
self.show()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
正确方法:
class Example(QMainWindow):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
btn1 = QtWidgets.QPushButton("Button 1", self)
btn1.move(30, 50)
btn2 = QtWidgets.QPushButton("Button 2", self)
btn2.move(150, 50)
btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)
self.statusBar()
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Event sender')
self.show()
def buttonClicked(self):# now it is method
sender = self.sender()
sender.setText('2')
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()