PyQt6跨类信号与槽连接问题:按钮类处理文本后无法更新标签
解决PyQt6跨类信号与槽的文本回传问题
你的代码核心问题是没有将ButtonWidget处理完成后发出的accepted_text信号连接到MainWindow的标签更新逻辑,导致始终用原始文本设置标签,而非处理后的结果。以下是修正方案:
关键修改点
- 在MainWindow中新增一个槽函数,专门接收ButtonWidget返回的处理后文本并更新QLabel
- 建立ButtonWidget的
accepted_text信号与MainWindow新增槽函数的连接 - 调整
change_label函数的职责,仅负责传递输入文本,不再直接设置标签
修正后的完整代码
import sys from PyQt6.QtWidgets import QApplication, QPushButton, QVBoxLayout, QLabel, QLineEdit, QWidget from PyQt6.QtCore import pyqtSignal as Signal, pyqtSlot as Slot class ButtonWidget(QPushButton): accepted_text = Signal(str, str) def __init__(self): super().__init__() self.setText("Accept Text") @Slot(str, str) def accept_text(self, text1, text2): text1 = text1.upper() text2 = text2.title() self.accepted_text.emit(text1, text2) class MainWindow(QWidget): pushed_text = Signal(str, str) def __init__(self): super().__init__() layout = QVBoxLayout() self.setLayout(layout) self.line1 = QLineEdit(placeholderText="enter text") self.line2 = QLineEdit(placeholderText="enter text") self.button_widget = ButtonWidget() self.label = QLabel("") layout.addWidget(self.line1) layout.addWidget(self.line2) layout.addWidget(self.button_widget) layout.addWidget(self.label) # 连接主窗口的文本信号到按钮组件的处理槽 self.pushed_text.connect(self.button_widget.accept_text) # 连接按钮组件处理完成后的信号到主窗口的标签更新槽 self.button_widget.accepted_text.connect(self.update_label_with_processed_text) self.button_widget.clicked.connect(self.change_label) self.show() def change_label(self): text1 = self.line1.text() text2 = self.line2.text() # 仅发送原始文本给ButtonWidget处理,不直接设置标签 self.pushed_text.emit(text1, text2) @Slot(str, str) def update_label_with_processed_text(self, processed_text1, processed_text2): # 使用处理后的文本更新标签 self.label.setText(f"{processed_text1} {processed_text2}") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
逻辑说明
- 点击按钮触发
change_label函数,该函数获取输入框的原始文本,通过pushed_text信号发送给ButtonWidget的accept_text槽 - ButtonWidget处理文本后,通过
accepted_text信号将处理结果回传给MainWindow的update_label_with_processed_text槽 update_label_with_processed_text槽接收处理后的文本,更新QLabel显示内容
这样就完成了跨类的信号传递与响应,输入“stack overflow”后会正确显示为“STACK Overflow”。
内容的提问来源于stack exchange,提问作者Lethnis
相关产品推荐
相关产品推荐

