Qt中嵌入Directx11

最近要做个游戏场景编辑器,需要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)
{
	//计算fps
	frameCount++;
	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

版权声明:转载请注明地址,谢谢

时间: 2024-10-25 06:30:28

Qt中嵌入Directx11的相关文章

Qt中嵌入Directx11(有句柄就可以)

最近要做个游戏场景编辑器,需要directx11配合gui框架使用,所以简单地弄了一个directx11嵌入到Qt窗体中的程序. 1 建立工程 建一个Qt的工程,配置好directx的包含目录和库目录(以及附加依赖项),Qt vs2013 add-in的话很方便,直接在vs2013里面加,Qt creator的话写到pro文件里,可以选择生成对应的ui文件,或者不生成. 2 代码结构 工程的结构 D3d11RenderWidget类继承自QWidegt,用于directx11渲染 MainWid

QT中嵌入SDL

原地址:http://www.qtcn.org/bbs/read.php?tid=23926 前段时间在做一个音视频编码板卡的PC跨平台程序,使用QT框架,其中有块功能是往QT里嵌入SDL,来播放YUV格式帧数据,现在已经在windows和linux下完成.我浏览论坛的时候,发现好多同僚在做我以前的准备工作.在这里我把我的一些经验写出来,希望对这些同僚有点帮助,当然可能有有一些错误,请指出来,大家一起进步.一.yay-20060421-2.zip这个包是一个使用SDL的YUV的播放器源代码,在L

在Web页中嵌入QT对象

根据最近读的QT高级编程,原来QT是可以在HTML中嵌入对象的,确实很厉害.于是自己动手写了一个Demo,中途出现了一点点问题,js执行有问题,看来要提交javascript了,我感觉python也应该适当提高提高了.下面要重点提一下我犯的错误. <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 8.0"> <TITLE><

Qt界面中嵌入其他exe程序的界面,使用Qt5

下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/49802993,感谢原作者. 下面是具体的实现方法,用Windows自带的计算器程序做例子.主要的思路就是获取到计算器程序的窗口类名称,然后在Qt中利用QWindow的静态函数fromWinId,创建出QWindow对象,然后将这个对象放到一个QWidget中. 首先是获取计算器程序的窗口类名称,主

qt获得本地IP的方法,qt中域名解析的方法

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境:Ubuntu10.04 + Qt4.7.0 Linux获得本地IP的方法,我尝试了两种 1.用QHostInfo类解析 QHostInfo类可以解析域名,理论上也可以解析本地IP,可是经过尝试,我发现解析出来的IP是127.0.0.1是本地回环地址,不符合我的需求. 代码: [cpp] view plain copy //获取本地IP QHostInfo info=QHostInfo::from

(转)QT中QWidget、QDialog及QMainWindow的区别

QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. QMainWindow 类提供一个有菜单条.锚接窗口(例如工具条)和一个状态条的主应用程序窗口.主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单.工具条和一个状态条.QMainWindow常常被继承,因为这使得封装

qt cef嵌入web(二)

在qt cef嵌入web文章中已经讲述了怎么把cef页面嵌入到qt程序中,但是这样并不完美,因为如果需要在多个窗口上创建cef浏览器部件的话,在 消息监听部分没有办法做区分多个浏览器事件,在这篇文章中我将会把上一篇相关文章中的程序结构稍作改动,以支持多个主浏览器窗口,主要是针对不同的浏览器 产生事件时分发给不同的监听者,说到这儿,有的读者应该就能想到了,监听者肯定是一个数组了,而且 个数和浏览器数目一样多.     在接着往一下看的时候,我默认大家都已经完成创建浏览器并可以成功监听事件.    

QTableView中嵌入复选框CheckBox 的四种方法总结

搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四种比较适合扩展,它除了可以嵌入复选框,还可以通过paint()绘制其它控件,图片等自定义风格. 第一种方法是:编辑委托法 这种方法直接利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件.一般不满足我们实际中的直接显示的需要.可以

QT中QWidget、QDialog及QMainWindow的区别

QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. QMainWindow 类提供一个有菜单条.锚接窗口(例如工具条)和一个状态条的主应用程序窗口.主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单.工具条和一个状态条.QMainWindow常常被继承,因为这使得封装