当前位置: 首页 > news >正文

初探MFC程序混合使用QT

一、背景

随着操作系统国产化替代的趋势越发明显,软件支持国际化、跨平台,已然是必须做的一件事情。原有的软件UI层用的是MFC,将其换成QT,想必是一种较好的方案。对于大型软件,特别是已发布,但还处于不断迭代的阶段,如果直接更换UI库,那么工作量还是很大,若人员较少,那么时间可能会持续挺久。倘若可以逐步替换,那么就比较经济了。

经过自己的摸索实践,MFC换QT应该是可以做到逐步替换,至少目前经过初步测试,可以支撑我的结论。

二、核心代码说明

  1. 新建一个MFC多文档程序,在MFC App类中增加一个QApplication* m_pQtApp的成员。
    在这里插入图片描述

  2. 在MFC App的InitInstance函数中创建QApplication

    BOOL CMFCAppWithQtApp::InitInstance()
    {//qt 初始化int nArgs = 0;m_pQtApp = new QApplication(nArgs, nullptr);//If this property is true, the applications quits when the last visible //primary window (i.e. window with no parent) is closed.m_pQtApp->setQuitOnLastWindowClosed(false);//其他代码:略//....//
    }
  3. 重载MFC App类的Run函数,使其调用qt的消息循环,针对windows,qt底层实现也是windows的消息循环,所以这里改了,MFC的窗口也能正常工作。

    int CMFCAppWithQtApp::Run()
    {
    //	return CWinAppEx::Run();if (!m_pQtApp){return -1;}//调用QT的消息循环int nCode = m_pQtApp->exec();delete m_pQtApp;m_pQtApp = nullptr;return nCode;
    }
    

    此处相对于MFC的run,少调用了OnIdle函数,根据QT帮助文档可知,可以创建一个超时时间为0的QTimer,然后在超时函数中调用MFC App的OnIdle。如果不调用OnIdle函数,一些功能可能会没有,如UpdateCmdUI将不起作用。

    To make your application perform idle processing (by executing a special function whenever there are no pending events), use a QTimer with 0 timeout. More advanced idle processing schemes can be achieved using processEvents().

  4. 从QDialog派生一个对话框类,做下测试,主要测试下qt的窗口显示,以及信号槽机制是否正常工作。

    #pragma once#include <QDialog>class DlgQT_Test : public QDialog
    {Q_OBJECTpublic:DlgQT_Test(QWidget *parent = Q_NULLPTR);~DlgQT_Test();};
    #include "stdafx.h" //MFC移值完后再去除
    #include "DlgQT_Test.h"
    #include ".\GeneratedFiles\Debug\moc_DlgQT_Test.cpp"
    #include <QTableWidget>
    #include <QVBoxLayout>
    #include <QPushButton>
    #include <QFileSystemModel>
    #include <QDir>
    #include <QTreeView>
    #include <QMessageBox>DlgQT_Test::DlgQT_Test(QWidget *parent): QDialog(parent)
    {auto pVLayout = new QVBoxLayout();this->setLayout(pVLayout);this->setStyleSheet("QPushButton{background-color: rgb(255, 0, 0);border-style: outset;border-width: 2px;border-radius: 10px; border-color: beige;font: bold 14px;min-width: 10em;padding: 6px;}");QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::currentPath());QTreeView *tree = new QTreeView();tree->setModel(model);pVLayout->addWidget(tree);auto pTestBtn = new QPushButton(QStringLiteral("按钮"), this);pVLayout->addWidget(pTestBtn);//按钮消息响应QObject::connect(pTestBtn, &QPushButton::clicked, [=](bool){QMessageBox::information(this, QStringLiteral("QT消息框"),QStringLiteral("测试QT弹出消息框"));});
    }DlgQT_Test::~DlgQT_Test()
    {}
    

    注意以上代码中有一行#include ".\GeneratedFiles\Debug\moc_DlgQT_Test.cpp" ,因为是MFC工程,moc_DlgQT_Test.cpp文件是我用qt的moc.exe来生成的,然后在此处包含进来参与编译,生成命令为

    E:\Qt\Qt5.5.1\5.5\msvc2013\bin\moc.exe -o .\GeneratedFiles\Debug\moc_DlgQT_Test.cpp .\DlgQT_Test.h
    
  5. 在MainFrame类中增加测试函数,打开以上qt对话框,进行测试

    void CMainFrame::OnButton2()
    {DlgQT_Test myQTDlg;myQTDlg.exec();
    }

