qt4 向 qt5 迁移

qt5比qt4有了一些进步,而且从qt4向qt5迁移难度不大,具体详见 http://doc.qt.io/qt-5/qt5-intro.html 。总之,早点学习有好处。


本文总结果我在迁移过程中的一些心得。


一、qt4与qt5配置上不同
1.1常用环境变量。
qt5 中常用的module大致有Qt5Core, Qt5DBus, Qt5Gui, QtWidgets, Qt5Multimedia, Qt5Network, Qt5OpenGL, Qt5Qml Qt5Quick, Qt5WebKit 等。
每一个module 几个固定的变量,以Qt5Widgets为例,它有:

Qt5Widgets_VERSION_STRING                 module版本号
Qt5Widgets_LIBRARIES                      可在target_link_libraries时链接用的库
Qt5Widgets_INCLUDE_DIRS                   相关的头文件目录
Qt5Widgets_DEFINITIONS                    与add_definitions配合使用的定义
Qt5Widgets_COMPILE_DEFINITIONS            与COMPILE_DEFINITIONS 属性配合使用的定义
Qt5Widgets_FOUND                          是否查找成功
Qt5Widgets_EXECUTABLE_COMPILE_FLAGS       编译可执行文件时的选项

2.2 文件迁移
qt4的Gui模块中包含了所有的图形控件,在qt5中全部迁移到了Qt5Widgets。相应的,#include就要替换为#include


二、使用实例
了解了常见变量,剩下的就好办了。在qt5中,将各个模块分离,find_packages也就相应分离查找,这个只用到自己所需的,可减少结果文件的大小。
qt官网推荐使用cmake 2.8.11以上版本的cmake,本文也只讲解这个版本下qt5的使用。仍以Qt5Widgets为例:

cmake_minimum_required(VERSION 2.8.11)
project(testproject)
set(CMAKE_PREFIX_PATH ${path_to_qt5_root})        # 非常重要!只有路径对了,qt5能找到所有的modules
set(CMAKE_INCLUDE_CURRENT_DIR ON)                 # qt5官网推荐包含当前目录
set(CMAKE_AUTOMOC ON)                             # 非常重要!这会让cmake设定在需要时moc相关文件
find_package(Qt5Widgets REQUIRED)                 # 加上REQUIRED, 如果查找失败,在第一时间得到消息
add_executable(helloworld WIN32 main.cpp)
target_link_libraries(helloworld Qt5::Widgets)    # 其他module也类似,均为Qt5::
如果使用了Qt5Core,一定要include_directories(${Qt5Core_INCLUDE_DIRS}),否则会找不到相关头文件(mac上)


三、引入文件
qt5中加大了对引入文件(IMPORTED targets)的应用,引入文件包括所有module相关文件(头文件、库等),方便使用。
3.1 属性
用户可以通过引入文件访问属性,如:

find_package(Qt5Core)
get_target_property(QtCore_location Qt5::Core LOCATION)  # LOCATION是枚举量,cmake定义的,其他变量参见 http://www.cmake.org/cmake/help/v2.8.11/cmake.html#prop_tgt:LOCATION

3.2 配置
用户也可以使用引入文件配置configure过程。如将configure配置为release:

find_package(Qt5Core)
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
set_target_properties(Qt5::Core PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE "RELEASE")

3.3 插件
qt5中 Qt5Network, Qt5SQL, Qt5GUI, and Qt5Widgets 有插件,通过引入文件就可以方便的访问:

foreach(plugin ${Qt5Network_PLUGINS})
  get_target_property(_loc ${plugin} LOCATION)
  message("Plugin ${plugin} is at location ${_loc}")
endforeach()

四、宏
宏这一部分变化很小,只是将宏命名中的qt4变为qt5。以下不列举宏说明,只列举宏位置。
Qt5Core包含:qt5_wrap_cpp、qt5_add_resources、qt5_generate_moc、qt5_use_modules
Qt5Widgets包含:qt5_wrap_ui
Qt5DBus包含:qt5_add_dbus_interface、qt5_add_dbus_interfaces、qt5_add_dbus_adaptor、qt5_generate_dbus_interface
Qt5LinguistTools包含: qt5_create_translation、qt5_add_translation


五、细节变化
参照官网:https://wiki.qt.io/Transition_from_Qt_4.x_to_Qt5

你可能感兴趣的:(qt4,qt5,迁移)