技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008+Qt4.8.3也未曾及时更新。这几天,果断装上VS2010+Qt5.1.0,开始研究。Qt4过渡到Qt5不算显著,然而,“模块化”的Qt代码需要项目配置的变化,如使用“headers”,和配置项目构建(如改变*.pro文件)。
 
QtWidgets作为一个独立的模块
例如编译时错误
1.       error: QMainWindow: No such file or directory
2.       error: QToolButton: No such file or directory
3.       error: QWidget: No such file or directory
解决办法:
在*.pro文件里添加:
1.       QT += widgets
更改
1.       #include

1.       #include
程序现在应该就可以运行了,但是有时可能需要更加明确的包含
1.       #include

QtWebKitWidgets也是一个独立的模块:
例如编译时错误
1.       error: invalid use of incomplete type 'class QWebFrame'
2.       error: forward declaration of 'class QWebFrame'
解决办法:
在*.pro文件里添加:

1.       QT += webkitwidgets
注意:当有QT += webkitwidgets的时候,就不再需要QT += widgets
此外,更改
1.       #inclue

1.       #include

打印机不工作
如果你的代码有以下几行:
1.       #include
2.       #include
将以下内容添加到项目文件中:
1.       Qt += printsupport
同样,有时可能仍无法正常工作,需要指定:
1.       #include
2.       #include QPrintDialog>

toAscii()和fromAscii()已被弃用
替换
1.       fromAscii()
2.       toAscii()

1.       fromLatin1()
2.       toLatin1()
例如,给定的Qt4代码
1.       QByteArry configfileti = TMP_Config.toAscii();
变为
1.       QByteArry configfileti = TMP_Config.toLatin1();

QCoreApplication::UnicodeUTF8已被弃用
此枚举类型用于定义8位编码的字符串参数translate()。此枚举现在已经过时,所有的情况将使用UTF-8。所以删除了QCoreApplication::UnicodeUTF8的所有实例。例如:
1.       Href_Gui->setWindowTitle(QApplication::translate("Href_Gui", "Url / www", 0, QApplication::UnicodeUTF8));
2.       label->setText(QApplication::translate("Href_Gui", "Text:", 0, QApplication::UnicodeUTF8));
3.       label_2->setText(QApplication::translate("Href_Gui", "Url:", 0, QApplication::UnicodeUTF8));
4.       label_3->setText(QApplication::translate("Href_Gui", "Target / Name:", 0, QApplication::UnicodeUTF8));
变为

1.       Href_Gui->setWindowTitle(QApplication::translate("Href_Gui", "Url / www", 0));
2.       label->setText(QApplication::translate("Href_Gui", "Text:", 0));
3.       label_2->setText(QApplication::translate("Href_Gui", "Url:", 0));
4.       label_3->setText(QApplication::translate("Href_Gui", "Target / Name:", 0));

QWorkspace已被弃用
这个类已经过时,在Qt4.3中被替换为QMdiArea。在Qt5中QWorkspace已被删除。新的类与QWorkspace有类似的API,移植只涉及改变几个方法、信号和槽的名字。
更换
1.       #include

1.       #include

QDrag问题
拖动功能的应用程序将需要一些调整。如:
1.        QDrag *drag = new QDrag(event->widget());
在Qt5中将产生错误
1.       error: no matching function for call to 'QDrag::QDrag(QWidget*)'
要解决这个附加组件,其中包括:
1.       #include

qFindChildren已被弃用
这种方式会弹出一个错误:
1.       error: 'qFindChildren' was not declared in this scope
为了解决这个问题,将qFindChildren替换为findChildren,例如

