QLineEdit返回空字符串

时间:2018-05-03 11:13:55

标签: python pyqt menubar qlineedit

我试图从另一个类访问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。在下一个课程Container0中,我实现了QLineEdit小部件。我把课程分开了,因为我写的应用程序有几个窗口和一个带有" next"和"返回"按钮,将centralWidget更改为我保存下一个要显示的窗口的类。 (我希望这不是一个坏主意)

我想要实现的目标

目前,当我在QLineEdit中写一些内容然后转到菜单"文件 - >出口 - >保存"并插入一个路径,代码调用类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字符串。此外,这是处理多个窗口的正确方法吗?

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

1 个答案:

答案 0 :(得分:0)

每次使用以下表达式时:

some_variable = Container0()

您正在创建一个新容器,因此在您的情况下,__init__ MainWindow中创建的容器与export Export方法中创建的容器不同。因此,即使您在主窗口中放置文本,另一个容器中也没有文本。

解决方案是使类testWidgets成员并将文本内容传递给export:

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_())