我试图从另一个类访问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
小部件。我把课程分开了,因为我写的应用程序有几个窗口和一个带有" 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
返回一个空字符串。它不应该。关于代码结构的建议也是受欢迎的。谢谢!
答案 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_())