python - 如何根据条件将信号连接到不同的插槽
问题描述
我正在尝试制作一个由以下内容组成的 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_())
如您所见,我使用了自定义信号,并尝试将其链接到不同的插槽上,以根据条件获得不同的结果。
但它不起作用,无论键入的值是什么,它仍然显示在第一个列表中。
有人可以帮我吗?
解决方案
您正在检查构造函数中的文本是否 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_())
推荐阅读
- web - 如何在我的 ASP.NET 项目中通过 Revox 设置 Pages 管理面板仪表板模板?
- collections - Kotlins 的多种集合令人困惑
- java - 如何在 Spring Boot 上生成 GeoJson?
- bash - 如何理解一个shell脚本?
- java - Smack xmpp - 建立连接
- drupal - 如何在没有链接字段的链接文本的情况下获取 URL
- frama-c - 使用 frama-c -wp 验证矩阵转置
- vb.net - 3秒后在消息框上自动发送回车键
- multidimensional-array - F# 打印出一个二维字符串数组
- java - Google App Engine 会话丢失属性