我就在想,如果每次加入新的類別我就要改函式庫那也太蠢了,我該找個(gè)方法處理這件事情。
沒錯(cuò),
我找到了。
啊X的,那不是QtLua內(nèi)建的功能嗎?那我之前是在幹麻?
所以我現(xiàn)在雙頰都腫腫的,不過只有左邊是因?yàn)檫@件事,右邊是因?yàn)镾team夏日特賣。
不過我還是會繼續(xù)製作fork,因?yàn)橛行┕δ芸磥響?yīng)該是原本沒提供的,應(yīng)該啦。
我們在腳本環(huán)境中可以植入一個(gè)預(yù)設(shè)的print()函式,但很可惜的是它只會印出物件的位址。
嗯,我們要如何讓它顯示我們想到的字,就像以前QScript的時(shí)候一樣?
最後我追到了QObjectWrapper.get_value_str()
第一個(gè)會想到的是寫個(gè)類別繼承它,然後改寫get_value_str(),不過就卡在我們要怎樣讓它使用我們的Wrapper而不是預(yù)設(shè)的這個(gè)。
換個(gè)想法吧,利用
上次學(xué)到的,使用qt_metacall的方法:
我們先取物件的toString()的index,然後再呼叫它。
//_obj 是被包裝的物件,也就是實(shí)際上的物件
//_indexOfToString = _obj->metaObject()->indexOfMethod("toString()");
QString result;
void *args[1] = {static_cast<void*>(&result)};
_obj->qt_metacall(QMetaObject::InvokeMetaMethod, _indexOfToString, args);這樣一來,只要該類別是QObject的子類別,而且有實(shí)作QString toString()這樣的slot(或標(biāo)上Q_INVOKABLE)就可以輸出自訂的訊息了。
寫到這邊就可以非常明顯的發(fā)現(xiàn),Qt利用Meta Object System實(shí)作出類似
鴨子型別(duck typing)的功能。
我們不在乎你的類別為何(好吧,至少要是繼承自QObject),只要有QString toString()就行了。
以前真的很難想像C++也可以學(xué)鴨子叫。