《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件

《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运行。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值