接了一个QT写小游戏的项目,找到一个QT3编写的比较不错的开源的,现在改写到QT4,遇到一些问题。
总结一下,首先需要先看看帮助中的Porting to Qt 4一节,详细介绍了迁移过程。下面是我自己开发中遇到的:
0。
可以使用qt工具qt3to4把Qt3的程序代码移植成QT4
1。有些函数,在QT4中以打算不支持,使用#ifdef QT3_SUPPORT宏进行控制,如果用户仍然想用这些函数,需要在编译的时指定这个宏。但不建议使用旧版本的函数啦,所以,你可以查看旧函数的源代码,自己直接调用它调用的其他代替函数。比如QDialog有个setCaption函数,我们可以使用setWindowTitle来代替,等等。
2。
有些类也进行了修改,如QButtonGroup的基类由QWidget改成了QObject,因此变成了不可见的widget了。不在有标题以及其他界面的函数,也不能直接和layout进行关联。这个时候我们可以借助QGroupBox 来实现原来QButtonGroup的一些旧的和界面相关的功能。参考下下面的例子:
http://hi.baidu.com/ediwon/blog/item/9a28e21196147cc6a6ef3f94.html
3。
有些类名字改变了,或者没有了。如,QListBox 改变成了Q3ListBox。
4。QT4中,Qstring 转换const char*
方法一:
QString qstr("hello,word");
const char * p = qstr.toLocal8Bit().data();
方法二:
const char *p = qstr.toStdString().data();
转换过来的是常量
5.
windows下使用VS2003环境编译QT程序有的时候,有时出错:
c1xx : fatal error C1083: 无法打开源文件:“./GeneratedFiles/debug/moc_piecewidget.cpp”: No such file or directory
LINK : fatal error LNK1104: 无法打开文件“./Debug/moc_piecewidget.obj”
无法解析的外部命令qmetaobject
是因为没有生成moc文件,使用moc在命令行下可以进行编译
同时在集成开发环境中,可以修改*.vcproj文件中,在头文件一节修该,加入moc等命令,如下
<File>
RelativePath=".srcprefs.h">
</File>
<File
RelativePath=".srcprefs.h">
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing prefs.h..."
CommandLine="$(QTDIR)inmoc.exe -IGeneratedFiles -I$(QTDIR)include -I.GeneratedFilesRelease -I$(QTDIR)includeQtCore -I$(QTDIR)includeQtGui ".srcprefs.h" -o "GeneratedFilesReleasemoc_prefs.cpp"
"
AdditionalDependencies="$(QTDIR)inmoc.exe;.srcprefs.h"
Outputs=""GeneratedFilesReleasemoc_prefs.cpp""/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing prefs.h..."
CommandLine="$(QTDIR)inmoc.exe -IGeneratedFiles -I$(QTDIR)include -I.GeneratedFilesDebug -I$(QTDIR)includeQtCore -I$(QTDIR)includeQtGui ".srcprefs.h" -o "GeneratedFilesDebugmoc_prefs.cpp"
"
AdditionalDependencies="$(QTDIR)inmoc.exe;.srcprefs.h"
Outputs=""GeneratedFilesDebugmoc_prefs.cpp""/>
</FileConfiguration>
</File>
最后在后面的生成文件中加入:
<Filter
Name="Generated Files"
Filter="moc;h;cpp"
UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}">
<File
RelativePath=".generatedfilesdebugmoc_gamedialog.cpp">
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
<File
RelativePath=".generatedfiles eleasemoc_gamedialog.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
</Filter>
具体的实现,可以使用VS向导生成的文件,对照有问题的部分,仿照着修改就可以了。
总结一下,首先需要先看看帮助中的Porting to Qt 4一节,详细介绍了迁移过程。下面是我自己开发中遇到的:
0。
可以使用qt工具qt3to4把Qt3的程序代码移植成QT4
1。有些函数,在QT4中以打算不支持,使用#ifdef QT3_SUPPORT宏进行控制,如果用户仍然想用这些函数,需要在编译的时指定这个宏。但不建议使用旧版本的函数啦,所以,你可以查看旧函数的源代码,自己直接调用它调用的其他代替函数。比如QDialog有个setCaption函数,我们可以使用setWindowTitle来代替,等等。
2。
有些类也进行了修改,如QButtonGroup的基类由QWidget改成了QObject,因此变成了不可见的widget了。不在有标题以及其他界面的函数,也不能直接和layout进行关联。这个时候我们可以借助QGroupBox 来实现原来QButtonGroup的一些旧的和界面相关的功能。参考下下面的例子:
http://hi.baidu.com/ediwon/blog/item/9a28e21196147cc6a6ef3f94.html
3。
有些类名字改变了,或者没有了。如,QListBox 改变成了Q3ListBox。
4。QT4中,Qstring 转换const char*
方法一:
QString qstr("hello,word");
const char * p = qstr.toLocal8Bit().data();
方法二:
const char *p = qstr.toStdString().data();
转换过来的是常量
5.
windows下使用VS2003环境编译QT程序有的时候,有时出错:
c1xx : fatal error C1083: 无法打开源文件:“./GeneratedFiles/debug/moc_piecewidget.cpp”: No such file or directory
LINK : fatal error LNK1104: 无法打开文件“./Debug/moc_piecewidget.obj”
无法解析的外部命令qmetaobject
是因为没有生成moc文件,使用moc在命令行下可以进行编译
同时在集成开发环境中,可以修改*.vcproj文件中,在头文件一节修该,加入moc等命令,如下
<File>
RelativePath=".srcprefs.h">
</File>
<File
RelativePath=".srcprefs.h">
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing prefs.h..."
CommandLine="$(QTDIR)inmoc.exe -IGeneratedFiles -I$(QTDIR)include -I.GeneratedFilesRelease -I$(QTDIR)includeQtCore -I$(QTDIR)includeQtGui ".srcprefs.h" -o "GeneratedFilesReleasemoc_prefs.cpp"
"
AdditionalDependencies="$(QTDIR)inmoc.exe;.srcprefs.h"
Outputs=""GeneratedFilesReleasemoc_prefs.cpp""/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing prefs.h..."
CommandLine="$(QTDIR)inmoc.exe -IGeneratedFiles -I$(QTDIR)include -I.GeneratedFilesDebug -I$(QTDIR)includeQtCore -I$(QTDIR)includeQtGui ".srcprefs.h" -o "GeneratedFilesDebugmoc_prefs.cpp"
"
AdditionalDependencies="$(QTDIR)inmoc.exe;.srcprefs.h"
Outputs=""GeneratedFilesDebugmoc_prefs.cpp""/>
</FileConfiguration>
</File>
<Filter
Name="Generated Files"
Filter="moc;h;cpp"
UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}">
<File
RelativePath=".generatedfilesdebugmoc_gamedialog.cpp">
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
<File
RelativePath=".generatedfiles eleasemoc_gamedialog.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
</Filter>
本文分享了从QT3迁移到QT4过程中遇到的问题及解决办法,包括使用qt3to4工具、替代废弃函数、调整类用法、解决编译错误等方面的经验。
2874

被折叠的 条评论
为什么被折叠?



