将几个组合框连接到相同的信号

时间:2015-06-08 04:34:11

标签: qt pyqt pyqt4

我有四种不同的组合:

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

3 个答案:

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