医站点医维基

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2696|回复: 8

qt4 向 qt5 迁移

[复制链接]

1

主题

412

回帖

843

积分

高级会员

积分
843

最佳新人

发表于 2016-6-3 10:35:56 | 显示全部楼层 |阅读模式
本帖最后由 13636600141 于 2016-6-3 10:37 编辑

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       编译可执行文件时的选项

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<QtGui/QLabel>就要替换为#include<QtWidgets/QLabel>


二、使用实例
了解了常见变量,剩下的就好办了。在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::<module>

cmake_minimum_required(VERSION 2.8.11)project(testproject)set(CMAKE_PREFIX_PATH ${path_to_qt5_root})        # 非常重要!只有路径对了,qt5能找到所有的modulesset(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::<module>如果使用了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/ ... l#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")

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()

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
回复

使用道具 举报

0

主题

399

回帖

804

积分

高级会员

积分
804

最佳新人

发表于 2016-6-28 14:47:38 | 显示全部楼层
zhichizhichi
回复

使用道具 举报

21

主题

420

回帖

1127

积分

版主

积分
1127

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-7-1 05:04:19 | 显示全部楼层
好贴!
回复

使用道具 举报

110

主题

429

回帖

1428

积分

金牌会员

积分
1428

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-7-1 05:24:35 | 显示全部楼层
看看学习一下!
回复

使用道具 举报

26

主题

419

回帖

1128

积分

版主

积分
1128

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-7-1 10:24:48 | 显示全部楼层
先看看在说
回复

使用道具 举报

178

主题

438

回帖

1713

积分

金牌会员

积分
1713

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-7-1 17:31:23 | 显示全部楼层
大哥谢了
回复

使用道具 举报

0

主题

399

回帖

804

积分

高级会员

积分
804

最佳新人

发表于 2016-7-3 22:28:01 | 显示全部楼层
这个有用了
回复

使用道具 举报

6

主题

408

回帖

860

积分

高级会员

积分
860

最佳新人

发表于 2016-7-4 04:56:56 | 显示全部楼层
LZ高人啊,我来学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )  

GMT+8, 2024-5-4 06:43 , Processed in 0.136770 second(s), 24 queries .

Designed by Medical BBS

快速回复 返回顶部 返回列表