qml pyside 和开关

Posted

技术标签:

【中文标题】qml pyside 和开关【英文标题】:qml pyside and switches 【发布时间】:2011-09-06 00:22:03 【问题描述】:

我正在编写我的应用程序 Groundwork,并且我正在使用 pyside 来开发应用程序。 我唯一遇到的问题是激活 qml 开关。 目前我在 qml 文件中有:

signal buttonClicked;
//function start()text.text="started";buttonClicked()
Switch 
    id:switchComponent
    anchors.verticalCenterarent.verticalCenter;
    anchors.horizontalCenterarent.horizontalCenter;

//end of switch

Text 
    id:text

    color:"red"
    anchors.bottom: switchComponent.top
    anchors.horizontalCenter: switchComponent.horizontalCenter
    //text: switchComponent.checked ? "GROUNDWORK ON" & start() : "Press to Start"
    //text: switchComponent.checked ? "GROUNDWORK ON" && start() : "Press to Start"
    text: switchComponent.checked ? start() : "Press to Start"
    font.pixelSize: 30
    smooth:true

当应用程序启动时,按下switchedComponent将信号发送到python并且连接到信号的函数启动但开关永远不会变成蓝色并且文本不会变为“已启动”。您知道应用程序正在运行的唯一方法是大约 10 秒后系统会要求您关闭应用程序。如果您按否,则该应用程序将正常运行。

有人知道为什么会这样吗?我基本上只是希望在 python 函数开始运行之前激活开关和文本,以便用户知道发生了什么。 编辑:完整的 qml 文件可以在这里找到。 https://projects.developer.nokia.com/airplay/browser/groundwork/qml/main.qml 我认为这只是将 pyside 与 qml 一起使用的一部分,即 ui 线程处理python函数时阻塞。

【问题讨论】:

【参考方案1】:

我对你的代码有点困惑(而且 Switch 不见了)所以我只能猜测。

在 Text 组件中调用 start() 对我来说似乎是错误的。应该只是

Text 
    ...
    text: switchComponent.checked ? "GROUNDWORK ON" : "Press to Start"

文本不必再显式设置,开关必须触发组件的信号。

Switch 
    onCheckedChanged: 
        if (checked) 
            buttonClicked()
        
    

这只是我对您代码的理解的猜测。

【讨论】:

你说的很有道理,我试着按照你的方式去做,但我得到了相同的结果。该程序有效,但 Gui 没有响应。我认为 qml 的主 gui 线程被阻塞,等待 python 任务完成。我想我将不得不在我的主要任务和被按下的开关之间放置一个虚拟任务。无论如何,现在我知道如何使用按钮检查状态和状态,非常感谢。

以上是关于qml pyside 和开关的主要内容,如果未能解决你的问题,请参考以下文章

关于 QML 和 PySide2 的几个问题

PySide2/QML 填充和动画 Gridview 模型/委托

安卓上的 PySide QML 项目

PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?

使用 PySide2 将 python 信号连接到 QML ui 插槽

如何使用 PySide 控制 QML UI?