2013年8月24日星期六

为你的Qt4代码添加Qt5支持

    如果Qt4代码足够规范,要使其支持使用Qt5编译还是比较容易的。下面是我在用Qt5编译EzViewer时遇到的一些问题,总结一下。总的来说,如果只使用Widget,Qt5与Qt4的区别还是比较小的。
区别一:

    Qt 5 与 Qt 4 的一个主要区别是,将 widget 从 QtGui 模块放到了全新的 QtWidgets 模块。这对我们项目的影响主要有两点:

1、.pro项目文件,需要加入widgets模块:
    QT += widgets
    为了保持与Qt4的兼容,可以这样写:
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

2、头文件。
    1) 为了方便,很多人都是这样引用Qt的头文件的:
    #include <QtGui>
    在Qt5里面,则还需要加上:
    #include <QtWidgets>
    2) 有些人则比较注意只引用要用到的头文件,但他们可能是这样写的:
    #include <QtGui/QWidget>
    这种方式现在也要改成下面的样子:
    #include <QtWidgets/QWidget>
    3) 不论是上面哪种方式,为了和Qt4兼容,要写成这个样子:
    #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    // #include <QtWidgets> or others
    #endif // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    
    4) 因此,为了保持兼容和简洁,建议最好采用下面的方式引用头文件:
    #include <QWidget>
    这种方式在Qt4和Qt5中都是正确的。

区别二:
为了让代码跨平台,经常需要针对不同平台的特性做一些处理,通常是依赖平台相关的宏来判断。在 Qt 5 中,所有的 Q_WS_* 都变成了 Q_OS_*。因此,在 Qt 4 中的代码
#ifdef Q_WS_WIN
// call windows API
#endif
在 Qt 5 中应该写成
#ifdef Q_OS_WIN
// call windows API
#endif
而我的做法是这样的,在用到这些宏的cpp文件前面加上这样的定义:
    #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    #define Q_WS_WIN Q_OS_WIN
    #endif // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
这样下面的代码就可以照常使用Q_WS_WIN了。


参考文档:


文档信息