QT程序员搬到macOS平台的开发初体验
这篇随笔就是记录了我从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++的,所以上面注释里的用词可能会不专业。
对于如果像实现微信的那种分栏式的标题栏,就需要再研究咯~还需继续精进。