ETH官方钱包

創(chuàng)作內(nèi)容

2 GP

眼殘、臉腫、鴨子

作者:likwueron│2015-06-19 10:18:54│巴幣:4│人氣:132
我就在想,如果每次加入新的類別我就要改函式庫那也太蠢了,我該找個(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é)鴨子叫。
引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=2871244
Some rights reserved. 姓名標(biāo)示-非商業(yè)性 2.5 臺灣

相關(guān)創(chuàng)作

同標(biāo)籤作品搜尋:Qt|C++|鴨子型別|Lua|腳本

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★iqandadie 可決定是否刪除您的留言,請勿發(fā)表違反站規(guī)文字。

前一篇:被敲的眼冒金星... 後一篇:蘇軾論...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網(wǎng)路標(biāo)準(zhǔn),可能無法使用新的應(yīng)用程式來呈現(xiàn)網(wǎng)站內(nèi)容,在瀏覽器支援度及網(wǎng)站安全性的雙重考量下,為了讓巴友們有更好的使用體驗(yàn),巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現(xiàn)和功能。
屆時(shí)建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業(yè)系統(tǒng)版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續(xù)經(jīng)營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學(xué)】