PyQt跨文件类属性访问问题:将A窗口输入同步到B窗口标签
PyQt跨窗口同步输入内容至标签文本
需求:在PyQt项目中,实现跨文件访问A.py中Ui_Form类的self.lineEdit属性,将用户在A窗口输入的内容设置为B窗口Ui_Form类的self.label文本。
现有代码
A.py
from PyQt6 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(203, 146) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.lineEdit = QtWidgets.QLineEdit(Form) self.lineEdit.setObjectName("lineEdit") self.verticalLayout.addWidget(self.lineEdit) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) self.pushButton.clicked.connect(self.open_other_window) self.pushButton.clicked.connect(Form.close) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.pushButton.setText(_translate("Form", "Enter")) def open_other_window(self): import B self.window = QtWidgets.QWidget() self.ui = B.Ui_Form() self.ui.setupUi(self.window) self.window.show() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec())
B.py
from PyQt6 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 300) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(Form) self.label.setText("Default Text") self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec())
已尝试的无效方法
- 方法1:在B.py中实例化新的A窗口对象获取文本
# B.py中添加的方法 def change_text(self): import A win = QtWidgets.QWidget() obj = A.Ui_Form() obj.setupUi(win) txt = obj.lineEdit.text() self.label.setText(txt)
问题:新实例化的A窗口是空白的,并非用户正在操作的窗口实例,无法获取真实输入内容。
- 方法2:在A.py中提前定义静态变量,B.py导入该变量
# A.py中添加的代码 win = QtWidgets.QWidget() obj = Ui_Form() obj.setupUi(win) input_txt = obj.lineEdit.text() # B.py中添加的方法 def change_text(self): import A txt = A.input_txt self.label.setText(txt)
问题:input_txt是窗口初始化时的空值,不会随用户输入动态更新,导入的是静态固定值。
正确解决方案
核心思路:在打开B窗口时,直接从当前A窗口的lineEdit获取实时文本,传递给B窗口的label。
修正后的A.py
修改open_other_window方法,在显示B窗口前设置其label文本:
def open_other_window(self): import B # 获取当前lineEdit的输入内容 input_text = self.lineEdit.text() self.window = QtWidgets.QWidget() self.ui = B.Ui_Form() self.ui.setupUi(self.window) # 直接设置B窗口的label文本 self.ui.label.setText(input_text if input_text else "Default Text") self.window.show()
(可选)优化方案:给B窗口添加专用方法
如果需要更灵活的文本设置,可以在B.py中添加一个设置文本的方法:
# B.py中添加方法 def set_label_text(self, text): self.label.setText(text if text else "Default Text")
然后在A.py的open_other_window中调用:
def open_other_window(self): import B input_text = self.lineEdit.text() self.window = QtWidgets.QWidget() self.ui = B.Ui_Form() self.ui.setupUi(self.window) self.ui.set_label_text(input_text) self.window.show()
这样点击A窗口的按钮后,B窗口的label就会同步显示用户在A窗口输入的内容。
内容的提问来源于stack exchange,提问作者user143114114
相关产品推荐
相关产品推荐

