QLineEdit returns 空字符串

QLineEdit returns empty string

我正在尝试从另一个 class 访问 QLineEdit 中编写的文本,但它返回一个空字符串。

这是一段简约的功能代码 (Python 2.7):

import sys

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.createmenus()
        self.initui()

        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)

        testWidgets = Container0()
        self.central_widget.addWidget(testWidgets)

    def initui(self):
        self.setWindowTitle("TestWindow")
        self.show()

    def createmenus(self):
        viewFile = self.menuBar().addMenu("File")

        expMenu = QMenu("Export", self)
        expAct = QAction("Save", self)
        expMenu.addAction(expAct)

        expMenu.triggered[QAction].connect(self.export_config)

        viewFile.addMenu(expMenu)

    def export_config(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self, "Save as", "C:/", "Text (*.txt);;All Files (*)",
                                              options=options)
        if fileName:
            Export().export(fileName)

class Container0(QWidget):
    def __init__(self):
        super(QWidget, self).__init__()

        self.mainlayout = QVBoxLayout(self)
        self.vbox_layout = QVBoxLayout()

        self.text1 = QLineEdit()
        print self.text1

        self.vbox_layout.addWidget(self.text1)
        self.mainlayout.addLayout(self.vbox_layout)

class Export():
    def export(self, path):
        tw = Container0()

        t1 = tw.text1
        t1text = t1.text()

        print t1
        print t1text
        print path

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关于代码:

首先,我创建 QMainWindow,它调用函数 inituicreatemenus。在接下来的 class Container0 中,我实现了 QLineEdit 小部件。我将 class 分开,因为我正在编写的应用程序有几个 windows 和一个带有 "next" 和 "back" 按钮的工具栏,它们将 centralWidget 更改为class 我保存了 window 接下来要显示的。 (我希望这不是个坏主意)

我想达到的目标

目前,当我在 QLineEdit 中写入内容,然后转到菜单 "File -> Export -> Save" 并插入路径时,代码会调用 class Export 及其函数export,它应该读取我在QLineEdit中写的字符串并将其打印在路径中。问题是我的 QLineEdit 输出是一个空字符串。此外,函数 Export 似乎从 QLineEdit 创建了另一个实例。当我调用 print self.text1:

时请注意不同的内存位置
<PyQt5.QtWidgets.QLineEdit object at 0x0000000002968B88>
<PyQt5.QtWidgets.QLineEdit object at 0x0000000002968DC8>
<PyQt5.QtWidgets.QLineEdit object at 0x0000000002968DC8>
                                                        ### <- This is the empty line
C:/123

这让我想知道如何在不创建另一个实例的情况下调用 QLineEdit 字符串。此外,这是处理多个 windows 的正确方法吗?

TL,DR: QLineEdit returns 一个空字符串。它不应该。也欢迎有关代码结构的建议。谢谢!

每次使用以下表达式:

some_variable = Container0()

您正在创建一个新容器,因此在您的情况下,在 MainWindow__init__ 中创建的容器不同于在 [=15] 的 export 方法中创建的容器=].因此,即使您在主 window 中放置文本,其他 Container 中也没有文本。

解决方案是让testWidgets成为class的成员,然后将文本内容传递给导出:

import sys

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.createmenus()
        self.initui()

        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)

        self.testWidgets = Container0()
        self.central_widget.addWidget(self.testWidgets)

    def initui(self):
        self.setWindowTitle("TestWindow")
        self.show()

    def createmenus(self):
        viewFile = self.menuBar().addMenu("File")

        expMenu = QMenu("Export", self)
        expAct = QAction("Save", self)
        expMenu.addAction(expAct)

        expMenu.triggered[QAction].connect(self.export_config)

        viewFile.addMenu(expMenu)

    def export_config(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self, "Save as", "C:/", "Text (*.txt);;All Files (*)",
                                              options=options)
        if fileName:
            Export().export(fileName, self.testWidgets.text1.text())

class Container0(QWidget):
    def __init__(self):
        super(QWidget, self).__init__()

        self.mainlayout = QVBoxLayout(self)
        self.vbox_layout = QVBoxLayout()

        self.text1 = QLineEdit()
        print(self.text1)

        self.vbox_layout.addWidget(self.text1)
        self.mainlayout.addLayout(self.vbox_layout)

class Export():
    def export(self, path, t1text):
        print(t1text)
        print(path)

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())