[問題] Qt QuickItem

看板C_and_CPP (C/C++)作者 (東逼)時間13年前 (2012/10/30 00:32), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Qt 5.0 問題(Question): 真是不好意思 又來請教大家問題了 =.=" 是這樣子的 我在看Qt5.0的例子的時候 有看到有個例子是可以自訂class給 qml使用 試著改寫一下 程式大概的架構是這樣: (憑印象打@@) //myclass.cpp void MyClass::MyClass() { ... setFlag(ItemHasContents); ... } void MyClass::itemChange(ItemChange change, const ItemChangeData &) { if (change == ItemSceneChange) { QQuickCanvas *c = canvas(); connect(c, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection); c->setClearBeforeRendering(false); } } void MyClass::paint() { .... .... } // qml file Item { width: 400; height: 240 MyClass { SequientialAnimation on t { // t 是MyClass裡面的變數,可以給qml使用 .... } } .... } 其中MyClass是一個繼承自 QQuickItem的class 我看Qt的例子 發現當在qml裡的值改變的時候 會自動去呼叫 paint()這個函數 再仔細去看一下 發現只要呼叫 update()這個API的時候 就會去呼叫paint() (此API屬於QQuickItem) 現在問題來了 我有一個來自外部thread的API 我希望每當這個API被呼叫的時候 paint()也能被呼叫 形式大概是長這樣子 //c++ file void MyClass::test() { update(); } void get_data_from_thread(int size, char* buffer) { extern MyClass* myclass; ... ... //myclass->paint(); //這樣編譯器會直接報錯 myclass->update(); //compile ok,但執行時不會觸發paint() //myclass->test(); //這樣也不行 } 即使是在MyClass裡其他的函數呼叫update()也是可以觸發paint() 例如說在test()裡呼叫update()是可以的 但是在get_data_from_thread()裡呼叫 update(),並不會觸發paint() 即使改用myclass->test()也是不行 上網查一下資料 好像是update()不能在其他thread裡呼叫 不是很確定以上的觀念或寫法哪裡有誤 想請問大家有甚麼其他方法可以觸發paint()呢? 有想過用QTimer來做 但是thread執行時間不固定~所以似乎也不可行? 補充一下 雖然我用的是Qt5 但看一下 QQuickItem似乎是從QDeclarativeItem延伸來的 所以若有解法的話應該也差不多? 總之在此也先謝謝各位的幫忙了 也請大家不吝指教~ 謝謝大家 -- ▍ ▍ ╯╰ ╯╰ ◢◣ ◢◣ 我最愛的 柏柏龍~ 柏柏龍~ ◢██◣ ╮╭ ▎▎╮╭ ▎▎ 柏柏龍~ 柏柏龍~ ⊙ ⊙ ⊙ ⊙ 人人心中都有柏柏龍~ ≡ ▼ ≡ ▲▲ ● ● ≡ ▼ ≡ ■ ■ ■ ■ 憤怒就永遠不會消失~ ⊙⊙ ≡皿 ≡ 炸是最美的擁有~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.159.175

10/30 08:03, , 1F
用 signal 連, 不要直接呼叫
10/30 08:03, 1F
文章代碼(AID): #1GZg-kWw (C_and_CPP)
文章代碼(AID): #1GZg-kWw (C_and_CPP)