从Qt Quick WorkerScript调用Python方法

从Qt Quick WorkerScript调用Python方法,python,qml,qt5,pyqt5,qtquick2,Python,Qml,Qt5,Pyqt5,Qtquick2,如何从Qt-QuickWorkerScript调用Python方法 序言: 通过注册QObject的子类,我成功地从我的QML应用程序访问了我的Python方法: 类Foo(QtCore.QObject): @QtCore.pyqtSlot() def bar(自): 在这里做事 app=QtGui.qgui应用程序([]) QtQml.qmlRegisterType(Foo,'Foo',1,0,'Foo') #更多样板Qt/Qt快速 因此,在我的QML应用程序中,我可以成功地调用Foo.ba

如何从Qt-Quick
WorkerScript
调用Python方法

序言: 通过注册
QObject
的子类,我成功地从我的QML应用程序访问了我的Python方法:

类Foo(QtCore.QObject):
@QtCore.pyqtSlot()
def bar(自):
在这里做事
app=QtGui.qgui应用程序([])
QtQml.qmlRegisterType(Foo,'Foo',1,0,'Foo')
#更多样板Qt/Qt快速
因此,在我的QML应用程序中,我可以成功地调用
Foo.bar()

据我所知,我应该从
WorkerScript
调用任何长时间运行的函数

问题: 如何使用
WorkerThread
在后台线程中运行
Foo.bar()

WorkerScript
s无法使用
import
语法,因此我不确定在没有导入的情况下如何访问
Foo

更新:
我需要UI能够显示来自
Foo.bar()
的进度,因为该函数需要一点时间并执行多项操作。

将信息发送到的唯一方法是:

发送消息(jsobject消息)

将给定消息发送到另一个线程中的工作脚本处理程序。 另一个工作脚本处理程序可以通过 onMessage()处理程序

消息对象只能包含以下类型的值:

  • 布尔值、数字、字符串
  • JavaScript对象和数组
  • ListModel对象(不允许任何其他类型的QObject*)
所有对象和数组都会复制到消息中。除了ListModel对象之外,其他线程对消息中传递的对象所做的任何修改都不会反映在原始对象中

但是,由于它读取所有的元素(ListModel类型的元素除外),因此不可能使用从QObject类或其方法继承的任何对象


您可以使用
pyqtProperty
进行进程,以便将其公开给
QML
,并使用插槽通过
QRunnable
使用
QThreadPool
从另一个线程更新其值,更新通过
QMetaObject::invokeMethod()

然后可以通过run_bar()启动它,并通过progress属性显示它:

import QtQuick.Controls 1.4
import QtQuick.Layouts 1.0
import QtQuick 2.0
import Foo 1.0

ApplicationWindow{
    width: 300
    height: 300
    visible: true

    Text{
        id:txt
        text: "press me to start"
        anchors.fill: parent
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
    }

    Foo{
        id: foo
        onProgressChanged: txt.text= progress
    }

    MouseArea {
        anchors.fill: parent
        onClicked: foo.run_bar()
    }

    statusBar: StatusBar {
        RowLayout {
            anchors.fill: parent
            ProgressBar {
                value: foo.progress
                maximumValue: 100
                anchors.fill: parent
            }
        }
    }
}

完整的例子可以在下面的

中找到,这是否意味着你可以在Qt快速的背景线程中运行JavaScript,而不是Python或C++?您可以在
WorkerThread
中运行后端代码似乎是合乎逻辑的。如果我使用
QThread
,我是否能够向UI发送信号,比如更新状态栏
Foo.bar()
需要做几件事,我想让界面显示它在做什么
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.0
import QtQuick 2.0
import Foo 1.0

ApplicationWindow{
    width: 300
    height: 300
    visible: true

    Text{
        id:txt
        text: "press me to start"
        anchors.fill: parent
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
    }

    Foo{
        id: foo
        onProgressChanged: txt.text= progress
    }

    MouseArea {
        anchors.fill: parent
        onClicked: foo.run_bar()
    }

    statusBar: StatusBar {
        RowLayout {
            anchors.fill: parent
            ProgressBar {
                value: foo.progress
                maximumValue: 100
                anchors.fill: parent
            }
        }
    }
}