如果你有一个现成的mfc项目在做维护,但是你厌倦了使用mfc繁琐的操作来做界面美化,或者你需要在这个项目中用到qt里面好用的某些功能;亦或者是你需要使用某些只能在mfc中使用的组件,但是界面这部分已经用qt做好了。那么这篇文章可能可以帮助到你
演示环境使用visual studio 2019 + qt5.12.8 版本
首先创建一个基于对话框的mfc工程,当然其他的像是多文档、单文档工程也是可以的,只是为了简单起见我这里用的是对话框
然后通过鼠标右键点击项目,然后依次点击属性 –> c/c++ –>常规在工程的附加头文件中添加上qcore、qgui、qwidget和qt的头文件路径
这里记得按照对应编译选项来选择包含64位或者32。
接着在连接器–>常规 中的附加库目录中添加qt的lib库
最后再在连接器–>输入中添加依赖的lib文件,需要注意的是,debug版本需要链接上带d的lib文件,relea则链接上不带d的。
先编译一下,如果没有问题,qt相关的配置已经完成了
mfc是基于windows 消息队列来处理和响应ui事件的,而qt是采用信号槽机制来响应的,我们虽然添加了qt的依赖,但是现在只能使用其他的qt库,无法使用qt中的信号槽,需要额外添加一些组件来使mfc支持信号槽。
好在这部分需求qt相关的研发人员已经考虑到了,可以在github中找到 qmfcapp
我们可以将这两个文件给拷贝下来,添加到项目中。并且在cpp文件相应位置添加上 #include "pch.h"
包含预处理头
中间会有报错,这是因为在unicode 字符集下 cstring 中的字符串类型是 wchar_t*
qstring::fromlocal8bit 无法 从 wchar_t*
转化为 char*
所以这里可以修改一下,使用 qstring::fromstdwstring()
,然后进行编译
在qmfcapp.cpp的注释里面可以看到,如何使用它
/*! creates an instance of qapplication, passing the command line of \a mfcapp to the qapplication constructor, and returns the new object. the returned object must be destroyed by the caller. u this static function if you want to perform additional initializations after creating the application object, or if you want to create qt gui elements in the initinstance() reimplementation of cwinapp: \code bool mymfcapp::initinstance初中英语教研组计划() { // standard mfc initialization // ... // this ts the global qapp pointer qmfcapp::instance(this); // qt gui initialization } bool mymfcapp::run() { int result = qmfcapp::run(this); delete qapp; return result; } \endcode \sa run()*/
首先在app类的initinstance 函数中初始化qapplication类
bool cmfcwithqtapp::initinstance(){cwinapp::initinstance(英国退欧的影响);qmfcapp::instance(this);return true;}
然后需要重写 app类的run 方法,在该方法中调用qmfc 的run方法
int cmfcwithqtapp::run(){int result = qmfcapp::run(this);delete qapp;return result;}
再次编译一下,完成了往mfc中添加信号槽机制的功能
在项目中新建一个界面类,让他继承自qwidget,如下
// mainui.h#pragma once#include <qwidget>class mainui: public qwidget{q_objectpublic:mainui(qwidget* parent = nullptr);~mainui();};//mainui.cpp#include "pch.h"#include "mainui.h"#include <qpushbutton>mainui::mainui(qwidget* parent) :qwidget(parent){twindowtitle("qt windows");tfixedsize(800, 720);qpushbutton* pbtn = new qpushbutton(qstring::fromlocal8bit("这是一个qt按钮"), this);}mainui::~mainui(){}
然后在app 类的 initinstance 中启动该界面
bool cmfcwithqtapp::initinstance(){cwinapp::initinstance();qmfcapp::instance(this);mainui ui;ui.show();qmfcapp::exec();return fal;}
然后编译,这个时候发现会在链接的时候包一些错误,找不到一些 meta
的函数的定义
传统的c/c++ 从源代码到生成可执行文件的过程需要经过预编译、编译、链接。而qt在预编译前会进行元编译,生成一个moc_
开头的源码文件,后续编译的真正的文件其实是这个元编译生成的文件。mfc项目不会经历这一步,所以会报错。
在mainui.h
上点击右键,选择属性, 将项目类型选择为自定义生成工具
然后应用,这个时候会出现新的选项
在命令行和输入这两栏中分别填入 "moc.exe" "%(fullpath)" -o ".\generatedfiles\moc_%(filename).cpp" "-fpch.h" "-f../mainui.h"
和 .\generatedfiles\moc_%(filename).cpp
命令行的含义是会使用moc元编译器编译当前文件,并将生成的文件放入到当前目录下的generatedfiles子目录中,并且以moc_开头作为文件名,后面 -f
表示生成的新文件中会包含 #include "pch.h"
和 #include "../mainui.h"
然后在文件中选择右键,编译。这样将会生成moc文件(三亚学院两边的双引号也好包含进去)
如果编译的时候报找不到moc.exe 这样的错误,请配置qt中的bin路径到环境变量中
我们将新生成的文件添加到项目中
再次编译,成功过后点击运行就可以看到qt界面已经展示出来了
窗口出来了,但是在我的环境下出现两个问题,关闭窗口后进程无法退出;程序退出后出现内存泄露的问题
针对这两个问题可以在qmfcapp.cpp 文件中修改
// 表示在最后一个qt窗口退出时,关闭qapplicationtquitonlastwindowclod(true); //将之前的fal改为true
// ~qmfcapp() 中添加这两句,当析构完成后关闭进程handle hlf = getcurrentprocess();terminateprocess(hlf, 0);
我们可以在mainui中添加信号槽
mainui::mainui(qwidget* parent) :qwidget(parent){twindowtitle("qt windows");tfixedsize(800, 720);qpushbutton* pbtn = new qpushbutton(qstring::fromlocal8bit("这是一个qt按钮"), this);connect(pbtn, &qpushbutton::clicked, [=]() {qmessagebox::information(this, qstring::fromlocal8bit("信号槽"), qstring::fromlocal8bit("这是由信号槽弹出来的"));});}
点击按钮之后,消息框也正常弹出来了
使用 qtdesigner 设计这样一个界面
qtdesigner 会生成一个.ui
文件,在qt的开发环境中,会自动使用uic.exe
将这个文件生成一个对应的.h文件。我们先将ui文件导入到项目,并且按照之前的步骤设置自定义生成工具,填入如下命令行
"uic.exe" "%(fullpath)" -o ".\ui_%(filename).h"
并且填写上输出路径.\ui_%(filename).h
编译之后会生成一个对应的ui_mainui.h
文件,修改对应的mainui.h
头文件,加上关于它的引用,并且添加一个ui的对象指针
//mainui.h#pragma once#include <qwidget>#include "ui_main.h"class mainui:kelly sweet public qwidget{q_objectpublic:mainui(qwidget* parent = nullptr);~mainui();private:ui::mainui* m_pui;};
在类的构造中,使用ui对象来产生界面元素
//mainui.cpp#include "pch.h"#include "mainui.h"#include <qpushbutton>#include <qmessagebox>mainui::mainui(qwidget* parent) :qwidget(parent),m_pui(new ui::mainui()){m_pui->tupui(this);connect(m_pui->pushbutton, &qpushbutton::clicked, [=]() {qmessagebox::information(this, qstring::fromlocal8bit("qt 信号槽测试"), m_pui->lineedit->text());});}main优秀班干部ui::~mainui(){delete m_pui;}
执行效果如下
到此这篇关于mfc程序中使用qt开发界面的实现步骤的文章就介绍到这了,更多相关mfc qt开发界面内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 02:02:27,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/bc2c053f539ccb94d8adf50760072bfc.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:MFC程序中使用QT开发界面的实现步骤.doc
本文 PDF 下载地址:MFC程序中使用QT开发界面的实现步骤.pdf
留言与评论(共有 0 条评论) |