最近,看了看PyQt5,相关的资料确实很少,PyQt4到PyQt5的变动还是很大。写了个带前进后退功能的小浏览器,一直都是写命令行的程序,确实很少写带界面的程序,只是为了创新、突破,开个头


下面是网上找的前面说的变动:


QtWidgets作为一个独立的模块


例如编译时错误

error:QMainWindow:Nosuchfileordirectoryerror:QToolButton:Nosuchfileordirectoryerror:QWidget:Nosuchfileordirectory解决办法:

在*.pro文件里添加:

QT+=widgets

更改

#include<QtGui>

#include<QtWidgets>



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

#include<QtWidgets/QToolButton>



QtWebKitWidgets也是一个独立的模块:


例如编译时错误

error:invaliduseofincompletetype'classQWebFrame'error:forwarddeclarationof'classQWebFrame'



解决办法:

在*.pro文件里添加:

QT+=webkitwidgets

注意:当有QT += webkitwidgets的时候,就不再需要QT += widgets

此外,更改

#inclue<QtWebKit>

#include<QtWebKitWidgets>


打印机不工作

如果你的代码有以下几行:

#include<QPrinter>#include<QPrintDialog>

将以下内容添加到项目文件中:

Qt+=printsupport

同样,有时可能仍无法正常工作,需要指定:

#include<QtPrintSupport/QPrinter>#include<QtPrintSupport/QPrintDialog>


toAscii()和fromAscii()已被弃用

替换

fromAscii()toAscii()

fromLatin1()toLatin1()

例如,给定的Qt4代码

QByteArryconfigfileti=TMP_Config.toAscii();

变为

QByteArryconfigfileti=TMP_Config.toLatin1();



QCoreApplication::UnicodeUTF8已被弃用

此枚举类型用于定义8位编码的字符串参数translate()。此枚举现在已经过时,所有的情况将使用UTF-8。所以删除了QCoreApplication::UnicodeUTF8的所有实例。例如:

Href_Gui->setWindowTitle(QApplication::translate("Href_Gui","Url/www",0,QApplication::UnicodeUTF8));label->setText(QApplication::translate("Href_Gui","Text:",0,QApplication::UnicodeUTF8));label_2->setText(QApplication::translate("Href_Gui","Url:",0,QApplication::UnicodeUTF8));label_3->setText(QApplication::translate("Href_Gui","Target/Name:",0,QApplication::UnicodeUTF8));


变为

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

QWorkspace已被弃用

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

更换

#include<QWorkspace>

#include<QMdiAre>

QDrag问题

拖动功能的应用程序将需要一些调整。如:

QDrag*drag=newQDrag(event->widget());

在Qt5中将产生错误

error:nomatchingfunctionforcallto'QDrag::QDrag(QWidget*)'

要解决这个附加组件,其中包括:

#include<QWidget>


qFindChildren已被弃用

这种方式会弹出一个错误:

error:'qFindChildren'wasnotdeclaredinthisscope

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

toString(constQObject*obj,intindentLevel)const{[...]if(m_children){QList<</span>QObject*>childlist=qFindChildren<</span>QObject*>(obj,QString());[...]

替换

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

QList<</span>QObject*>childlist=obj->findChildren<</span>QObject*>(QString());qVariantValue已被弃用

编译器会出现

error:'qVariantValue'wasnotdeclaredinthisscope

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

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

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

QTime用尖括号括起来,则告知编译器QVariant将返回。但是,如果变量不是一个QVariable,则类型用尖括号括起来就不应该被使用(这样做将导致一个模糊的编译时错误)。所以指定的m_color(QColor类型),应改写

s.setValue("color/favorite",qVariantValue<</span>QColor>(m_color));


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

替换

Q_ASSERT(qVariantCanConvert<</span>QString>(variant));Q_ASSERT(qVariantCanConvert<</span>QSize>(variant));Q_ASSERT(qVariantCanConvert<</span>QFont>(fontVariant));


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

Qt::escape已被弃用

error:'escape'isnotamemberof'Qt'

所以应该更改下面代码:

if(result==QString())result=Qt::escape(val.toString());elseresult=Qt::escape(result);returnresult;


if(result==QString())result=QString(val.toString()).toHtmlEscaped();elseresult=QString(result).toHtmlEscaped();returnresult;QDesktopServices::storageLocation已被弃用

error:'storageLocation'isnotamemberof'QDesktopServices'error:'DataLocation'isnotamemberof'QDesktopServices'

使用QStandardPaths::StandardLocation,替换

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

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


QtMutimedia替换了Phonon

音频、视频已不再使用 phonon, 如果你还在研究phonon,那么你已经out了!好好研究一下 QMediaPlayer、QMediaMetaData ...吧!


CONFIG+= qtestlib已被弃用

如果在项目文件中使用,则编译器会发出警告,尽管如此代码将照常运行:

ProjectWARNING:CONFIG+=qtestlibisdeprecated.UseQT+=testlibinstead.


QWeakPointer怪异

如下代码

quint64decodedPointer=line.toULongLong();MetaData*md=reinterpret_cast<</span>MetaData*>(decodedPointer);QWeakPointer<</span>MetaData>wp(md);


结果

error:nomatchingfunctionforcallto'QWeakPointer::QWeakPointer(MetaData*&)'



为了解决这个问题,将下面代码添加到项目文件:

DEFINES+=QT_DISABLE_DEPRECATED_BEFORE=0


QtConcurrent库的失踪了?

C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtConcurrent\qtconcurrentthreadengine.h:133:error:undefinedreferenceto`_imp___ZN12QtConcurrent16ThreadEngineBaseD2Ev'


在Qt4中,QtConcurrent是QtCore的一部分,所以,没有必要包括特定的头。这已不再是用Qt5的情况下。如果源代码如下

m_current=QtConcurrent::blockingMappedReduced(slices,functor,stitchReduce,QtConcurrent::UnorderedReduce);


则将需要包含头:

#include<QtConcurrent/QtConcurrent>


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

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配置选项。