Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: whats_up_doc от Ноябрь 15, 2010, 12:14



Название: qt и direct3d
Отправлено: whats_up_doc от Ноябрь 15, 2010, 12:14
код виджета следующий:
Код
C++ (Qt)
#ifndef _D3D_WIDGET_H_
#define _D3D_WIDGET_H_
 
#include <QtGui/QWidget>
#include <d3d9.h>
 
#pragma comment(lib, "d3d9.lib")
 
class d3d_widget: public QWidget{
 
 Q_OBJECT
 
private:
 IDirect3D9* m_pD3D;
 IDirect3DDevice9* m_pD3DDevice;
 
public:
 d3d_widget(QWidget* _parent);
 ~d3d_widget();
 
 bool init_d3d(HWND _wnd);
 
public slots:
 bool render();
 
private:
 void paintEvent(QPaintEvent* pEvent);
 QPaintEngine* paintEngine();
};
 
#endif
 
#include "d3d_widget.h"
 
d3d_widget::d3d_widget(QWidget* _parent): QWidget(_parent){
 setAttribute(Qt::WA_OpaquePaintEvent, true);
 setAttribute(Qt::WA_NoSystemBackground, true);
 setAttribute(Qt::WA_PaintOnScreen, true);
}
 
d3d_widget::~d3d_widget(){
 
}
 
bool d3d_widget::init_d3d(HWND _wnd){
 m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
 if(!m_pD3D)
   return false;
 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory( &d3dpp, sizeof(d3dpp) );
 d3dpp.Windowed = true;
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
   d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
   d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.EnableAutoDepthStencil = TRUE;
   d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
 
 HRESULT hrResult = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice);
 if (FAILED(hrResult)){
   return false;
 }
 return true;
}
 
bool d3d_widget::render(){
 if(m_pD3DDevice == 0)
   return false;
 m_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
 if(SUCCEEDED(m_pD3DDevice->BeginScene()))
   m_pD3DDevice->EndScene();
 m_pD3DDevice->Present(0, 0, 0, 0);
 return true;
}
 
void d3d_widget::paintEvent(QPaintEvent* pEvent){
 Q_UNUSED(pEvent);
 render();
}
 
QPaintEngine* d3d_widget::paintEngine(){
 return 0;
}
 

при запуске приложения, вместо жёлтого цвета, которым я очищаю буферы, виден стандартный цвет окна qt, причём при репэинте происходит мигание, тоесть сначала отображается буфер директ 3д, а затем qt его затирает, кто нибудь знает, как решить проблему?


Название: Re: qt и direct3d
Отправлено: GreatSnake от Ноябрь 15, 2010, 12:20
Чего-то с установкой атрибутов.

Qt::WA_PaintOnScreen - ... Note: This flag is only supported on X11 and it disables double buffering. ...

Ups - извиняйте, влез в тему не разобравшись - как оказалось для D3D только так и делают