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

如何刷新QWidget以显示当前信息?PySide2 QStackedWidget页面不更新问题

PySide2 QStackedWidget结果页不更新问题解决方案

问题根因

  • 每次触发计算都会新建DistributionScreen实例并追加到QStackedWidget页面队列,返回输入页时仅调整索引未删除旧结果页。第二次计算后切换页面时,实际显示的是第一次创建的旧结果页实例,你打印的是新创建的未显示实例的数值,因此出现打印正确、界面不变的错位。
  • 使用类变量IncomeScreen.init_amount传递数值属于全局状态共享,易出现取值异常,不推荐用于GUI页面间的参数传递。

修复方案

复用同一个结果页实例,仅在首次初始化时添加到页面队列,每次计算时直接更新结果页的标签内容即可,修改后的完整代码如下:

# 导入依赖
import os
import sys
from PySide2 import QtWidgets
import PySide2.QtUiTools as QtUiTools


class IncomeScreen(QtWidgets.QMainWindow):
    def __init__(self):
        super(IncomeScreen, self).__init__()
        # 加载输入页UI
        loader = QtUiTools.QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "main.ui")
        self.main = loader.load(path, self)
        # 提前创建结果页实例,仅创建一次
        self.distribution = DistributionScreen()
        # 提前添加到堆叠组件,仅添加一次
        widget.addWidget(self.distribution)
        # 绑定计算按钮事件
        self.main.calculate_pushButton.clicked.connect(self.calculate)

    def calculate(self):
        init_amount = float(self.main.income_lineEdit.text())
        # 直接调用结果页的更新方法传递数值
        self.distribution.update_amount(init_amount)
        # 直接切到结果页索引1,不需要动态计算索引
        widget.setCurrentIndex(1)


class DistributionScreen(QtWidgets.QMainWindow):
    def __init__(self):
        super(DistributionScreen, self).__init__()
        loader = QtUiTools.QUiLoader()
        path = os.path.join(os.path.dirname(__file__), "dialog.ui")
        self.dialog = loader.load(path, self)
        # 绑定重置按钮事件
        self.dialog.reset_pushButton.clicked.connect(self.reset)

    # 新增单独的数值更新方法,每次计算时调用
    def update_amount(self, init_amount):
        # 更新初始金额标签
        self.dialog.initialAmount_label.setText(f"{init_amount:.2f}")
        print(f"Initial Amount = {init_amount:.2f}")
        # 更新10%标签
        ten = init_amount * 0.1
        print(f"10% = {ten:.2f}")
        self.dialog.label_10percent.setText(f"{ten:.2f}")
        # 更新20%标签
        twenty = init_amount * 0.2
        print(f"20% = {twenty:.2f}")
        self.dialog.label_20percent.setText(f"{twenty:.2f}")

    def reset(self):
        print("reset")
        # 切回输入页索引0
        widget.setCurrentIndex(0)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QStackedWidget()
    income = IncomeScreen()
    widget.addWidget(income)
    widget.show()
    try:
        sys.exit(app.exec_())
    except:
        print("Exiting")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:02