如何刷新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
相关产品推荐
相关产品推荐

