[英]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.