接了一个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等命令,如下
















































