繁体   English   中英

使用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()方法返回一个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_())

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM