Tu peut mettre le code de ta widget??
Voila le code de mon widget :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #ifndef DEF_MAFENETREDX #define DEF_MAFENETREDX #include <QApplication> #include <QWidget> #include <QPushButton> #include <QTimer> #include <windows.h> #include <d3d10.h> #include <d3dx10.h> class MaFenetreDX : public QWidget { public: MaFenetreDX(QWidget *parent = 0); virtual ~MaFenetreDX(); private: virtual void paintEvent(QPaintEvent *e); virtual void showEvent(QShowEvent *e); virtual void resizeEvent(QResizeEvent *e); virtual void moveEvent(QMoveEvent *e); QTimer myTimer; D3D10_DRIVER_TYPE g_driverType; ID3D10Device* g_pd3dDevice; IDXGISwapChain* g_pSwapChain; ID3D10RenderTargetView* g_pRenderTargetView; ID3D10Effect* g_pEffect; ID3D10EffectTechnique* g_pTechnique; ID3D10InputLayout* g_pVertexLayout; ID3D10Buffer* g_pVertexBuffer; ID3D10Buffer* g_pIndexBuffer; ID3D10EffectMatrixVariable* g_pWorldVariable; ID3D10EffectMatrixVariable* g_pViewVariable; ID3D10EffectMatrixVariable* g_pProjectionVariable; D3DXMATRIX g_World; D3DXMATRIX g_View; D3DXMATRIX g_Projection; // Structures struct SimpleVertex { D3DXVECTOR3 Pos ; D3DXVECTOR4 Color; }; HRESULT InitDevice() ; void CleanupDevice() ; void Render() ; bool initDevice; }; #endifSi besoin je pourrais mettre le projet complet en .zip.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 #include "MaFenetreDX.h" MaFenetreDX :: MaFenetreDX(QWidget *parent) : QWidget(parent) { // Mise en place de quelques options pour autoriser le rendu direct dans le widget setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoSystemBackground); setMinimumSize(320, 240); this->setWindowTitle("Rendu"); g_driverType = D3D10_DRIVER_TYPE_NULL ; g_pd3dDevice = NULL ; g_pSwapChain = NULL ; g_pRenderTargetView = NULL ; g_pEffect = NULL ; g_pTechnique = NULL ; g_pVertexLayout = NULL ; g_pVertexBuffer = NULL ; g_pIndexBuffer = NULL ; g_pWorldVariable = NULL ; g_pViewVariable = NULL ; g_pProjectionVariable = NULL ; initDevice = false; myTimer.setInterval(0); } MaFenetreDX :: ~MaFenetreDX() { CleanupDevice() ; } void MaFenetreDX :: showEvent(QShowEvent *e) { InitDevice(); QWidget::showEvent(e); connect(&myTimer, SIGNAL(timeout()), this, SLOT(update())); myTimer.start(); } void MaFenetreDX :: paintEvent(QPaintEvent *e) { if(initDevice) { QWidget::paintEvent(e); Render(); update(); } } void MaFenetreDX :: moveEvent(QMoveEvent *e) { QWidget::moveEvent(e); update(); } void MaFenetreDX :: resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); update(); } /*----------------------------------------------------------------- Nom : InitDevice() Description : Création du Device et l'associe à une Swap Chain -----------------------------------------------------------------*/ HRESULT MaFenetreDX :: InitDevice() { HRESULT hr = S_OK ; //RECT rc ; //GetClientRect(hWnd, &rc) ; //UINT width = rc.right - rc.left ; //UINT height = rc.bottom - rc.top ; UINT width = 640 ; UINT height = 480 ; UINT createDeviceFlags = 0 ; #ifdef _DEBUG createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG ; #endif D3D10_DRIVER_TYPE driverTypes[] = { D3D10_DRIVER_TYPE_HARDWARE, D3D10_DRIVER_TYPE_REFERENCE, }; UINT numDriverTypes = sizeof(driverTypes) / sizeof(driverTypes[0]) ; DXGI_SWAP_CHAIN_DESC sd ; ZeroMemory(&sd, sizeof(sd)) ; sd.BufferCount = 1 ; sd.BufferDesc.Width = width ; sd.BufferDesc.Height = height ; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM ; sd.BufferDesc.RefreshRate.Numerator = 60 ; sd.BufferDesc.RefreshRate.Denominator = 1 ; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT ; sd.OutputWindow = this->winId(); sd.SampleDesc.Count = 1 ; sd.SampleDesc.Quality = 0 ; sd.Windowed = TRUE ; for(UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) { g_driverType = driverTypes[driverTypeIndex] ; hr = D3D10CreateDeviceAndSwapChain(NULL, g_driverType, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) ; if(SUCCEEDED(hr)) break ; } }
Merci.
et si tu vire cette ligne QWidget::paintEvent(e); ?
D'autre lien trouvé :
http://lists.trolltech.com/qt-intere...ad00316-0.html
http://www.krizka.net/2008/04/27/cus...ms-with-qt-44/
Regarde aussi les source de QGLWidget. Tu trouvera surement des choses.
ok merci je vais regarder tout ça et voir si j'arrive à régler ce problème.
Je viens de faire ca dans mon widget :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 QPaintEngine *MaFenetreDX :: paintEngine() { return NULL; }
mais mon rendu clignote toujours dans le widget.
Si quelqu'un sait pourquoi qu'il me fasse signe.
Merci.
Bon voila ça fonctionne enfin.
En fait il ne fallait pas oublier de déclarer la fonction en constante :
Dans le .h :
Dans le .cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QPaintEngine *paintEngine() const;
Voila ce n'était pas grand chose en fin de compte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 QPaintEngine *MaFenetreDX:: paintEngine() const { return 0; }
Merci à ceux qui m'ont aidé. (superjaja, Yan)
Ok. Super. Tu peux remettre le code source final de ton Widget. cela peut servir a beaucoup de monde je pense. Peut etre meme qu'on pourra en faire une question dans la FAQ si tu veux.
Merci par avance.
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
Oui pas de problème il faudrait que tu me dises comment faire et je le rédigerai.
Voila le code complet de mon widget.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #ifndef DEF_MAFENETREDX #define DEF_MAFENETREDX #include <QApplication> #include <QWidget> #include <QPushButton> #include <QTimer> #include <windows.h> #include <d3d10.h> #include <d3dx10.h> class MaFenetreDX : public QWidget { public: MaFenetreDX(QWidget *parent = 0); virtual ~MaFenetreDX(); private: virtual void paintEvent(QPaintEvent *e); virtual void showEvent(QShowEvent *e); virtual void resizeEvent(QResizeEvent *e); virtual void moveEvent(QMoveEvent *e); virtual QPaintEngine *paintEngine() const; QTimer myTimer; HRESULT InitDevice() ; void CleanupDevice() ; void Render() ; bool initDevice; }; #endifVoila, par contre il n'y a pas le code concernant DirectX il y a seulement le nom des fonctions utilisées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 #include "MaFenetreDX.h" MaFenetreDX :: MaFenetreDX(QWidget *parent) : QWidget(parent) { // Mise en place de quelques options pour autoriser le rendu direct dans le widget setAttribute(Qt::WA_PaintOnScreen, true); setAttribute(Qt::WA_NoSystemBackground, true); setMinimumSize(320, 240); initDevice = false; this->setWindowTitle("Rendu"); myTimer.setInterval(0); } MaFenetreDX :: ~MaFenetreDX() { CleanupDevice() ; } void MaFenetreDX :: showEvent(QShowEvent *e) { InitDevice(); QWidget::showEvent(e); connect(&myTimer, SIGNAL(timeout()), this, SLOT(update())); myTimer.start(); } void MaFenetreDX :: paintEvent(QPaintEvent *e) { if(initDevice) { QWidget::paintEvent(e); Render(); update(); } } QPaintEngine *MaFenetreDX:: paintEngine() const { return 0; } void MaFenetreDX :: moveEvent(QMoveEvent *e) { QWidget::moveEvent(e); } void MaFenetreDX :: resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); }
Si quelqu'un veut le code complet avec les sources je pourrais mettre un zip à disposition.
Partager