QT中IDirect3DDevice9的Present方法失败情况的处理笔记
這幾天在試著使用QT做編輯器,然后打算使用Irrlicht作為渲染引擎。結(jié)果在集成的時(shí)候遇到了問題。
使用了Irrlicht論壇里面有人提供的QIrrlichtWidget,結(jié)果什么都畫不出來。仔細(xì)跟蹤了一下,結(jié)果是IDirect3DDevice9的Present函數(shù)返回了E_FAIL。
查了下文檔,文檔只說是內(nèi)部錯(cuò)誤,沒有說具體會(huì)是什么原因造成的。網(wǎng)上找原因,按照大家說的使用D3D的debug模式,看到了如下的輸出信息:
Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present
有人遇到了類似的問題,是先銷毀窗口然后繼續(xù)使用Present函數(shù)就會(huì)這樣,于是我就懷疑到是不是窗口系統(tǒng)出了什么問題。
結(jié)果發(fā)現(xiàn)了,在創(chuàng)建device的時(shí)候獲得的winId(),竟然和Present的時(shí)候的winId()不同。
于是我懷疑,是我使用QT的窗口系統(tǒng)不當(dāng),初始化的時(shí)候獲得了跟顯示出Widget時(shí)不同的winId,導(dǎo)致最后Present失敗。
于是我使用了下列代碼做了實(shí)驗(yàn),代碼如下:
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 //如果初始化代碼在這里,就會(huì)導(dǎo)致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之后,就可以初始化設(shè)備了
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();
上述代碼將兩個(gè)QIrrlichtWidget垂直排列放到一個(gè)QVBoxLayout中,init方法就是初始化設(shè)備,setupIrrlicht是向場景中添加些繪制的元素,代碼都是參照
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=15112&postdays=0&postorder=asc&highlight=qirrlichtwidget&start=0&sid=ce09058e811438f511b01b2449e2ba71?
來寫的。
上面的代碼,注釋中標(biāo)記了什么時(shí)候winId改變了,以及錯(cuò)誤的初始化位置。我沒有深入研究QT中winId相關(guān)的內(nèi)容,只是知道了以后要在什么時(shí)候初始化,以防再次遇到這樣的問題。
特此記錄下來與大家分享。
轉(zhuǎn)載于:https://www.cnblogs.com/baixiaohu/archive/2011/02/28/1967540.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的QT中IDirect3DDevice9的Present方法失败情况的处理笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode139:Word Bre
- 下一篇: 常见浏览器兼容性问题与解决方案?