使用QWizard的registerField时如何避免QLineEdit内容被自动清空
问题根源
QWizard 的字段注册机制默认会在每次进入关联页面时,用字段的初始值覆盖绑定控件的内容。你在Page2输入的内容实际已经正确存储到field('entry')中了,只是再次进入Page2时,默认初始化逻辑没有读取已有的字段值回显,直接用空的初始值覆盖了输入框内容。
解决方法
以下两种方案都可以保留registerField的使用,同时避免输入内容被清空:
方案1:重写页面初始化方法回显内容(最推荐)
在Page2类中新增initializePage方法,每次进入页面时主动把已存储的字段值回填到输入框即可,修改后的Page2代码如下:
class Page2(QtWidgets.QWizardPage): def __init__(self, parent=None): super(Page2, self).__init__(parent) self.lineedit = QtWidgets.QLineEdit() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.lineedit) self.setLayout(layout) self.registerField('entry',self.lineedit) # 新增页面初始化逻辑 def initializePage(self) -> None: super().initializePage() # 读取已保存的字段值回显到输入框 saved_value = self.field('entry') if saved_value: self.lineedit.setText(saved_value)
方案2:显式指定字段绑定的触发信号
注册字段时显式指定绑定的属性和内容变化信号,避免默认绑定逻辑的异常覆盖:
把原来的注册行替换为以下代码即可:
self.registerField('entry', self.lineedit, "text", QtCore.SIGNAL("textEdited(QString)"))
该方案的原理是告诉QWizard只有用户主动编辑输入框触发textEdited信号时才更新字段值,不会在页面初始化时主动用初始值覆盖控件内容。
内容的提问来源于stack exchange,提问作者inxp
相关产品推荐
相关产品推荐

