将vs+Qt4项目升级到Qt5

版权声明: https://blog.csdn.net/u014552102/article/details/81876473

  最近由于项目需要,得把公司原来的Qt4项目(开发环境是vs2008+Qt4.7.3)升级到Qt5(开发环境是vs2015+Qt5.9.0),升级的原因是现在项目需要新增加的一个功能得用到Qt5的类,Qt4是没有这个类的,所以只能用Qt5。至于公司原来的项目是用Qt4,是因为Qt5从某个版本(貌似是5.6版本)开始不支持windows xp了,生成的目标程序可能无法在windows xp上运行,所以考虑到兼容性,之前开发产品使用的是Qt4。而现在领导确定,以后软件的运行环境都是win 7或以上了,所以现在把之前的项目都迁移到Qt5平台下(其实如果是成熟的产品是很顾及这种迁移的做法的,因为可能会引入未知bug,但我现在在小公司,公司里面的Qt客户端都是我一个人弄的,我对里面的代码很熟悉,客户端代码量不多,产品也还没卖出去,也没有专门的测试工程师帮我测试,都是我自己一个人测试。而一台电脑是可以同时装两个版本的vs和Qt的,也就是说可以同时在一台电脑使用两个版本的Qt开发,我可以把之前的项目单独备份出来,所以我才敢这么做的)。

  现在记录升级过程:

一、更改头文件


  相对于Qt4,Qt5的一个主要的基础架构修改是,将 widget从QtGui模块剥离开来,简单地来讲,就是需要包含的头文件发生变化了,所以升级第一步得修改头文件,否则编译无法通过。将#include <QtGui/QWidget>修改为#include <QWidget>,将#incude <QColorGroup>注释掉(Qt5没有QColorGroup这个头文件了),将#include <QtGui/QMainWindow>更改为#include <QMainWindow>。(如果是其它项目可能还有其它头文件需要更改,但本项目没有涉及到,所以就只需要修改这三个头文件就可以了)更改后,编译能正常通过了。如下图所示:

  

二、中文问题


  网上很多文章反映,由于Qt5取消了很多字符串的函数,所以把Qt4的项目升级到Qt5可能会出现中文显示的问题。但我升级后没遇到这个问题。我是使用邵发老师(技术博客地址:https://blog.csdn.net/iamshaofa)编写的中文转换函数的。 使用他提供的函数在Qt4和Qt5下进行中文显示都没有任何问题。(测试是在vs2008和vs2015下进行的,Qt Creator下没有进行过测试)

  转换函数代码如下:

#ifndef _QT_GBK_H
#define _QT_GBK_H


#include <QString>
#include <QTextCodec>
#include <string>
using std::string;

class GBK
{
public:
	// QString(Unicode) -> std::string (GBK)
	static string FromUnicode(const QString& qstr)
	{
		QTextCodec* pCodec = QTextCodec::codecForName("gb2312");
		if(!pCodec) return "";	
		/* 注: 如果pCodec为NULL, 则说明你的Qt安装位置不是默认位置,
		具体解决方法看Qt篇的《常见问题汇总》! */
		
		QByteArray arr = pCodec->fromUnicode(qstr);
		string cstr = arr.data();
		return cstr;
	}

	// std::string (GBK) -> QString(Unicode)
	static QString ToUnicode(const string& cstr)
	{
		QTextCodec* pCodec = QTextCodec::codecForName("gb2312");
		if(!pCodec) return "";
		/* 注: 如果pCodec为NULL, 则说明你的Qt安装位置不是默认位置,
		具体解决方法看Qt篇的《常见问题汇总》! */

		QString qstr = pCodec->toUnicode(cstr.c_str(), cstr.length());
		return qstr;
	}

};


#endif

三、项目升级后,Qt4和Qt5项目的运行效果对比。

  将原来Qt4的项目升级为Qt5,编译运行后,发现运行效果基本上是一样的。其中程序的运行逻辑都是一样的,不一样的是升级后界面上的一些小细节发生了一些改变,比如有部分字体的显示变化了,如下图所示。为什么升级后会发生变化呢?这恐怕是因为之前编写程序的时候没有给某些类设定默认值,导致升级Qt版本的时候默认值发生变化,界面也发生了变化。所以大家使用Qt的类时,最好设定默认值。

  还有一个变化是发布的程序占用的空间变大了(可执行程序+程序在别人电脑上运行所需要的所有dll)从原来的60M变为了接近100M(除了Qt的库不同和头文件不同,代码都是一样的),如下图所示:

其它变化的,基本上没有了。

总结:

  把Qt4项目升级为Qt5项目的过程是比较平稳的,更改一下头文件,基本就可以了。Qt6听说2020年就出来了,还是比较期待的。

猜你喜欢

转载自blog.csdn.net/u014552102/article/details/81876473