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
,它调用函数 initui
和 createmenus
。在接下来的 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_())
我正在尝试从另一个 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
,它调用函数 initui
和 createmenus
。在接下来的 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_())