《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件
1、环境配置:VS2010,Qt4.8.4_win64,Qt_VS_Addin_1.1.11
2、创建的MFC对话框程序
3、输出为x64的debug&release程序
准备工作:
下载QtMigration文件
http://download.csdn.net/download/power_YQ/3539936
第一步:
创建一个最简单的 MFC Dialog 程序——编译应该是正常的MFC程序。
第二步:.
1、将下载后的source文件中qmfcapp qwinhost qwinwidget 六个对应的.h .cpp文件添加到工程中
2、添加对应的Qt头文件:
#include <QtGui/QApplication>
#include "qmfcapp.h"
#include "qwinhost.h"
#include "qwinwidget.h"
3、在 BOOL CTestApp::InitInstance() 函数中增加一行代码:
QMfcApp::instance(this);
跟踪到QMfcApp的代码中可以清楚的看到该静态函数的功能是创建QApplication实例。
第三步:
重写CTestApp的run方法——在头文件中添加virtual int run();
cpp中的函数如下:
int CTestApp::Run()
{
int result = QMfcApp::run(this);
delete qApp;
return result;
}
注——QT帮助介绍:
QMfcApp:run()
will then use that QMfcApp::instance, which must then be deleted explicitly using the global qApp pointer.
第四步:
在testDlg.h文件中添加定义——注意添加Qt的头文件:
QWinWidget *widget;
第五步:
1、在工程中右击——类向导——类名要对应到testDialog这个类——到左下面的消息tab框——双击分别选中WM_CREATE和WM_DESTORY——确定
2、在CTestDialog的OnCreate函数中加入下面代码:
widget = new QWinWidget( this );
QHBoxLayout *hbox = new QHBoxLayout( widget );
QLabel *label = new QLabel( "Enter text:", widget );
QLineEdit *edit = new QLineEdit( widget );
hbox->addWidget( label );
hbox->addWidget( edit );
widget->move( 0, 0 );
widget->show();
注:记得加上对应的头文件或Qt声明:
#include "qwinwidget.h"
#include <QtGui/QHBoxLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QLabel>
#include <QtGui/QSpinBox>
3. 在 CTestDialog 的 OnDestroy 方法中添加下面代码:
delete widget;
widget = 0;
第六步:
添加Qt的inlcude LIB文件路径到工程的属性表中,这个分别在C/C++和链接器中添加,再在连接器——输入中添加.lib文件
第七步:
如果仅做上述操作就编译的话,肯定编译不过。会报出一些链接错误
错误1:
编译运行,则出现如下错误:
错误 1 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject(void)const " (?metaObject@Widget@@UBEPBUQMetaObject@@XZ)
错误 2 error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UAEPAXPBD@Z)
错误 3 error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
错误 4 fatal error LNK1120: 3 个无法解析的外部命令
这是因为在源文件中没有添加上moc_qwinhost.cpp文件。
解决方法:右击hello.h,选择“自定义生成步骤”,“常规”
命令行:moc.exe .h -o moc_qwinhost.cpp
输出:moc_qwinhost.cpp
附加依赖项:moc.exe qwinhost.h
确定,然后,右击qwinhost.h,选择 “编译”,则在文件夹中生成moc_qwinhost.cpp,再将其添加到源文件中。
重复上述过程编译qwinwidget.h文件,得到moc_qwinwidget.cpp文件。工程中只需要编译这两个moc文件就可以了。
注:如果VS编译器暂时不能编译的话,可以到Qt安装文件夹下的bin文件夹中,找到moc.exe,利用cmd命令行编译这两个头文件,编译出来的文件添加到工程中即可。
错误2:
然后,运行程序,出现错误:
错误 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
对于上述的第二个错误可以直接在项目属性--》C/C++--》预编译头--》创建/使用预编译头改为“不使用预编译头”。这样编译就通过了。
第八步:
F5运行。