今天继续折腾Qt玩,在网上找了一个qt4写的单机版斗地主小游戏源码,准备自己研究一下,我是在mac系统下安装的qt5.5版本,所以需要修改一个才能编译成功! (我也不知道都需要修改那些代码 先编译一下 哪里报错改哪里)
第一个错误: fatal error: ‘QFrame’ file not found
这个问题我之前遇到过,这是应为Qt5已经废弃了 QFrame了
需要把 #include <QFrame>替换成 #include <QtWidgets>
然后在项目的 .pro文件里 添加一行 QT += widgets
然后编译运行,这个报错已经解决,但是又出现新的错误提示
error: ‘QtGui/QAction’ file not found
#include <QtGui/QAction>
^
经过一番谷歌后,原来是原因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’ 如下图:
报错代码:
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
——————————————————————
其他问题暂时没有遇到,就先记录那么多把!