Qt3和Qt4两个版本存在很大的差异,这也给我们使用带来了很大的挑战。下面我结合一下我在实际编程过程中遇到的问题来总结一下如何更好的使用Qt3和Qt4两个版本来进行编程。Qt的版本不断更新,现在最新的版本是4.6。
1. 首先是系统平台的差异。 在win下,Qt3的代码已经很少能见到了,而且Nokia早就放弃了对Qt3的更新和支持。所以目前主要的代码都是在Qt4下,同时Qt3和Qt4在win下部署起来也比较方便,这样也就大大减弱了版本差异对我们的影响。主要还是在代码编写时候由于Qt3和Qt4类库的不同给我们带来的麻烦。 在Linux下,版本差异对我们的影响就比较大了。由于内核版本,C/C++运行库的版本不同导致了Qt3和Qt4开发的程序很难同时运行在同一台机器上。这个差别不光是在代码编写过程中,同时还包括程序运行环境。以及Qt所依赖的动态库。
2. Qt3和Qt4带来的版本差异。 Qt4带来了很大的改进,新加入了很多的类,同时也在原有的类的基础上增删了很多方法或属性,这样就给我们编程带来的很大的挑战。Qt3不支持qrc资源文件、在QDesigner设计的时候图片会直接编译成二进制存放到ui文件中等等。Qt4给我们提供了qt3to4这样一个转换工具,但是这个工具的功能实在是有限的很。许多api函数未能提供转换。但是有一个推荐的做法是Qt4提供了qt3support库,使用这个库可以在Qt4下使用大部分Qt3的库,如果我们想要同时编写适应Qt3和Qt4的程序,推荐在Qt4下使用这个库。在Linux下,Qt3是无法调用Qt4下开发的程序。在运行时虽然可以动态的判断系统中的环境是Qt4还是Qt3,但是无法动态加载,因为在Linux下,这两中环境很难共存。
3. 某些控件的差异。比方说QLabel。在Qt3中设置背景图片的方法是:setPaletteBackgroundPixmap方法,而在Qt4中是setPixmap方法。由于这是编译时的差异,所以无法在运行时切换Qt的版本。因为API函数不一样,编译时候就确定了到底是那种版本的Qt。再比方说QThread。在Qt4中QThread继承了QObject类,这样在QThread中就可以使用Q_OBJECT来定义signal和slot。但是在Qt3中QThread没有父类,要使用signal和slot就必须让我们自己的Thread类同时继承QThread和QObject。
4. 解决方法。类似这些问题,我的解决方法是:通过宏定义在编译是确定QT的版本。例如:在pro文件中我们可以判断出Qt使用的版本。 greaterThan(QT_MAJOR_VERSION, 4)|equals(QT_MAJOR_VERSION,4){ QT += qt3support DEFINES += QT4 } DEFINES的功能就是给编译器添加-d参数,类似于#define QT4 这样我们就可以在程序共通过这个宏定义来进行条件编译了。看Thread部分和QLabel部分的代码: Thread部分: class ScanThread : #ifndef QT4 public QObject, #endif public QThread{}; QLabel部分: QPixmap pix(m_imageSrcOff); #ifdef QT4 setPixmap(pix); #else setPaletteBackgroundPixmap(pix); #endif 还有一点小经验,就是在画按钮的时候,按钮的鼠标经过,鼠标按下,鼠标松开,都需要变换背景图片,制作这种复杂的按钮的时候我们最好是继承QLabel,QLabel比QPushButton更加方便我们来绘制控件的背景。