三、运行演示

在这里插入图片描述

相关文章:

初探MFC程序混合使用QT

一、背景 随着操作系统国产化替代的趋势越发明显&#xff0c;软件支持国际化、跨平台&#xff0c;已然是必须做的一件事情。原有的软件UI层用的是MFC&#xff0c;将其换成QT&#xff0c;想必是一种较好的方案。对于大型软件&#xff0c;特别是已发布&#xff0c;但还处于不断迭…...

【LeetCode题库】1068. 产品销售分析 I —— MySQL 性能提升,using()关键字

文章目录 原题题解解题笔记 —— JOIN USING()关键字对性能的提升 我是一名立志把细节都说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正…...

leetcode 1 ~ 100

文章目录 1. 两数之和&#xff08;用哈希表减少查找的时间复杂度&#xff09;2. 两数相加&#xff08;高精度加法&#xff09;3.无重复字符的最长子串&#xff1a;&#xff08;模板&#xff1a;经典的滑动窗口算法&#xff09;5. 最长回文子串&#xff08;枚举&#xff09;6. Z…...

分享6个免费下载电子书的网站

着急看书的宝子们看这里&#xff01; 收藏了一堆电子书网站终于能派上用场了~ 01/Z-Library https://zh.zlibrary-be.se/ 世界上最大的电子图书馆&#xff0c;拥有超千万的书籍和文章资源&#xff0c;99%的书籍资料都能在这里找到。 我给的这个网址现在还能正常打开使用&…...

typescript的入门到吐槽:看了typescript,发现前端真的卷,

typescript TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c;而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。 TypeScript 与 JavaScript 的区别 其实就是对JavaScript的封装&#xff0c;把一个弱类型语言封…...

抖店商品详情API接口,商品上架(主图,价格,sku等属性,)item_get-获得抖店商品详情

抖店商品详情API接口&#xff0c;商品上架&#xff08;主图&#xff0c;价格&#xff0c;sku等属性&#xff0c;&#xff09;item_get-获得抖店商品详情 {"code": 0,"msg": "调用成功","time": "1715166889","data&quo…...

STM32使用ADC单/多通道检测数据

文章目录 1. STM32单片机ADC功能详解 2. AD单通道 2.1 初始化 2.2 ADC.c 2.3 ADC.h 2.4 main.c 3. AD多通道 3.1 ADC.c 3.2 ADC.h 3.3 main.c 3.4 完整工程文件 1. STM32单片机ADC功能详解 STM32单片机ADC功能详解 2. AD单通道 这个代码实现通过ADC功能采集三脚电…...

Unity 性能优化之动态批处理(四)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、动态合批是什么&#xff1f;二、使用动态批处理1.打开动态合批2.满足条件 三、检查动态合批是否成功五、动态合批弊端总结 前言 动态批处理是常用优…...

Windows 11 系统安装时如何跳过联网和逃避微软账号登录

问题描述 Windows 11 是从 22H2 版本之后开始强制联网何登录微软账号的。 这就带来两个问题&#xff1a; 1、如果我的电脑没有网络或者网卡驱动有问题&#xff0c;那就无法继续安装系统了。 2、如果我有强怕症&#xff0c;就是不想登录微软账号&#xff0c;害怕个人信息泄露…...

uniapp + vue3 使用axios

场景 uniapp自带的uni.request不太好用&#xff0c;也有可能是自己用axios用的太熟悉了&#xff0c;所以还是用axios趁手点&#xff0c;所以尝试在uniapp中使用axios。 操作 因为uniapp项目没有package.json&#xff0c;所以先在项目根目录下执行 npm init, 执行完毕后直接…...

