[問題] Qt QuickItem
開發平台(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
10/30 08:03, 1F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章