使用 itemAt 从 QFormLayout 中的 QLineEdit 获取文本



我目前正在开发一个程序,在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()方法返回一个QLayoutItemQLayoutItem封装另一个布局或另一个小部件,然后要获取小部件(在您的情况下为 QLineEdit(,您必须使用 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_())
<</div> div class="one_answers">

好吧,我得到了一个稍微不同的答案,更像是答案的助手,但我拿了代码并做了以下操作:当打印文本失败时,我在这些坐标处打印了对象并得到了一个 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_())

仍然很好奇为什么以更难更复杂的方式进行?

最新更新