1.       toString(const QObject* obj, int indentLevel) const {
2.       [...]
3.           
4.           if (m_children) {
5.               QList<</span>QObject*> childlist = qFindChildren<</span>QObject*>(obj, QString());
6.       [...]
替换

1.       QList<</span>QObject*> childlist = qFindChildren<</span>QObject*>(obj, QString());

1.       QList<</span>QObject*> childlist = obj->findChildren<</span>QObject*>(QString());
 
qVariantValue已被弃用
编译器会出现
1.       error: 'qVariantValue' was not declared in this scope
此功能相当于的QVariant::value(value)。因此,如果指定QVariant val应改写
1.       QTime t = qVariantValue<</span>QTime>(val);

1.       QTime t = val.value<</span>QTime>();
QTime用尖括号括起来,则告知编译器QVariant将返回。但是,如果变量不是一个QVariable,则类型用尖括号括起来就不应该被使用(这样做将导致一个模糊的编译时错误)。所以指定的m_color(QColor类型),应改写
1.       s.setValue("color/favorite", qVariantValue<</span>QColor>(m_color));

1.       s.setValue("color/favorite", m_color.value());
 
qVariantCanConvert已被弃用
替换

1.       Q_ASSERT(qVariantCanConvert<</span>QString>(variant));
2.       Q_ASSERT(qVariantCanConvert<</span>QSize>(variant));
3.       Q_ASSERT(qVariantCanConvert<</span>QFont>(fontVariant));

1.       Q_ASSERT(variant.canConvert(QMetaType::QString));
2.       Q_ASSERT(variant.canConvert(QMetaType::QSize));
3.       Q_ASSERT(fontVariant.canConvert(QMetaType::QFont));

Qt::escape已被弃用

1.       error: 'escape' is not a member of 'Qt'
所以应该更改下面代码:

1.           if (result == QString())
2.               result = Qt::escape(val.toString());
3.           else
4.               result = Qt::escape(result);
5.           return result;

1.           if (result == QString())
2.               result = QString(val.toString()).toHtmlEscaped();
3.           else
4.               result = QString(result).toHtmlEscaped();
5.           return result;

QDesktopServices::storageLocation已被弃用
1.       error: 'storageLocation' is not a member of 'QDesktopServices'
2.       error: 'DataLocation' is not a member of 'QDesktopServices'
使用QStandardPaths::StandardLocation,替换

1.       QString path = s.value("db.path",QDesktopServices::storageLocation(QDesktopServices::DataLocation)).toString();

1.       QString path = s.value("db.path",QStandardPaths::standardLocations(QStandardPaths::DataLocation)).toString();

QtMutimedia替换了Phonon

音频、视频已不再使用phonon,如果你还在研究phonon,那么你已经out了!好好研究一下QMediaPlayer、QMediaMetaData ...吧!
 
CONFIG += qtestlib已被弃用
如果在项目文件中使用,则编译器会发出警告,尽管如此代码将照常运行:
1.       Project WARNING: CONFIG+=qtestlib is deprecated. Use QT+=testlib instead.

QWeakPointer怪异
如下代码
1.       quint64 decodedPointer = line.toULongLong();
2.       MetaData *md = reinterpret_cast<</span>MetaData*>(decodedPointer);
3.       QWeakPointer<</span>MetaData> wp(md);
结果
1.       error: no matching function for call to 'QWeakPointer::QWeakPointer(MetaData*&)'
为了解决这个问题,将下面代码添加到项目文件:
1.       DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
 
QtConcurrent库的失踪了?
1.       C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtConcurrent\qtconcurrentthreadengine.h:133: error: undefined reference to `_imp___ZN12QtConcurrent16ThreadEngineBaseD2Ev'
在Qt4中,QtConcurrent是QtCore的一部分,所以,没有必要包括特定的头。这已不再是用Qt5的情况下。如果源代码如下
1.       m_current = QtConcurrent::blockingMappedReduced(slices, functor, stitchReduce,QtConcurrent::UnorderedReduce );
则将需要包含头:
1.       #include QtConcurrent>
到项目文件,并添加下面一行:
1.       LIBS += -lQt5Concurrent

固定的#include <>头
在qtbase/bin/中存在一个“fixqt4headers.pl”这样的Perl脚本。运行于Qt源代码运行,为Qt组件纠正#include <>指令还要考虑模块名称。
 
插件加载
Q_EXPORT_PLUGIN,Q_EXPORT_PLUGIN2宏已经过时,新的宏为Q_PLUGIN_METADATA。新系统的优点是,它允许Qt​​来查询元数据的插件没有实际dlopen'ing它。这极大地提高了插件系统的性能和可靠性。
新Q_PLUGIN_METADATA宏包含QObject的派生类中加载插件时返回的Q_OBJECT宏。它包含插件IID并指向一个包含插件元数据的json文件。json文件被编译成插件,并不需要安装。
例如如何改变插件可以通过查找补丁,改变GIF图像格式的插件,请查看:http://qt.gitorious.org/qt/qtbase/commit/963b4c1647299fd023ddbe7c4a25ac404e303c5d .
 
部署的系统没有使用C++11
当Qt的系统上安装了C++11,建立从源代码的Qt库/框架链接,系统的C++ 11库(libc++)。这意味着Qt库/框架没有部署到没有安装C++11(如out-of-the-box Mac OS X 10.6)的系统。为了能够部署到系统仅支持较旧的C++标准(libstdc++),构建Qt源代码没有C++11配置选项。

QT4到QT5的变化!相关推荐

  1. 转从Qt4 到Qt5的变化

    QT4 升级到 QT5 改动: PC部分: [改 QTDIR 变量] 在工程根目录下找到 .user 文件 ,  如 InnoTabPlugin.vcxproj.user 修改指向你的 QT5 根目录 ...

  2. 【转】qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用

    原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...

  3. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且允许真正地组件编程.基本上,Qt同 ...

  4. Qt4及Qt5的下载、安装和使用

    最近找Qt的安装方法是真的烦.网上太多版本,Qt官网更新了,找不到下载地方(收钱).终于找到一个完整版了 转自:CN_Simo. http://www.cnblogs.com/lxmwb/p/6352 ...

  5. 案例分享:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111831179 长期持续带来更多项目与技术分 ...

  6. 从QT4、QT5到QT6的版本移植总结

    直观总结 增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理. 把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能. 把一些Qt5中兼容Qt4的方法废 ...

  7. Qt4 到Qt5 最小化后 点击任务栏不显示问题

    1.在Qt4 中  QML  传递信号到QWidget   设置  setWindowState(Qt::WindowMinimized);   点击任务栏显示没有问题 2.在Qt5 中  QML 传 ...

  8. 解决Cmake的一个小问题及QT4与QT5的安装和切换

    在将src文件移动至虚拟机的一个工作空间下时,进行catkin_make时出现如下错误: CMake Error at /usr/share/cmake-3.16/Modules/FindQt4.cm ...

  9. Qt4.8.6与Qt5.4.0的安装详解

    简介 Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址:  http://www.qt.io/  也可以访问Qt项目域名:http://qt-projec ...

最新文章

  1. MySQL创建相同表和数据命令
  2. Python编程基础:第四十八节 对象作为参数Objects as Argument
  3. 微信开发(02)之处理微信客户端发来的消息
  4. Python爬取js动态添加的内容
  5. ssm 退出登录 java_【Java】ssm Dao层无返回 函数始终不退出
  6. windows2008配置来
  7. 苹果手机输入屏保后锁屏_修一块手机屏幕要7080元?
  8. leetcode 148 --- 链表排序
  9. python基于dict、defaultdict、Counter的累加器
  10. Android 车联网天气
  11. 使用k8s Ingress暴露gRPC服务
  12. 数据结构之双向链表----Python
  13. C语言拯救者 番外篇 (Windows实用调试技巧)
  14. 照片怎么转PDF格式?这两个方法快来学习下
  15. ECCV 2022 | MVDG:一种用于域泛化的统一多视图框架
  16. python基础运用_python基础知识和运用
  17. 云计算机基地有辐射吗,孕妇离电脑多远没有辐射
  18. hibernate框架构建_我们如何构建服务框架而不是框架
  19. 通过自定义android键盘实现车牌号输入法
  20. 【工控老马】欧姆龙PLC Socket发送Fins/TCP命令解析

热门文章

  1. css之line-height及图片文字垂直居中
  2. Vue——显示微信用户名称中enjoin表情
  3. [CSS]关于z-index与position的一次奇异经历
  4. CentOS6.8下搭建zookeeper web界面查看工具node-zk-browser
  5. Go -- pprof协程监控
  6. python-管理MySQL之ConfigParser模块
  7. Winform 打开下载的文件
  8. int main(int argc,char* argv[])详解(原)
  9. 前20个关于FLEX技术、源码、实例、技巧的网站.
  10. 三次简化一张图:一招理解LSTM/GRU门控机制