我目前正在开发一个程序,在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()
方法返回一个QLayoutItem
,QLayoutItem
封装另一个布局或另一个小部件,然后要获取小部件(在您的情况下为 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_())
仍然很好奇为什么以更难更复杂的方式进行?