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

仍然好奇为什么越难越复杂?