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