首页 > 作文

MFC程序中使用QT开发界面的实现步骤

更新时间:2023-04-04 02:02:29 阅读: 评论:0

目录
添加qt依赖添加信号槽机制添加qt界面配置元编译过程一些问题的处理测试信号槽使用qt designer 设计界面

如果你有一个现成的mfc项目在做维护,但是你厌倦了使用mfc繁琐的操作来做界面美化,或者你需要在这个项目中用到qt里面好用的某些功能;亦或者是你需要使用某些只能在mfc中使用的组件,但是界面这部分已经用qt做好了。那么这篇文章可能可以帮助到你

演示环境使用visual studio 2019 + qt5.12.8 版本

添加qt依赖

首先创建一个基于对话框的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中添加信号槽机制的功能

添加qt界面

在项目中新建一个界面类,让他继承自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("这是由信号槽弹出来的"));});}

点击按钮之后,消息框也正常弹出来了

使用qt designer 设计界面

使用 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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图