You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑说明

  1. 点击按钮触发change_label函数,该函数获取输入框的原始文本,通过pushed_text信号发送给ButtonWidget的accept_text槽
  2. ButtonWidget处理文本后,通过accepted_text信号将处理结果回传给MainWindow的update_label_with_processed_text槽
  3. update_label_with_processed_text槽接收处理后的文本,更新QLabel显示内容

这样就完成了跨类的信号传递与响应,输入“stack overflow”后会正确显示为“STACK Overflow”。

内容的提问来源于stack exchange,提问作者Lethnis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:17:09