Maya中使用PySide2如何获取两个不同窗口QLineEdit的输入文本
PySide2多窗口QLineEdit输入获取问题解决方案
问题核心原因
- 你的猜测完全正确:
put_first_and_second_text_together全局函数中每次触发都会重新实例化FirstWindow和SecondWindow类,得到的是全新的、处于默认值状态的窗口对象,和用户已经打开、输入过内容的活动窗口实例没有关联,所以永远只能拿到默认文本 - 额外存在的错误:
SecondWindow类的__init__方法默认参数写为parent=FirstWindow(),会在类定义阶段就生成一个独立的FirstWindow实例,不是实际启动的第一个活动窗口
修正后完整代码
from PySide2 import QtWidgets class FirstWindow(QtWidgets.QDialog): def __init__(self, parent=None): super(FirstWindow, self).__init__(parent) # Set the Title of Window self.setWindowTitle("First Window") # Create QlineEdit self.lineedit = QtWidgets.QLineEdit() # Create button self.pushbutton = QtWidgets.QPushButton('Create Second Window') # Layout form_layout = QtWidgets.QFormLayout() form_layout.addRow(self.lineedit) form_layout.addRow(self.pushbutton) main_layout = QtWidgets.QVBoxLayout(self) main_layout.addLayout(form_layout) # Connections self.lineedit.setText('First_Text') self.pushbutton.clicked.connect(self.open_SecondWindow) def open_SecondWindow(self): # 把当前第一个窗口的实例作为父对象传给第二个窗口 Window_ui = SecondWindow(parent=self) Window_ui.show() class SecondWindow(QtWidgets.QDialog): # 修正parent默认参数,不要在默认值里实例化类 def __init__(self, parent=None): super(SecondWindow, self).__init__(parent) # Set the Title of Window self.setWindowTitle("Second Window") # Create QlineEdit self.lineedit = QtWidgets.QLineEdit() # Create button self.pushbutton = QtWidgets.QPushButton('Print First + Second Text') # Layout form_layout = QtWidgets.QFormLayout() form_layout.addRow(self.lineedit) form_layout.addRow(self.pushbutton) main_layout = QtWidgets.QVBoxLayout(self) main_layout.addLayout(form_layout) # Connections self.lineedit.setText('Second_Text') # 绑定到当前类的方法,不需要全局函数 self.pushbutton.clicked.connect(self.put_first_and_second_text_together) def put_first_and_second_text_together(self): # 通过self.parent()直接获取已经打开的第一个窗口实例 first_text = self.parent().lineedit.text() # self就是当前打开的第二个窗口实例,直接取输入内容 second_text = self.lineedit.text() print(first_text + second_text) if __name__ == "__main__": try: FirstWindow_dialog.close() FirstWindow_dialog.deleteLater() except: pass FirstWindow_dialog = FirstWindow() FirstWindow_dialog.show()
逻辑说明
- 打开第二个窗口时传入当前第一个窗口的实例作为父对象,第二个窗口可以随时通过
self.parent()访问第一个窗口的所有公开属性和控件 - 打印逻辑放到第二个窗口的类内部方法,直接用
self获取当前第二个窗口的输入内容,不需要额外实例化窗口,拿到的就是用户当前输入的实时值
内容的提问来源于stack exchange,提问作者Lens
相关产品推荐
相关产品推荐

