如何使用PyQt5从.qml文件中获取单选按钮选中状态值
如何使用PyQt5从.qml文件中获取单选按钮的值?
对应的.qml文件内容如下:
import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { visible: true width: 600 height: 500 title: "HelloApp" RadioButton { id: button1 text: "1" objectName: "radio_button" } TextInput { id: text_input objectName: "Textinput" x:300 y:300 width: 80 height: 20 } Button { id: button_execute x: 158 y: 341 width: 211 height: 36 text: qsTr("Execute") onClicked: { con.on_execute() } } }
用于读取该.qml文件的Python代码如下:
import sys from os.path import abspath, dirname, join from PyQt5.QtGui import QGuiApplication from PyQt5.QtQml import QQmlApplicationEngine from PyQt5.QtCore import QObject, pyqtSlot class Bridge(QObject): @pyqtSlot() def on_execute(self): win = engine.rootObjects()[0] # 这里已经可以正确获取文本输入框的值 text_val = win.findChild(QObject, "Textinput").property("text") # 待实现:获取单选按钮的选中状态 app = QGuiApplication(sys.argv) if __name__ == '__main__': # 加载qml文件 engine = QQmlApplicationEngine() context = engine.rootContext() bridge = Bridge() context.setContextProperty("con", bridge) qmlFile = join(dirname(__file__), 'qml_test_1.qml') engine.load(abspath(qmlFile)) if not engine.rootObjects(): sys.exit(-1) sys.exit(app.exec_())
目前上述代码已可成功获取TextInput组件的text属性值,但尝试通过objectName查找组件的方式获取RadioButton是否选中的状态时无法生效,请问应当如何正确判断单选按钮的选中状态?
解决方法
Qt Quick Controls 2的RadioButton选中状态存储在checked布尔属性中,和获取text属性的逻辑完全一致:通过objectName找到单选按钮实例后,调用property("checked")即可拿到状态,返回True代表选中,False代表未选中。
修正后的on_execute方法代码如下:
@pyqtSlot() def on_execute(self): win = engine.rootObjects()[0] # 获取文本输入框内容 text_val = win.findChild(QObject, "Textinput").property("text") # 获取单选按钮选中状态 radio_btn = win.findChild(QObject, "radio_button") is_radio_checked = radio_btn.property("checked") # 后续可以直接使用is_radio_checked做逻辑判断 print(f"输入框内容:{text_val},单选按钮是否选中:{is_radio_checked}")
如果按照上述写法仍然获取不到,排查两个常见问题:
- 查找时传入的objectName字符串和QML中定义的完全一致,注意大小写、下划线不要写错
- 控件查找逻辑不要在
engine.load()执行完成前调用,当前写在点击槽函数中的时机是正确的,不存在加载未完成的问题
如果是多个互斥的单选按钮,有两种处理方式:
- 给每个RadioButton设置独立的objectName,分别读取
checked属性判断选中项 - 给单选按钮组绑定
ButtonGroup,给ButtonGroup设置objectName后读取其checkedButton属性,直接拿到当前选中的单选按钮实例
内容的提问来源于stack exchange,提问作者SOORAJ M
相关产品推荐
相关产品推荐

