創作內容

2 GP

眼殘、臉腫、鴨子

作者:likwueron│2015-06-19 10:18:54│巴幣:4│人氣:116
我就在想,如果每次加入新的類別我就要改函式庫那也太蠢了,我該找個方法處理這件事情。
沒錯,我找到了
啊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++也可以學鴨子叫。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2871244
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

同標籤作品搜尋:Qt|C++|鴨子型別|Lua|腳本

留言共 0 篇留言

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

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

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

追蹤私訊切換新版閱覽

作品資料夾

xzp83502在線巴哈們
果果日記小屋更新中~ 歡迎進來參觀 謝謝^^看更多我要大聲說昨天22:18


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

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