最近要做个游戏场景编辑器,需要directx11配合gui框架使用,所以简单地弄了一个directx11嵌入到Qt窗体中的程序。

1 建立工程

建一个Qt的工程,配置好directx的包含目录和库目录(以及附加依赖项),Qt vs2013 add-in的话很方便,直接在vs2013里面加,Qt creator的话写到pro文件里,可以选择生成对应的ui文件,或者不生成。

2 代码结构

工程的结构

  • D3d11RenderWidget类继承自QWidegt,用于directx11渲染
  • MainWidget继承自QMainWindow,是包含dx11渲染窗体的父窗体
  • Effects.fx是shader文件,VS和PS写到一起,注意要在工程中设置排除编译
  • main函数是程序入口

3 关键代码

(1)dx11嵌入到Qt中就需要获得某个widgt的句柄hwnd,所以在D3D初始化时要改一个参数,swapChainDesc.OutputWindow=(HWND)winId()

swapChainDesc.BufferDesc=bufferDesc;swapChainDesc.SampleDesc.Count=1;swapChainDesc.SampleDesc.Quality=0;swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT;swapChainDesc.BufferCount=1;swapChainDesc.OutputWindow=(HWND)winId();swapChainDesc.Windowed=TRUE;swapChainDesc.SwapEffect=DXGI_SWAP_EFFECT_DISCARD;

(2)用于渲染的子widget必须设置属性为

setAttribute(Qt::WA_PaintOnScreen,true);
setAttribute(Qt::WA_NativeWindow,true);

否则渲染是乱的
(3)渲染更新借助的就是Qt的paintEvent函数,在里面再调用update()就可以实现渲染循环。(也可以设置定时器隔一定时间强制刷新,不过这样效果不好)

void D3d11RenderWidget::paintEvent(QPaintEvent *event)
{//计算fpsframeCount++;if(getTime() > 1.0f){fps=frameCount;frameCount=0;startFPStimer();//设置父窗口标题显示fps值parentWidget()->setWindowTitle("FPS: "+QString::number(fps));}frameTime=getFrameTime();//更新场景和渲染场景UpdateScene(frameTime);RenderScene();//保证此函数体每一帧都调用update();
}

(4)必须重写resizeEvent函数,重新设置帧缓存、深度和模板缓存以及视口,防止窗口缩放时场景被拉伸或者视口不对应

void D3d11RenderWidget::resizeEvent(QResizeEvent *event)

4 截图

源代码:

csdn:demo

github:demo

Qt中嵌入Directx11相关推荐

  1. Qt中嵌入web网页的几种实现方式

    1.背景 Web网页的界面交互相比较Qt客户端而言有着比较大的优势:更加的多样化和更高的使用便捷性使得我们即使在客户端中也可以考虑将web网页嵌入到客户端的界面当中.如此便能将web的优势和客户端进行 ...

  2. Qt中嵌入视频并循环播放方法

    Qt中插入视频的方法很多,有QVideoPlayer方法,也有用Phonon的,本篇博客就是描述如何在一个QMainwindow界面中,划出一个区域,播放视频,并可以控制视频的切换.停止.暂停.循环, ...

  3. Linux下Qt窗口半透明,Qt实现嵌入桌面的半透明窗口 good

    一.将Qt窗口嵌入到桌面中. 声明一个最简单的类: class Dialog : public QDialog {         Q_OBJECT public:         Dialog(QW ...

  4. python嵌入到qt_在Qt图形用户界面中嵌入绘图

    vpython的FAQs声称vpython的体系结构使任何嵌入都成为一个问题-: Q:有没有办法在另一个环境中嵌入VPython?This is difficult because VPython h ...

  5. Matplotlib画图教程:在QT界面中嵌入三维图片

    Matplotlib画图教程:在QT界面中嵌入三维图片 需求: 做项目报告的时候,有这么一个想法,就是能通过UI随时调用matplotlib进行二维图和三维图的绘制.因此就诞生了做这么一个小模块的想法 ...

  6. 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结

    搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...

  7. C#的WinForm中嵌入Qt界面库

    C#的WinForm中嵌入Qt界面库 为何会有如此奇葩需求 一处代码,多处运行 C#有两种写界面的框架,winFrom和WPF,这二者写的界面可以相互调用,但C#编写的界面组件在非托管C++虽然理论上 ...

  8. 转载:QTableView中嵌入可视化组件

    出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...

  9. Qt中的QDialog

    文章目录 1 Qt中的QDialog 1.1 QDialog简介 1.2 模态对话框和非模态对话框 1.3 对话框的返回值 2 登陆对话框实例分析 2.1 分析 2.2 代码实现 2.3 登录对话框的 ...

最新文章

  1. java支持iSCSI协议,ISCSI协议
  2. D3.js(v3)+react 制作 一个带坐标与比例尺的散点图 (V3版本)
  3. Docker(一):Docker入门教程
  4. 自定义控件 - 流式布局:TagFlowLayout
  5. SAP BC417 课程中文自学笔记
  6. Bootstrap全局css样式_代码
  7. php面向接口编程思想,面向接口编程 - Laravel 实践
  8. html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...
  9. adsl 路由器默认密码
  10. python镜像_Python二叉树的镜像转换实现方法示例
  11. hibernate入门实例
  12. 用单片机测量流体流速的_沟渠流量测量系统宝山哪家质量好广州顺仪品牌
  13. 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
  14. 大话西游服务器维护多长时间,《大话西游3》2010-9-21服务器停机维护公告(二)...
  15. EMD(Exploiting Modification Direction)
  16. rf 433/868MHZ sub-1g 无线通信知识系列(5):SX1208数据传输时间 FSK 波特率等相关计算
  17. 常见浏览器宽高及可视区域的宽高获取问题
  18. iOS 微信分享,返回自己的app 闪退
  19. validation 分组校验注解大全及使用详解
  20. 汇编语言寄存器AX,BX,CX,DX

热门文章

  1. gpu浮点计算能力floaps_为何CPU浮点计算能力差,什么是浮点计算,GPU为何擅长浮点计算?...
  2. 统计基础(九)多元回归模型
  3. python获取cpu温度_Python如何读取CPU和GPU的温度?
  4. python selenuim自动签到京东网页版
  5. 最强蜗牛换了手机找不到服务器,最强蜗牛怎么换服务器 换区换服务器全流程...
  6. 飞腾新8核服务器芯片,国产飞腾桌面级CPU发布:最高2.6GHz 八核只要25W
  7. 捕鱼游戏源码(数值+完整项目资源)
  8. 168.Vue.js智能扫码点餐系统(二)【搭建Vue开发环境】2019.03.18
  9. 以太坊区块链快速入门
  10. 洛谷P5238 整数校验器【三月月赛】