首页 > 解决方案 > 如何根据条件将信号连接到不同的插槽

问题描述

我正在尝试制作一个由以下内容组成的 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_())

如您所见,我使用了自定义信号,并尝试将其链接到不同的插槽上,以根据条件获得不同的结果。

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

有人可以帮我吗?

标签: pythonpyqtpyqt5

解决方案


您正在检查构造函数中的文本是否 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_())

推荐阅读