MFC-RIBBON/QT混合编程‘完美’方案

news2024/11/27 8:44:04

[工程建立]

  1. 在VC用向导生成一个QT GUI程序,将里面的代码文件等删除(.vcxproj等保留)
  2. 在VC用向导生成另一个MFC/Ribbon程序,将里面的代码资源文件等拷贝到前一工程
  3. 进入第一个工程,做必要小修改。
    //[app.cpp]
    QMfcApp* _qApp = nullptr;
    // CQtMFCApplication 构造
    
    CQtMFCApplication::CQtMFCApplication() noexcept
    {
    	m_bHiColorIcons = TRUE;
    
    	int argc = 0;
    	_qApp = new QMfcApp(argc, nullptr);
    	_qApp->mfc_app = this;
    	//...	
    }
    
    int CQtMFCApplication::Run()
    {
    	int ret = _qApp->exec();
    	delete _qApp;
    	ExitInstance(); //needed
    	return ret;
    
    	return CWinAppEx::Run();
    }
    
    
    //[Frame.h]
    class CMainFrame : public CMDIFrameWndEx
    {
    //...
    
    protected:
    	static QWidget* mainWidget;
    	friend QWidget* getMainWidget();
    
    private:
    	void CreateQtWidget();
    };
    
    //[Frame.cpp]
    
    QWidget* CMainFrame::mainWidget = nullptr;
    
    QWidget* getMainWidget()
    {
    	return CMainFrame::mainWidget;
    }
    
    void CMainFrame::CreateQtWidget()
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    	HWND hWnd = GetSafeHwnd();
    	QWidget* pQWidget = new QWinWidget(hWnd, nullptr);
    	mainWidget = pQWidget;
    }
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	//...
    	CreateQtWidget();
    	//...
    }
    
    void CMainFrame::OnDestroy()
    {
    	CMDIFrameWndEx::OnDestroy();
    
    
    	if (mainWidget)
    	{
    		delete mainWidget;
    		mainWidget = nullptr;
    	}
    }
    
    //[view.h]
    class CQtMFCApplicationView : public CView
    {
    	//...
    private:
    	QWidget* m_qtContainer = nullptr;
    	//...
    }
    
    //[view.cpp]
    
    void CQtMFCApplicationView::OnInitialUpdate()
    {
    	CView::OnInitialUpdate();
    
    	m_qtContainer = new QWinWidget(m_hWnd, nullptr);
    	QVBoxLayout* vbox = new QVBoxLayout(m_qtContainer);
    
    	QPushButton* btn = new QPushButton(QString::fromStdWString(L"QPushButton 你好!"), m_qtContainer);
    	btn->setFixedWidth(256);
    	btn->setFixedHeight(64);
    	vbox->addWidget(btn, 0, Qt::AlignCenter);
    
    	m_qtContainer->setLayout(vbox);
    
    	QObject::connect(btn, &QPushButton::clicked, [&]()
    		{
    			QMessageBox::information(getMainWidget(), "QMessageBox Title", QString::fromStdWString(L"你点击了 QPushButton"));
    		});
    }
    
    
    void CQtMFCApplicationView::OnSize(UINT nType, int cx, int cy)
    {
    	CView::OnSize(nType, cx, cy);
    
    	if (m_qtContainer)
    	{
    		CRect clientRect;
    		GetClientRect(&clientRect);
    
    		m_qtContainer->setGeometry(clientRect.left,
    			clientRect.top,
    			clientRect.Width(), clientRect.Height());
    		m_qtContainer->show();
    	}
    }
    
    
    void CQtMFCApplicationView::OnDestroy()
    {
    	CView::OnDestroy();
    
    	if (m_qtContainer)
    	{
    		//!!!必须添加这句,否则delete后,程序崩溃退出
    		//m_qtContainer在创建时,没有PaentWidget. 如果创建时设置,则其不会显示
    		m_qtContainer->setParent(getMainWidget()); 
    		delete m_qtContainer;
    		m_qtContainer = nullptr;
    	}
    	return;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么学习黑客?最全黑客自学路线

谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈 技术圈 职业圈。 娱乐圈:主要是初中生和高中生较多,玩网恋…

乱糟糟的YOLOv8-detect和pose训练自己的数据集

时代在进步,yolo在进步,我还在踏步,v8我浅搞了一下detect和pose,记录一下,我还是要吐槽一下,为啥子这个模型就放在了这个文件深处,如图。 以下教程只应用于直接应用yolov8,不修改。…

k8s之存储篇---数据卷Volume

数据卷概述 Kubernetes Volume(数据卷)主要解决了如下两方面问题: 数据持久性:通常情况下,容器运行起来之后,写入到其文件系统的文件暂时性的。当容器崩溃后,kubelet 将会重启该容器&#xff…

C++中为什么有模板的函数不能和.h文件分离,即分别声明和定义

目录 1.查看问题 2.探索问题 3.解决问题 1.查看问题 1.先看下面三个文件 stack.h stack.cpp test.cpp 2.探索问题 有了解的小伙伴应该知道大概率是在预处理,编译,汇编,链接中编译环节出错了,它在其他文件中无法通过定义找到函…

高效UI设计必备的4个UI设计软件,真的好用!

随着UI设计工作的不断发展,工作中的需求变得更加多样,一个好用的 UI 设计软件将极大减轻设计师的工作负担,提高设计师的工作效率,今天本文精选了4款好用的UI设计软件,并将逐一介绍的它们各自的特点和用法,给…

linux+QT+FFmpeg 6.0,把多个QImage组合成一个视频

直接上代码吧: RecordingThread.h#ifndef RECORDINGTHREAD_H #define RECORDINGTHREAD_H #include "QTimer" #include <QObject> #include <QImage> #include <QQueue>extern "C"{//因为FFmpeg是c语言,QT里面调用的话需要extern "C…

基于Java swing和mysql实现的学生选课管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套Java swing和mysql实现的学生选课管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严…

浮点动作 转 布尔动作(FloatActionToBooleanAction)

文章目录 思维导图具体步骤1、“浮点动作”的创建2、“布尔动作”的创建3、用“FloatToBoolean.cs”把两个动作联系起来 注意 思维导图 具体步骤 1、“浮点动作”的创建 “右手柄 扳机键 按下”需借助“Input.UnityInputManager.1DAxisAction”预设体成为FloatAction&#xf…

Java 读取TIFF JPEG GIF PNG PDF

Java 读取TIFF JPEG GIF PNG PDF 本文解决方法基于开源 tesseract 下载适合自己系统版本的tesseract &#xff0c;官网链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 下载之后安装&#xff0c;安装的时候选择选择语言包&#xff0c;我选择了中文和英文 3.…

代码随想录打卡—day44—【DP】— 8.28 完全背包基础

1 完全背包基础 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 而完全背包的物品是可以添加多次的&#xff0c;所以要内嵌的背包容量循环从小到大去遍历&#xff0c;即&#xff1a;&#xff08;至于为什么&#xff0c;内嵌背包容量循环从小到大遍历…

mysql 计算两点之间距离

先说一下我们可能会用到的一些场景&#xff0c;这样同学们可以先评估&#xff0c;该篇文章是否对你有帮助&#xff01; 场景&#xff1a; 假设 美团&#xff0c;我点外卖时&#xff0c;系统会让我先进行定位&#xff0c;比如我定位在了 A 点&#xff0c;系统就会给我推荐&…

八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

八路参考文献&#xff1a;&#xff3b;八一新书&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&#xff0e;

多商户门店会员卡充值收款营销公众号开发

多商户门店会员卡充值收款营销公众号开发 一、功能特色&#xff1a; 专注于收款码支持商户入驻功能&#xff0c;降低运营成本资金可以直接到达商户&#xff0c;支持微信分账方式分配佣金&#xff0c;完全符合支付结算相关法规充值、充次支持给赠值设置有效期&#xff0c;促进…

防雷浪涌保护器选型方案

防雷浪涌保护器是一种用于保护电气设备免受雷电或其他电源干扰引起的过电压或过电流的装置。防雷浪涌保护器的选型应根据国家标准、设备要求和实际工程条件进行&#xff0c;以达到既满足防雷验收要求&#xff0c;又能有效保护设备的目的。地凯科技介绍一些常用的防雷浪涌保护器…

论文解读 | OmniObject3D:用于逼真感知、重建和生成的大词汇量3D对象数据集

原创 | 文 BFT机器人 这篇论文的主要目标是介绍和探索OmniObject3D数据集&#xff0c;该数据集包含大量真实扫描的3D物体&#xff0c;涵盖了190个类别&#xff0c;提供了多种丰富的注释&#xff0c;包括纹理3D网格、采样点云、多视图图像等。作者将OmniObject3D应用于多个3D视…

mysql和mybatisPlus实现:datetime类型的字段范围查询

前提说明 数据库在存储数据时,我们为了精确一下时间,便会把改时间类型的字段设置为datetime类型; 在过滤数据库数据时,我们又需要对该字段进行一个范围的过滤 由此,便出现了这篇博客 datetime数据类型 在MySQL中,datetime数据类型用于保存日期和时间的值。它的格式为Y…

ChatGPT 制作可视化柱形图突出显示第1名与最后1名

对比分析柱形图的用法。在图表中显示最大值与最小值。 像这样的动态图表的展示只需要给ChatGPT,AIGC,OpenAI 发送一个指令就可以了, 人工智能会快速的写出HTML与JS代码来实现。 请使用HTML,JS,Echarts完成一个对比分析柱形图,在图表中突出显示第1名和最后1名用单独一种不…

局域网远程软件Radmin

Radmin是一个快速且安全的远程控制和远程访问软件&#xff0c;通过它可以就像坐在远程计算机前一样&#xff0c;在远程计算机上工作&#xff0c;并可以从多个位置访问远程计算机。&#xff08;本例使用的版本是Radmin 3.5&#xff09; 下载Radmin 3.5安装包。 Radmin 3.5安装…

通信原理板块——基础知识(三)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 7、能量信号的频谱密度 (1)能量信号…

直播时代下的海外网红营销:挑战与机遇并存

随着科技的迅猛发展&#xff0c;互联网正在以前所未有的速度改变着人们的生活方式和商业模式。其中&#xff0c;直播和网红营销作为数字时代的新生力量&#xff0c;迅速崛起并引领着市场的潮流。特别是在海外市场&#xff0c;直播时代为海外网红营销带来了前所未有的机遇和挑战…