Bonjour, je souhaite utiliser le module Network de Qt dans mon projet qui tourne avec la SDL en C++.
J'ai tenté une compilation à la main d'un projet simple:
main.cpp initialise SDL et crée la fenetre tandis que QtClient.cpp
contient la classe Client ainsi que ses méthodes (QtClient.hpp se
contentant de déclarer le prototype de la classe...)
Sous CodeBlocks, j'ai tout linké les modules utilisés:
QtGui4, QtNetwork4 et QtCore4.
J'ai aussi ajouté les dossiers include.
La compilation passe... mais bute sur une erreur:
Après plusieurs recherches il me semble que ce soit l'appel de Mocobj\Debug\QtClient.o: In function `ZN6ClientC2Ev':
D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
obj\Debug\QtClient.o: In function `ZN6ClientC1Ev':
D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
=== Build finished: 4 errors, 0 warnings ===
qui pose problème puisqu'il n'est pas appellé et c'est lui qui est en charge
de gérer les connexions de SIGNAL & SLOTS.
Donc je tente de passer par la méthode classique de compilation
"qmake -project, qmake, make" en ajoutant les includes et links manquants.
Je finis par buter sur d'autres problèmes de compilation...
Quelqun aurait-il déjà essayé de mélanger SDL avec un module de Qt ?
Je précise si ce n'était pas clair, je ne veux pas utiliser les fonctions de dessin
et gestion de fenêtre de Qt, je tiens à garder SDL car j'ai tout fais dessus.
Je veux utiliser le module Network de Qt et surtout profiter des SIGNALS & SLOTS si utiles et ne pas recoder un gestionnaire d'évenements similaire mais en mal fait comparé à Qt...
Merci de m'avoir lu et d'avance merci.
main.cpp:
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 #ifdef __cplusplus #include <cstdlib> #else #include <stdlib.h> #endif #ifdef __APPLE__ #include <SDL/SDL.h> #else #include <SDL.h> #endif #include <iostream> #include <QDialog> #include <QApplication> #include <QtNetwork> int main ( int argc, char** argv ) { if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { printf( "Unable to init SDL: %s\n", SDL_GetError() ); return 1; } atexit(SDL_Quit); SDL_Surface* screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if ( !screen ) { printf("Unable to set 640x480 video: %s\n", SDL_GetError()); return 1; } bool done = false; while (!done) { SDL_Event event; SDL_PollEvent(&event); switch( event.type ) { case SDL_QUIT: done = true; case SDL_KEYDOWN: { switch( event.key.keysym.sym ) { case SDLK_ESCAPE: done = true; break; default:; } } } SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 255, 255)); SDL_Flip(screen); } return 0; }
Qtclient.cpp:
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 #include <QtGui> #include <QtNetwork> #include <iostream> #include "QtClient.hpp" using namespace std; Client::Client(QWidget* parent) : QDialog(parent) { connect(&tcpSocket, SIGNAL(connected()), this, SLOT( ConnexionAccepte() )); connect(&tcpSocket, SIGNAL(disconnected()), this, SLOT( ConnectionClosedByServer() )); connect(&tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT( error() )); connect(&tcpSocket, SIGNAL(readyRead()), this, SLOT( ReceiveData() )); } void Client::ToggleConnexion() { // Si le socket est connecté alors on le déconnecte. if( tcpSocket.state() == 3 ) { CloseConnection(); } else if( tcpSocket.state() == 0 ) // UnconnectedState. { nextBlockSize = 0; } } void Client::sendRequest() { } void Client::ReceiveData() { } void Client::ConnexionAccepte() { } void Client::ConnectionClosedByServer() { CloseConnection(); } void Client::error() { CloseConnection(); } void Client::CloseConnection() { tcpSocket.close(); }
QtClient.hpp:
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 #ifndef QT_CLIENT #define QT_CLIENT #include <QDialog> #include <QTcpSocket> class Client : public QDialog { Q_OBJECT public: Client(QWidget *parent = 0); private slots: void ConnexionAccepte(); void ConnectionClosedByServer(); void error(); void sendRequest(); void ReceiveData(); void ToggleConnexion(); void CloseConnection(); private: QTcpSocket tcpSocket; quint16 nextBlockSize; }; #endif
Partager