关于前后端的参数传递

以前端javascript&#xff0c;后端nodejsexpress为例&#xff0c;后端可以从前端发来的request里获取这些属性&#xff1a;header、query、url、params、body&#xff0c;其中params和query是从url中解析获得&#xff0c;不过express已帮我们做好了&#xff0c;就不用我们自己再…...

华火电焰灶,科技打造“新”厨房

家里最大的空气污染源其实来自厨房里的燃气灶&#xff01;——斯坦福大学发表的《科学进展》期刊 厨房在家庭中占有举足轻重的地位&#xff0c;它不仅是一个烹饪美食的场所&#xff0c;更是家人情感交流的重要空间。厨房大致经历了两次变革&#xff0c;分别是以柴火灶为主体的厨…...

普通人副业要趁早,5种靠谱且持久的赚钱副业

中年危机、35岁被裁&#xff0c;这些听起来就让人焦虑的词汇&#xff0c;是否也让你感到不安&#xff1f;别担心&#xff0c;只要你早早开启副业之旅&#xff0c;这些都不是问题。 今天&#xff0c;我要为你介绍的这5种副业&#xff0c;不仅能帮你赚钱&#xff0c;还能让你的能…...

【文献解析】3D高斯抛雪球是个什么玩意

论文地址&#xff1a;https://arxiv.org/abs/2308.04079 项目&#xff1a;3D Gaussian Splatting for Real-Time Radiance Field Rendering 代码&#xff1a;git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 一、文章概述 1.1问题导向 辐射…...

嘎嘎好用的虚拟键盘第二弹之中文输入法

之前还在为不用研究输入中文而暗自窃喜 这不新需求就来了&#xff08;新需求不会迟到 它只是在路上飞一会儿&#xff09; 找到了个博主分享的代码 是好使的 前端-xyq 已经和原作者申请转载了 感谢~~ 原作者地址&#xff1a;https://www.cnblogs.com/linjiangxian/p/16223681.h…...

vue3使用el-autocomplete请求远程数据

服务器端 RestController RequestMapping("/teacher") public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping({"/v1/getTop10TeacherByName/","/v1/getTop10TeacherByName/{name}"})public ResultBean&l…...

【学习笔记】HarmonyOS 4.0 鸿蒙Next 应用开发--安装开发环境

开发前的准备 首先先到官网去下载Devco Studio 这个开发工具&#xff0c;https://developer.harmonyos.com/cn/develop/deveco-studio/#download 提供了WIndows和Mac的开发环境&#xff0c;我自己是Windows的开发环境。 所以下载之后直接点击exe进行安装即可。 如果之前安装过…...

【PHP】计算两个时间戳之间相差的时间

目录 一、span方法概述 二、输出格式解析 三、方法执行流程 四、应用场景 五、注意事项 六、完整代码示例 时间跨度计算&#xff1a;PHP中的span方法解析 在Web开发中&#xff0c;我们经常需要对时间进行各种计算&#xff0c;尤其是在用户界面中展示时间差或倒计时等功能…...

Out-of-Distribution Detection with Semantic Mismatch under Masking

Out-of-Distribution Detection with Semantic Mismatch under Masking 摘要引言2 相关工作2.1 现有的OOD检测方法2.2基于重构的面向对象检测2.3利用外部OOD数据进行OOD检测2.4 开放集合识别Mismatch under Masking) 摘要 本文提出了一种名为MoodCat的新型分布之外(OOD)检测…...

嫦娥六号近月制动成功,建立月球基地又迈进一步!

嫦娥六号探测器在近月制动的关键时刻&#xff0c;北京航天飞行控制中心内弥漫着紧张而庄重的氛围。每一个航天科技工作者都屏息以待&#xff0c;他们的眼神中充满了期待与自豪。随着一系列精妙绝伦的指令如同琴弦上的音符般流畅地奏响&#xff0c;嫦娥六号探测器在万众瞩目的目…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...