Войти
ПрограммированиеФорумОбщее

qt d3d

#0
18:38, 14 ноя. 2010

Есть проблема, создал виджет для работы с д3д, но он не отображается, при перерисовки окна, видно, что окно qt рисуется поверх виджета, так как происходит характерное моргание, как это исправить?


#1
20:03, 14 ноя. 2010

setAutoFillBackground ( 0 )?

#2
20:09, 14 ноя. 2010

В свое время убил на решение этой роблемы несколько дней. Но все найденый способы имели глюки и недостатки.

Так как приложение было внутреннее, только для себя. Остановился на том, что рисовал сцену не в onPaint виджета, а во внешнем таймере.

#3
20:29, 14 ноя. 2010

whats_up_doc

Устанавливай в конструкторе свойства:

setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_PaintOnScreen, true);
и переопредели метод paintEngine():
QPaintEngine* D3DWidget::paintEngine() const
{
  return 0;
}
После этого - делай в paintEvent() что хочешь, Qt туда вообще ничего не нарисует.
Еще Qt есть тонкости с установкой центрального виджета на QMainWindow (setCentralWidget()) . Т.е. сначала виджет нужно сделать центральным, а потом спрашивать у него winId() (или наоборот - не помню, но это важно).

#4
21:14, 14 ноя. 2010

в общем код такой получился:

#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;
}

проблема не решилась, как моргал при репеинте, так и моргает (%

Прошло более 5 лет
#5
12:37, 17 мая 2016

Ghost2 cпасибо за подсказку.

С const все работает как нужно и не моргает:

QPaintEngine* D3DWidget::paintEngine() const;
ПрограммированиеФорумОбщее

Тема в архиве.