這篇隨筆就是記錄了我從windows開發,搬到mac上開發,過程中的一些感想和體驗,也記錄一下學到的新知識。
作為一個QT程序員(不我的老本行是C++!),搬到macOS平台,繼續用QT,可以直接繼續用QtCreator跨平台當然很開心,但是作為一個有追求的程序員,只是使用QT的跨平台部分是遠遠不夠的。
mac上的程序有很多獨特的平台特性,如果只是單純依賴QT的跨平台特性,是做不出符合平台特性的好應用的。
即使沒有平台特性的追求,有時也不得不學習一些平台相關的內容。
例如前一陣編pjsip的工程,里面官方demo里有一個qt控件包含着跨平台特性,在windows下調用的Windows API,而在mac下調用的Cocoa相關的庫,直接用到了obj-c的內容,一開始直接拿到mac平台下會發現工程編譯不過,而網上的相關資料十分有限(在mac上用QT開發具有mac特性的程序開發者實在很少),最終一通研究,發現只要將調用了obj-c的文件從cpp后綴改成mm即可。如果是obj-c的開發者,想到這個可能是輕而易舉,但是對於沒有過任何經驗的我來說,還是廢了一番功夫。
再說一下關於QT里面調用obj-c這一部分,如果是一個對界面沒有太高要求的應用,其實基本是接觸不到obj-c的,但是一旦稍微有點要求,比如說需要將標題欄變為透明。
QT原生效果:
標題欄透明的效果:
由於標題欄這種是系統相關的窗口組成部分,必然會涉及到平台特性,而有時候,只需要簡單調幾行代碼就可以實現。
又因為obj-c是從c發展上來的語言,C++調起來還是蠻方便的,只需要在窗口的構造函數里添加一下幾行代碼就可以實現上面的效果:
NSWindow *parent1 = [(NSView*)winId() window]; //使用QT的winId()獲取窗口句柄,轉換為NSView類型,再調用其windows方法獲取對應的窗口 parent1.titlebarAppearsTransparent=YES; //設置標題欄為透明
由於我本身是搞C++的,所以上面注釋里的用詞可能會不專業。
對於如果像實現微信的那種分欄式的標題欄,就需要再研究咯~還需繼續精進。