Qt4代码移植到Qt5所遇到的问题和解决方法

今天继续折腾Qt玩,在网上找了一个qt4写的单机版斗地主小游戏源码,准备自己研究一下,我是在mac系统下安装的qt5.5版本,所以需要修改一个才能编译成功! (我也不知道都需要修改那些代码 先编译一下 哪里报错改哪里

第一个错误:  fatal error: ‘QFrame’ file not found

Snip20160111_4

这个问题我之前遇到过,这是应为Qt5已经废弃了 QFrame了

需要把 #include <QFrame>替换成 #include <QtWidgets>

然后在项目的 .pro文件里 添加一行   QT += widgets

然后编译运行,这个报错已经解决,但是又出现新的错误提示

error: ‘QtGui/QAction’ file not found

#include <QtGui/QAction>

^

Snip20160111_5

经过一番谷歌后,原来是原因Qt5的源文件位置的改动而造成的 造成的,把所有源码<QtGui/xxxx> 的头文件修改为 <xxxx> 这种 (注意:前提是项目的.pro文件里 已经添加了  QT += widgets 这一行配置)

例如头文件:

#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QFrame>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QSpacerItem>

修改为:

#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QFrame>
#include <QGridLayout>
#include <QHeaderView>
#include <QLabel>
#include <QSpacerItem>

修改后保存,编译一下你就会发现刚才的报错已经没有了,但是又出现了新的问题

error: no member named ‘UnicodeUTF8’ in ‘QApplication’  如下图:

Snip20160111_2

报错代码:

    void retranslateUi(QFrame *MarkBoard)
    {
        MarkBoard->setWindowTitle(QApplication::translate("MarkBoard", "MarkBoard", 0, QApplication::UnicodeUTF8));
        label->setText(QApplication::translate("MarkBoard", "me", 0, QApplication::UnicodeUTF8));
        myMark->setText(QString());
        label_3->setText(QApplication::translate("MarkBoard", "left robot", 0, QApplication::UnicodeUTF8));
        leftMark->setText(QString());
        label_5->setText(QApplication::translate("MarkBoard", "right robot", 0, QApplication::UnicodeUTF8));
        rightMark->setText(QString());
    } // retranslateUi

详细报错提示:

/Users/zploo/Desktop/Qt/code/day6/LordCardGame/ui_MarkBoard.h:105:

error: no member named ‘UnicodeUTF8’ in ‘QApplication’

MarkBoard->setWindowTitle(QApplication::translate(“MarkBoard”, “MarkBoard”, 0, QApplication::UnicodeUTF8));

~~~~~~~~~~~~~~^

出现这个问题是因为 QCoreApplication::UnicodeUTF8 在Qt5中已被弃用了,直接把这个参数去掉即可

修改后的代码如下:

    void retranslateUi(QFrame *MarkBoard)
    {
        MarkBoard->setWindowTitle(QApplication::translate("MarkBoard", "MarkBoard", 0));
        label->setText(QApplication::translate("MarkBoard", "me", 0));
        myMark->setText(QString());
        label_3->setText(QApplication::translate("MarkBoard", "left robot", 0));
        leftMark->setText(QString());
        label_5->setText(QApplication::translate("MarkBoard", "right robot", 0));
        rightMark->setText(QString());
    } // retranslateUi

 

报错编译,上面的已经解决,又出现下面的报错提示

error: no type named ‘WFlags’ in namespace ‘Qt’; did you mean ‘QFlag’?

详细报错提示:

/Users/zploo/Desktop/Qt/code/day6/LordCardGame/MainFrame.h:15: error: no type named ‘WFlags’ in namespace ‘Qt’; did you mean ‘QFlag’?
MainFrame(QWidget *parent = 0, Qt::WFlags flags = 0);
^~~~~~~~~~
QFlag

因为Qt5中 WFlags 已经更名为 WindowFlags

解决办法:

把WFlags 换成 WindowFlags 即可

MainFrame(QWidget *parent = 0, Qt::WFlags flags = 0);
//修改成下面这样即可
MainFrame(QWidget *parent = 0, Qt::WindowFlags flags = 0);

error: use of undeclared identifier ‘qInstallMsgHandler’; did you mean ‘qInstallMessageHandler’?

详细报错提示:

/Users/zploo/Desktop/Qt/code/day6/LordCardGame/main.cpp:33:

error: use of undeclared identifier ‘qInstallMsgHandler’; did you mean ‘qInstallMessageHandler’?

qInstallMsgHandler(myMessageOutput);

^~~~~~~~~~~~~~~~~~

qInstallMessageHandler

出错原因:

在Qt5中 qInstallMsgHandler 函数已经被废弃了 可按报错提示修改为: qInstallMessageHandler

修改后 MessageOutput 要多加一个参数 : QMessageLogContext& Context

void  MessageOutput( QtMsgType type, const QMessageLogContext& Context, const QString &sMsg )

并且要把 QtMsgHandler  改为  QtMessageHandler

 

——————————————————————

其他问题暂时没有遇到,就先记录那么多把!

庄朋龙
庄朋龙

一个爱生活的技术菜鸟

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注