簡體   English   中英

如何從qml啟動Qthread?

[英]How Start a Qthread from qml?

我需要立即開始,然后從Qml File中停止QThread擴展類。 有什么解決辦法嗎? 這是我的課:

class SerialManager : public QThread
{
    Q_OBJECT
public:
    CircularList<unsigned char> buffer_[2];

signals:
    void dataReady(short *value,int len,unsigned short sample);

protected:
    void run();
};

如果您有如下的SerialManager:

class SerialManager : public QThread
{
    Q_OBJECT
public:
    CircularList<unsigned char> buffer_[2];

signals:
    void dataReady(short *value,int len,unsigned short sample);

protected:
    void run();
};

在main.cpp中添加以下代碼:

qmlRegisterType<SerialManager>("Device",1,0,"Serial");

然后在您的qml中執行以下操作:

 Component.onCompleted: {
            thread.start()
        }
 Component.onDestruction:
    {
        thread.quit()

    }

是的,您可以使用setContextProperty將實例公開給QML(請閱讀本文檔),然后通過用Q_INVOKABLE進行標記來調用所需的任何方法。 由於start()和quit()是插槽,因此您甚至不需要自己定義這些插槽。 這樣的事情應該起作用:

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread() : m_quit(false) {}

    Q_INVOKABLE void quit() {
        m_quit = true;
    }

protected:
    void run() {
        while (!m_quit)
            qDebug("Looping...");
    }

private:
    volatile bool m_quit;
};

開始時:

MyThread t;
QQuickView view;
[...]
view.engine()->rootContext()->setContextProperty("thread", &t);

在您的QML中:

thread.start()

要么

thread.quit()

作為另一個面向QML的替代解決方案,您可以導出一類實用程序來將您的工作從C ++轉換為QML,然后使用WorkerScript (請參閱此處的文檔)產生一個新線程並執行一堆JavaScript代碼來處理那堂課

WorkerScript的作用是使您可以:

使用WorkerScript在新線程中運行操作。 這對於在后台運行操作很有用,這樣就不會阻塞主GUI線程。

這樣會更干凈,您將避免在QML中處理令人討厭的start方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM