如何根据条件将信号连接到不同的插槽

How can I connect a signal to different slots according to condition

我正在尝试制作由以下人员组成的 GUI:

我想做的是在其中一个列表中显示我在 QLineEdit() 小部件上输入的文本,但有一些条件。

当在 QLineEdit() 栏中输入的结果与字符串 '10' 不同时,GUI 会在第一个 QlistWidget() 上显示该字符串 ,否则显示第二个列表。

我的代码如下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class Principale(QMainWindow):


    simpleSig = pyqtSignal(str)


    def __init__(self):
        super().__init__()

        self.search = QPushButton('Search')
        self.TextEdit = QLineEdit()
        self.list = QListWidget()
        self.list1 = QListWidget()

        self.layout0 = QHBoxLayout()
        self.layout0.addWidget(self.search)
        self.layout0.addWidget(self.TextEdit)

        self.layout1 = QHBoxLayout()
        self.layout1.addWidget(self.list)
        self.layout1.addWidget(self.list1)

        if self.TextEdit.text().lower() != '10':

            self.simpleSig.connect(self.simpleSlot)

        else:

            self.simpleSig.connect(self.argumentSlot)

        self.GridLayout = QGridLayout()
        self.GridLayout.addLayout(self.layout0, 0, 0)
        self.GridLayout.addLayout(self.layout1, 1, 0)

        self.main_Widget = QWidget()
        self.main_Widget.setLayout(self.GridLayout)

        self.setCentralWidget(self.main_Widget)

        self.search.clicked.connect(self.buttonClicked)


    def buttonClicked(self):
        self.simpleSig.emit(self.TextEdit.text().lower())


    def simpleSlot(self, stringArg):
        self.list.addItem(stringArg)


    def argumentSlot(self, stringArg):
        self.list1.addItem(stringArg)


# Main
monApp = QApplication(sys.argv)
fenetre = Principale()
fenetre.show()
sys.exit(monApp.exec_())

如您所见,我使用了自定义信号,并尝试link它在不同的插槽上根据条件获得不同的结果。

但是它不起作用,无论输入什么值,它仍然显示在第一个列表中。

有人可以帮我吗?

如果 lineEdit 的值是否为 10,您正在检查构造函数中的文本,这是刚刚定义的,因此它只有一个空字符串 '',如果您必须连接这样,将这部分移到按钮点击功能中,这样只有在按钮点击事件后才比较文本,但每次按钮点击后,如果连接,则需要先断开信号,然后再连接。

根据您的要求,您实际上不需要有条件地连接,您可以将它连接到一个函数并检查其中的条件,因为您已经传递了字符串参数。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class Principale(QMainWindow):


    simpleSig = pyqtSignal(str)


    def __init__(self):
        super().__init__()

        self.search = QPushButton('Search')
        self.TextEdit = QLineEdit()
        self.list = QListWidget()
        self.list1 = QListWidget()

        self.layout0 = QHBoxLayout()
        self.layout0.addWidget(self.search)
        self.layout0.addWidget(self.TextEdit)

        self.layout1 = QHBoxLayout()
        self.layout1.addWidget(self.list)
        self.layout1.addWidget(self.list1)
        ##Commented part
        # if self.TextEdit.text().lower() != '10':
        #
        #     self.simpleSig.connect(self.simpleSlot)
        #
        # else:
        #
        #     self.simpleSig.connect(self.argumentSlot)

        self.GridLayout = QGridLayout()
        self.GridLayout.addLayout(self.layout0, 0, 0)
        self.GridLayout.addLayout(self.layout1, 1, 0)

        self.main_Widget = QWidget()
        self.main_Widget.setLayout(self.GridLayout)

        self.setCentralWidget(self.main_Widget)

        self.search.clicked.connect(self.buttonClicked)
        self.simpleSig.connect(self.simpleSlot)  # Connect the signal to the slot


    def buttonClicked(self):
        self.simpleSig.emit(self.TextEdit.text().lower())


    def simpleSlot(self, stringArg):
        if stringArg != '10':      # Add condition inside the function
            self.list.addItem(stringArg)
        else:
            self.list1.addItem(stringArg)

    ##Commented part
    # def argumentSlot(self, stringArg):
    #     self.list1.addItem(stringArg)


# Main
monApp = QApplication(sys.argv)
fenetre = Principale()
fenetre.show()
sys.exit(monApp.exec_())