Here is a full working example:
Direct3DWidget.h
#ifndef DIRECT3DWIDGET_H
#define DIRECT3DWIDGET_H
#include <QtGui/QWidget>
#include <d3d9.h>
#include <atlbase.h>
class Direct3DWidget
: public QWidget{
Q_OBJECT
CComPtr<IDirect3D9> m_pD3D;
CComPtr<IDirect3DDevice9> m_pd3dDevice;
public:
Direct3DWidget
(QWidget *parent
= );
~Direct3DWidget();
bool InitDirect3D();
public slots:
bool Rendering();
private:
};
#endif
#ifndef DIRECT3DWIDGET_H
#define DIRECT3DWIDGET_H
#include <QtGui/QWidget>
#include <d3d9.h>
#include <atlbase.h>
class Direct3DWidget : public QWidget
{
Q_OBJECT
CComPtr<IDirect3D9> m_pD3D;
CComPtr<IDirect3DDevice9> m_pd3dDevice;
public:
Direct3DWidget(QWidget *parent = );
~Direct3DWidget();
bool InitDirect3D();
public slots:
bool Rendering();
private:
void paintEvent(QPaintEvent *pEvent);
};
#endif
To copy to clipboard, switch view to plain text mode
Direct3DWidget.cpp
#include "Direct3DWidget.h"
Direct3DWidget
::Direct3DWidget(QWidget *parent
/* = 0 */): QWidget(parent
){
setAttribute(Qt::WA_PaintOnScreen);
}
Direct3DWidget::~Direct3DWidget()
{
}
bool Direct3DWidget::InitDirect3D()
{
m_pD3D = Direct3DCreate9( D3D_SDK_VERSION);
if(!m_pD3D)
return false;
D3DPRESENT_PARAMETERS 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, winId(),
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &m_pd3dDevice );
if(FAILED(hrResult))
return false;
return true;
}
bool Direct3DWidget::Rendering()
{
if(m_pd3dDevice == )
return false;
m_pd3dDevice->Clear(, , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 255, ), 1.0f, );
if(SUCCEEDED(m_pd3dDevice->BeginScene()))
{
m_pd3dDevice->EndScene();
}
m_pd3dDevice->Present( , , , );
return true;
}
{
Q_UNUSED(pEvent);
Rendering();
}
#include "Direct3DWidget.h"
Direct3DWidget::Direct3DWidget(QWidget *parent /* = 0 */): QWidget(parent)
{
setAttribute(Qt::WA_PaintOnScreen);
}
Direct3DWidget::~Direct3DWidget()
{
}
bool Direct3DWidget::InitDirect3D()
{
m_pD3D = Direct3DCreate9( D3D_SDK_VERSION);
if(!m_pD3D)
return false;
D3DPRESENT_PARAMETERS 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, winId(),
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &m_pd3dDevice );
if(FAILED(hrResult))
return false;
return true;
}
bool Direct3DWidget::Rendering()
{
if(m_pd3dDevice == )
return false;
m_pd3dDevice->Clear(, , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 255, ), 1.0f, );
if(SUCCEEDED(m_pd3dDevice->BeginScene()))
{
m_pd3dDevice->EndScene();
}
m_pd3dDevice->Present( , , , );
return true;
}
void Direct3DWidget::paintEvent(QPaintEvent *pEvent)
{
Q_UNUSED(pEvent);
Rendering();
}
To copy to clipboard, switch view to plain text mode
Example:
#include <QtGui/QWidget>
#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include "Direct3DWidget.h"
int main(int argc, char *argv[])
{
//------------------------------Start initialization
//Additional parameters, just add a parameter separated by comma
std::string aAdditionalParameters[] = {"-direct3d"};
int iRealArgumentAmount = argc + sizeof(aAdditionalParameters)/sizeof(std::string);
//This double pointer will contain parameters from argv and
//statical parameters which necessary for this application
char** pArguments = new char*[iRealArgumentAmount];
//Copy all source(from the command line) parameters
for(int i = ; i < argc; ++i)
{
*(pArguments + i) = new char[ strlen(argv[i]) + 1 ];
strcpy( *(pArguments + i), argv[i] );
}
//Append parameters we want to add
for(int i = argc, j = ; i < iRealArgumentAmount; ++i, ++j)
{
*(pArguments + i) = new char[ aAdditionalParameters[j].size() + 1 ];
strcpy( *(pArguments + i), aAdditionalParameters[j].c_str() );
}
for(int i = ; i < iRealArgumentAmount; ++i)
delete []*(pArguments + i);
delete []pArguments;
//--------------------------------Initialization complete
Direct3DWidget* xScene = new Direct3DWidget(&xMainWindow);
xMainLayout->addWidget(xScene);
xMainWindow.setLayout(xMainLayout);
//It is important to initialize the Direct3d after the widget was embedded to the window
xScene->InitDirect3D();
xMainWindow.show();
return xApplication.exec();
}
#include <QtGui/QWidget>
#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include "Direct3DWidget.h"
int main(int argc, char *argv[])
{
//------------------------------Start initialization
//Additional parameters, just add a parameter separated by comma
std::string aAdditionalParameters[] = {"-direct3d"};
int iRealArgumentAmount = argc + sizeof(aAdditionalParameters)/sizeof(std::string);
//This double pointer will contain parameters from argv and
//statical parameters which necessary for this application
char** pArguments = new char*[iRealArgumentAmount];
//Copy all source(from the command line) parameters
for(int i = ; i < argc; ++i)
{
*(pArguments + i) = new char[ strlen(argv[i]) + 1 ];
strcpy( *(pArguments + i), argv[i] );
}
//Append parameters we want to add
for(int i = argc, j = ; i < iRealArgumentAmount; ++i, ++j)
{
*(pArguments + i) = new char[ aAdditionalParameters[j].size() + 1 ];
strcpy( *(pArguments + i), aAdditionalParameters[j].c_str() );
}
QApplication xApplication(iRealArgumentAmount, pArguments);
for(int i = ; i < iRealArgumentAmount; ++i)
delete []*(pArguments + i);
delete []pArguments;
//--------------------------------Initialization complete
QWidget xMainWindow;
Direct3DWidget* xScene = new Direct3DWidget(&xMainWindow);
QHBoxLayout* xMainLayout = new QHBoxLayout;
xMainLayout->addWidget(xScene);
xMainWindow.setLayout(xMainLayout);
//It is important to initialize the Direct3d after the widget was embedded to the window
xScene->InitDirect3D();
xMainWindow.show();
return xApplication.exec();
}
To copy to clipboard, switch view to plain text mode
But there is a problem.. I don't know why but on some computers this draw nothing. Perhaps the problem lies in the experimental support of the directx in Qt. The workaround I've found is to use timer for redrawing scene. But I didn't test new Qt releases maybe they fixed this bug?
Bookmarks