使用 itemAt 从 QFormLayout 中的 QLineEdit 获取文本
Get text from a QLineEdit in a QFormLayout using itemAt
我目前正在开发一个程序,在 QFormLayout 中,我有两列 QLineEdits。我将第一列存储在列表中(这意味着它们很容易访问),而第二列未存储在变量或列表中。我正在尝试访问第二列中 QLineEdits 的文本,但总是 运行 出错。
我目前无意使用第二个列表/字典来授予对第二列的访问权限,因为使用 getWidgetPosition 和 itemAt 函数应该提供访问这些值的更简单途径。
from PyQt5.QtWidgets import *
app = QApplication([])
window = QWidget()
layout = QFormLayout()
entry1 = QLineEdit()
layout.addRow(entry1,QLineEdit())
ePos = layout.getWidgetPosition(entry1)
text = layout.itemAt(ePos[1],ePos[0]+1).text()
print(text)
window.setLayout(layout)
window.show()
app.exec_()
上面的代码只是一个接近于我尝试使用的代码的例子。出于某种原因,无法访问 QLineEdits 第二列的文本,因为我收到此错误消息:
Traceback (most recent call last):
File "sampleProblem.py", line 11, in <module>
text = layout.itemAt(ePos[1],ePos[0]+1).text()
AttributeError: 'QWidgetItem' object has no attribute 'text'
itemAt()
method of the layouts returns a QLayoutItem
, the QLayoutItem
encapsulates another layout or another widget, then to get the widget (in your case QLineEdit) you must use the widget()
方法,然后就是获取文本。
import sys
from PyQt5 import QtWidgets
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
layout = QtWidgets.QFormLayout(window)
entry1 = QtWidgets.QLineEdit()
layout.addRow(entry1, QtWidgets.QLineEdit())
i, j = layout.getWidgetPosition(entry1)
widget_item = layout.itemAt(i, j+1)
widget = widget_item.widget()
text = widget.text()
print(text)
window.show()
sys.exit(app.exec_())
好吧,我得到了一个稍微不同的答案,更多的是对答案的帮助,但我获取了代码并执行了以下操作:当打印文本失败时,我在这些坐标处打印了对象并得到了 PyQt5.QtWidgets.QWidgetItem。然后我通过查找 QWidgetItem 并获取其已知属性之一并打印它来验证这一点。所以是的,虽然 eyllanesc 的回答很可能是正确的,但我希望这些添加的信息能对您有所帮助。
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.LaidOut = QFormLayout()
self.Entry = QLineEdit()
self.LaidOut.addRow(self.Entry, QLineEdit())
self.setLayout(self.LaidOut)
ePos = self.LaidOut.getWidgetPosition(self.Entry)
print('EPos :',ePos)
# text = self.LaidOut.itemAt(ePos[1],ePos[0]+1).text()
print('Text :',self.LaidOut.itemAt(ePos[1],ePos[0]+1).isEmpty())
if __name__ == "__main__":
MainThred = QApplication([])
MainGUI = MainWindow()
MainGUI.show()
sysExit(MainThred.exec_())
仍然好奇为什么越难越复杂?
我目前正在开发一个程序,在 QFormLayout 中,我有两列 QLineEdits。我将第一列存储在列表中(这意味着它们很容易访问),而第二列未存储在变量或列表中。我正在尝试访问第二列中 QLineEdits 的文本,但总是 运行 出错。
我目前无意使用第二个列表/字典来授予对第二列的访问权限,因为使用 getWidgetPosition 和 itemAt 函数应该提供访问这些值的更简单途径。
from PyQt5.QtWidgets import *
app = QApplication([])
window = QWidget()
layout = QFormLayout()
entry1 = QLineEdit()
layout.addRow(entry1,QLineEdit())
ePos = layout.getWidgetPosition(entry1)
text = layout.itemAt(ePos[1],ePos[0]+1).text()
print(text)
window.setLayout(layout)
window.show()
app.exec_()
上面的代码只是一个接近于我尝试使用的代码的例子。出于某种原因,无法访问 QLineEdits 第二列的文本,因为我收到此错误消息:
Traceback (most recent call last):
File "sampleProblem.py", line 11, in <module>
text = layout.itemAt(ePos[1],ePos[0]+1).text()
AttributeError: 'QWidgetItem' object has no attribute 'text'
itemAt()
method of the layouts returns a QLayoutItem
, the QLayoutItem
encapsulates another layout or another widget, then to get the widget (in your case QLineEdit) you must use the widget()
方法,然后就是获取文本。
import sys
from PyQt5 import QtWidgets
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
layout = QtWidgets.QFormLayout(window)
entry1 = QtWidgets.QLineEdit()
layout.addRow(entry1, QtWidgets.QLineEdit())
i, j = layout.getWidgetPosition(entry1)
widget_item = layout.itemAt(i, j+1)
widget = widget_item.widget()
text = widget.text()
print(text)
window.show()
sys.exit(app.exec_())
好吧,我得到了一个稍微不同的答案,更多的是对答案的帮助,但我获取了代码并执行了以下操作:当打印文本失败时,我在这些坐标处打印了对象并得到了 PyQt5.QtWidgets.QWidgetItem。然后我通过查找 QWidgetItem 并获取其已知属性之一并打印它来验证这一点。所以是的,虽然 eyllanesc 的回答很可能是正确的,但我希望这些添加的信息能对您有所帮助。
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.LaidOut = QFormLayout()
self.Entry = QLineEdit()
self.LaidOut.addRow(self.Entry, QLineEdit())
self.setLayout(self.LaidOut)
ePos = self.LaidOut.getWidgetPosition(self.Entry)
print('EPos :',ePos)
# text = self.LaidOut.itemAt(ePos[1],ePos[0]+1).text()
print('Text :',self.LaidOut.itemAt(ePos[1],ePos[0]+1).isEmpty())
if __name__ == "__main__":
MainThred = QApplication([])
MainGUI = MainWindow()
MainGUI.show()
sysExit(MainThred.exec_())
仍然好奇为什么越难越复杂?