在 Python 中访问 QML TextField 值

Posted

技术标签:

【中文标题】在 Python 中访问 QML TextField 值【英文标题】:Accessing QML TextField value in Python 【发布时间】:2015-12-29 15:13:19 【问题描述】:

我在 QML 中有一个带有两个 TextField 的表单。如何访问 Python 中字段中输入的值?

我正在使用 PyQt5.5 和 Python3。

import sys
from PyQt5.QtCore import QObject, QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView
from PyQt5.QtQml import QQmlApplicationEngine


if __name__ == '__main__':
    myApp = QApplication(sys.argv)

    engine = QQmlApplicationEngine()
    context = engine.rootContext()
    context.setContextProperty("main", engine)

    engine.load('basic.qml')

    win = engine.rootObjects()[0]
    button = win.findChild(QObject, "myButton")
    def myFunction():
        print("handler called")
        foo = win.findChild(QObject, "login")
        print(dir(foo))
        print(foo.text)
    button.clicked.connect(myFunction)
    win.show()

    sys.exit(myApp.exec_())

basic.qml

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow 
    width: 250; height: 175

    Column 
        spacing: 20
        TextField 
            objectName: "login"
            placeholderText: qsTr("Login")
            focus: true
        

        TextField 
            placeholderText: qsTr("Password")
            echoMode: TextInput.Password
        

        Button 
            signal messageRequired
            objectName: "myButton"
            text: "Login"
            onClicked: messageRequired()
        
    

控制台

Traceback (most recent call last):
  File "working.py", line 25, in myFunction
    print(foo.text)
AttributeError: 'QQuickItem' object has no attribute 'text'
fish: “python working.py” terminated by signal SIGABRT (Abort)

【问题讨论】:

【参考方案1】:

您需要调用对象的property() 方法来获取所需的属性。

在您的示例中,您需要调用:

print(foo.property("text"))

而不是print(foo.text)

请注意,如果属性不存在,property() 将返回 None

【讨论】:

以上是关于在 Python 中访问 QML TextField 值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PySide 访问 QML\QtQuick 控件?

使用 QAbstractListModel 从 python 访问 QML 中的列表元素

pyqt5 孩子使用 qml 文件访问

如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

在PyQt中创建MapQuickItem并将其添加到Map中

在 Qt/QML 中访问/修改一个类型的所有实例