You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:51:21