如何根据条件将信号连接到不同的插槽
How can I connect a signal to different slots according to condition
我正在尝试制作由以下人员组成的 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_())
如您所见,我使用了自定义信号,并尝试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_())
我正在尝试制作由以下人员组成的 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_())
如您所见,我使用了自定义信号,并尝试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_())