QT中IDirect3DDevice9的Present方法失败情况的处理笔记

这几天在试着使用QT做编辑器,然后打算使用Irrlicht作为渲染引擎。结果在集成的时候遇到了问题。

使用了Irrlicht论坛里面有人提供的QIrrlichtWidget,结果什么都画不出来。仔细跟踪了一下,结果是IDirect3DDevice9的Present函数返回了E_FAIL。

查了下文档,文档只说是内部错误,没有说具体会是什么原因造成的。网上找原因,按照大家说的使用D3D的debug模式,看到了如下的输出信息:

Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present

有人遇到了类似的问题,是先销毁窗口然后继续使用Present函数就会这样,于是我就怀疑到是不是窗口系统出了什么问题。

结果发现了,在创建device的时候获得的winId(),竟然和Present的时候的winId()不同。

于是我怀疑,是我使用QT的窗口系统不当,初始化的时候获得了跟显示出Widget时不同的winId,导致最后Present失败。

于是我使用了下列代码做了实验,代码如下:

 
  
1 QApplication app(argc, argv);
2

3 MainWindow mainWin;
4

5 QVBoxLayout *layout = new QVBoxLayout();
6

7 QIrrlichtWidget* irrWidget = new QIrrlichtWidget();
8 QIrrlichtWidget* irrWidget1 = new
QIrrlichtWidget();
9

10 HWND id1 = irrWidget-> winId();
11

12 layout-> addWidget(irrWidget);
13 layout->
addWidget(irrWidget1);
14

15 // 如果初始化代码在这里,就会导致Present失败,什么都绘制不出来
16 //
irrWidget->init();
17 //
irrWidget1->init();
18 //
setupIrrlicht( irrWidget->getIrrlichtDevice() );
19 //setupIrrlicht( irrWidget1->getIrrlichtDevice() );

20  
21 HWND id2 = irrWidget-> winId();
22

23 mainWin.centralwidget-> setLayout(layout);
24

25 //在这里winId()的返回值就不同了
26   HWND id3 = irrWidget-> winId();
27

28 mainWin.resize(400,400 );
29

30 HWND id4 = irrWidget-> winId();
31

32 //在拥有了正确的winId之后,就可以初始化设备了
33 irrWidget-> init();
34 irrWidget1->
init();
35

36 setupIrrlicht( irrWidget-> getIrrlichtDevice() );
37 setupIrrlicht( irrWidget1->
getIrrlichtDevice() );
38

39 mainWin.show();
40

41 HWND id7 = irrWidget-> winId();
42

43 return app.exec();

上述代码将两个QIrrlichtWidget垂直排列放到一个QVBoxLayout中,init方法就是初始化设备,setupIrrlicht是向场景中添加些绘制的元素,代码都是参照

http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=15112&postdays=0&postorder=asc&highlight=qirrlichtwidget&start=0&sid=ce09058e811438f511b01b2449e2ba71 

来写的。

上面的代码,注释中标记了什么时候winId改变了,以及错误的初始化位置。我没有深入研究QT中winId相关的内容,只是知道了以后要在什么时候初始化,以防再次遇到这样的问题。

特此记录下来与大家分享。

转载于:https://www.cnblogs.com/baixiaohu/archive/2011/02/28/1967540.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值