一週Qt使用小結
阿新 • • 發佈:2018-11-11
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
初創公司,沒有像大公司那樣的技術積累,很多東西需要自己從頭幹起,其中較大的一塊就是工具。想起剛剛參加工作半年的那會兒,老闆為了說服我寫工具,說讓我進工具組是培養我,寫了一個數據校驗工具後,我就死活再也不肯開發工具了,硬要繼續寫服務端程式。現在真是輪迴,這次我是發現,我們實在是太需要工具了,於是決定自己寫工具來提高公司的遊戲開發效率。
於是,首先用本週時間,開發了一個用於編輯遊戲layout的工具,使用的UI庫是Qt。這個雖然是在公司有在MacOS下使用工具的需求下做出的選擇,但是還是不得不說,對比3年前學習和使用MFC的經歷,總體來說是心情愉快了很多。
Qt的學習斷斷續續,雖然我的部落格中有個Qt的分類,但是在之前其實瞭解的還是比較淺的,除了大概翻看過《C++ GUI Qt 4程式設計》(第二版)一書,用Qt結合OpenGL做了一些小的動畫demo,基本沒有開發過啥實際的東西。說起來這還是第一次在工作中使用到Qt,中間多少還是走了一些彎路,也碰到過一些問題,這裡大概總結一下,想到哪就說到哪了。
- 很難避免要說的是與MFC的比較,但是我前面說了,我們公司用MacOS的人較多,跨平臺是硬指標,MFC無法選擇。至於其他類似的跨平臺庫wx等的選擇,見以前的文章。就中國目前的國情,已經自己較低的水平,為了避免口水站,這部分就省略了。
- 就使用體驗來說,Qt的確比MFC的設計好了很多,因為Qt原來就是個靠賣庫生存的公司,庫和API的設計就是公司的核心競爭力,要是設計的不好,公司就沒法生存了。所以感覺API的設計上的確是花了很多功夫的。(參考這個文章)signal/slot系統的存在的確讓設計靈活了很多,開發的過程中甚至都能讓思維更加一致和清楚,因為你在設計和使用某個類時,完全可以暫時不考慮其他類。(這是理想情況)設計時假如有模組化的思想,signal/slot可以很方便的用於模組間的解耦。
- Qt更加完全的面向物件,這點很多人都提到過,不過其實,我感覺有的時候這個面向物件甚至有些稍微過頭。
- 隨著學習的語言和各類框架,庫越來越多,越來越雜,慢慢感覺到其實光是學習某個東西都是瞭解的非常淺,只有切實的使用這個東西開發達到一定規模的工程時,才能慢慢的有所領悟,然後才能進一步的掌握。其實斷斷續續學Qt很久了,但是直到這一週(即使僅僅是一週時間,2千行多一點的程式碼規模)的密集開發,才感覺慢慢了解了一些東西。
- Qt的designer工具:基於一貫的習慣,不是太喜歡類似的工具(從MFC時代來的經驗),而是願意手工編碼,首先是感覺手工編碼時自己對程式碼更加了解,防止生成一對垃圾程式碼,不好懂,也難修改。其次是感覺手工編碼比用滑鼠去拖拽效率還能更高一些-_-!(這個是純個人意見...........)對於大量重複的操作,要麼抽象一下,要麼藉助神器vi........都不是啥問題。
- 幫助文件:MSDN是我見過最牛的,不過Qt的assist也不差了。
- Model/View的引入使得Table和list控制元件使用更加的方便,這個有人不同意,甚至形容其為“脫褲子放屁....”,我覺得是還沒有理解到底該怎麼使用。我剛開始的時候,使用Qt預定義的QStandardItemModel與QTreeView的組合,發現的確相當費勁,好端端的平白無故加入了Model的操作,還要關心Model與View之間的互動,而自己的真實資料又感覺直接儲存在QStandardItemModel的物件中使用非常不方便,還是需要額外再儲存一份,然後每次來回同步著呼叫,此時真是感覺Qt的Model/View設計的真廢。(對,當時我就是感覺Qt本身設計的廢,本身這種MVC的變種模式使用應該是要更方便才對)後來第二次開發另一個東西的時候,直接用QTableWidget,相當於是自己的資料+Widget的組合,用著是比較自然了,但是感覺還不是足夠的方便。然後查閱了一下資料,對其進行了重構,通過自己定義的Model來實現Qt中的Model/View,此時才感覺到使用的方便,這種使用方式,就和iPhone中的委託很像了,資料可以僅僅保留自己的一份,然後通過使用這些資料來實現自定義Model中的介面,任何時候我的修改都是直接針對於我自己的資料的,完全不用關心view層的事情,(最多是通知重新整理)不僅僅是隻保留了一份資料,而且在操作上帶來的極大的方便。
- Qt的XML介面實在算不上是方便的,假如排除有些類可以直接作為某些XML介面的引數的因素,很多其他的xml庫使用都要更加方便。(比如tinyxml和rapidxml)當然,其實對於簡單資料,個人更喜歡json。
- 一方面是為了學習,另一方面是為了減少型別轉換,我大量的使用了Qt的容器和String類,感覺與std的設計大同小異,但是演算法庫稍微弱一點。
- 繪圖時QImage+QPainter的組合非常方便,雖然我是做一個遊戲的layout編輯工具,但是完全不需要使用到opengl。(目前沒有考慮到半透明的情況)
- QDockWidget控制元件在Windows下的效果非常棒,但是MacOS下效果一般,不夠美觀,邊框的拖動響應也不是太好,特別是調節大小的滑鼠提示很難出來。
- 有意思的現象是Windows下的字型比Mac下略小,所以假如是固定座標的對話方塊(沒有用layout),最好是在Mac下設計,不然的話有可能在Mac下顯示不全。
- Qt程式的釋出,Windows下編譯Release版本後,拷貝需要的Qt Dll即可,Mac下對編譯好的app使用macdeployqt命令(甚至可以通過引數-dmg 打成dmg包)
-
自定義Model的data()函式,當role == Qt::EditRole時,顯示的是此格在被編輯時的內容。《C++ GUI Qt4程式設計》一書未描述,文件中也沒有詳細描述,因為剛開始編輯時總是會出現一點選編輯總是空的情況,自己猜的,不過還真正確。
beginInsertRows(parent, row + 1, row + count);
endInsertRows();
return true;
和
beginRemoveRows(parent, row , row + count - 1);
endRemoveRows();
return true;
但是還是需要自己實現,不然的話實現是空的,那麼是沒有刪除和新增效果的。相當不理解,那rowCount是幹啥用的?其實應該只需要update/refresh一下就好了。或者,emit一下Qt中已經有的rowsInserted或者rowsRemoved signal也就好了,但是在rowsInserted,rowsRemoved訊號的文件中明確的表示這兩個訊息不允許子類呼叫的,“It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.”
而insertRow和removeRow是呼叫insertRows和removeRows來實現的,(文件如此描述)所以我們不需要實現了。不知道哪種邏輯更為正確,插入多行是多次插入呢,(所以插入多行可以通過多次呼叫插入一行實現)還是插入一行是插入多行的特殊情況呢?(就如同Qt這樣反過來實現) beginMoveRows和endMoveRows系列就更有意思了,因為沒有moveRows用於過載..............那麼,這些protected的函式什麼時候呼叫呢?最後找到了layoutChanged訊號,發現只需要在改動後emit此訊號即可重新整理。並且insert和remove都可以實現。原來........Qt設計者眼中的update/refresh名字叫做layoutChanged.........相當暈。
使用QAction作為快捷鍵的時候,在一個列表空間中建立,發現無論如何都無法出發triggered訊號,最後只能在全應用程式的選單中新增action了事........這個比較困惑,也就是說沒有區域性快捷鍵? 對Qt的瞭解有限,使用一週,為了防止同一個坑掉進去兩次,特寫下一些東西作為回頭查閱的資料,覺得不對的請提出來。