【问题标题】:How can I connect a signal to different slots according to condition如何根据条件将信号连接到不同的插槽
【发布时间】:2021-06-04 21:07:00
【问题描述】:

我正在尝试制作一个由 :

组成的 GUI
  • 一个QLineEdit()
  • 一个QpushButton()
  • 两个QlistWidget()

我想做的是在列表之一中显示我在 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_())

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

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

有人可以帮帮我吗?

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    如果lineEdit的值是10,你正在检查构造函数中的文本,这是刚刚定义的,所以它只有一个空字符串'',如果你必须以这种方式连接,移动这部分to button clicked function 所以只有在按钮点击事件之后才会比较文本,但是在每次按钮点击之后,如果已连接,则需要先断开信号,然后再重新连接。

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

    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_())
    

    【讨论】:

    • 效果很好,谢谢!但是我有一个问题:为什么你把信号和功能的连接下的信号和槽的连接换成了?对编译重要吗?
    • 不,这根本没有必要,将所有连接放在一个块中只是一个好习惯,这样您以后在调试/测试/修改时可以轻松找到它们
    • 好的,没问题,我注意到您的建议。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多