Qt4源码在Qt5中打开遇到的问题总结

来源:互联网 发布:热能感应软件 编辑:程序博客网 时间:2024/05/21 07:51
 技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008 + Qt4.8也未曾及时更新。这几天,果断装上VS2010 + Qt5.1,开始研究。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. #includeQPrinter>
  2. #includeQPrintDialog>

toAscii()和fromAscii()已被弃用

替换

  1. fromAscii()
  2. toAscii()

  1. fromLatin1()
  2. toLatin1()

例如,给定的Qt4代码

  1. QByteArryconfigfileti =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 thisscope

为了解决这个问题,将qFindChildren替换为findChildren,例如

  1. toString(constQObject*obj,intindentLevel)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 thisscope

此功能相当于的QVariant::value(value)。因此,如果指定QVariant val应改写

  1. QTimet =qVariantValue<</span>QTime>(val);

  1. QTimet =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.   returnresult;

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

QDesktopServices::storageLocation已被弃用

  1. error:'storageLocation'is not a member of 'QDesktopServices'
  2. error:'DataLocation'is not a member of 'QDesktopServices'

使用QStandardPaths::StandardLocation,替换

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

  1. QStringpath =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.UseQT+=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 forcall 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. #includeQtConcurrent>

到项目文件,并添加下面一行:

  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


注:
  技术在于交流、沟通,转载请注明出处并保持作品的完整性。
 作者:╰☆奋斗ing❤孩子`原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101endy.html。
0 0
原创粉丝点击