QLineEdit возвращает пустую строку - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь получить доступ к тексту, написанному в 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, который вызывает функции initui и createmenus. В следующем классе Container0 я реализую виджет QLineEdit. Я разделил классы, потому что приложение, которое я пишу, имеет несколько окон и панель инструментов с кнопками «Далее» и «Назад», которые заменяют 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 голосов
/ 03 мая 2018

Каждый раз, когда вы используете следующее выражение:

some_variable = Container0()

вы создаете новый контейнер, поэтому в вашем случае контейнер, созданный в __init__ из MainWindow, отличается от контейнера, созданного в методе export из Export. Поэтому, даже если вы поместите текст в главное окно, в другом контейнере нет текста.

Решение состоит в том, чтобы сделать testWidgets членом класса и передать текстовое содержимое для экспорта:

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