Bonjour à tous,

Voilà j'ai un "petit" problème. En effet, je dois créer un jeu et donc pour cela j'ai voulu faire une page d'accueil avec un QMainWindow. Jusque la aucun soucis je fais mes boutons NouveauJeu avec mon terrain et tout ce dont j'ai besoin de créer. Mon terrain est un QGraphicScene dans une vue avec des QGraphicItem qui sont mes tanks.

Le problème est que je n'arrive pas à mettre le focus directement à un tank...
Je ne vois pas comment je peux faire car sans le QMainWindow tout marche. En effet dès que j'appuie sur une touche au début de la partie un tank bouge mais là il faut que je clique dessus surement pour lui donner le focus.


Je vais vous mettre le code.

Ma fenêtre principale :

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
 
# include "FenetreAccueil.h"
# include "Jeu.h"
 
 
#include <QSlider>
#include <QGroupBox>
#include <QString>
FenetreAccueil :: FenetreAccueil()
{
	/* Creation des GraphicsView pour le jeu */
	v = new QGraphicsView();
	s = new Terrain(10,10);/* scene */
 
	/* Caracteristique de la fenetre */
 
	//setWindowOpacity(0.8);
	setWindowTitle("WarTank");
	setFixedSize(900,700);
 
		/* Creation de la partie centrale ! */
 
	/*QMdiArea *principale = new QMdiArea;
	principale->setBackground(QPixmap("Accueiltank.jpg"));*/
 
	principale = new QWidget;
	QLabel *label = new QLabel(principale);
	label->setPixmap(QPixmap(".//Images//Accueil_tank.jpg"));
 
	principale->setPalette(QPalette(QColor(0, 255, 127)));
	principale->setAutoFillBackground(true);
	/* Creation des menus deroulants */
 
	QMenu *menuFichier = menuBar()->addMenu("&Fichier");
    QMenu *menuOptions = menuBar()->addMenu("&Options");
    QMenu *menuAide = menuBar()->addMenu("&Aide");
 
	/* Creation des actions des "touches" des menus déroulants */	
 
	QAction *actionNouveauJeu = new QAction("&Nouveau jeu", this);
	menuFichier->addAction(actionNouveauJeu);
 
	QAction *actionQuitter = new QAction("&Quitter", this);
    menuFichier->addAction(actionQuitter);
 
	QAction *actionCommandes = new QAction("&Commande", this);
	menuOptions->addAction(actionCommandes);
 
	QAction *actionAide = new QAction("&Aide", this);
	menuAide->addAction(actionAide);
 
	QAction *actionAPropos = new QAction("A propos de Qt", this);
	menuAide->addAction(actionAPropos);
 
	/* Creation des raccourcis clavier de certaines commandes */
 
	actionNouveauJeu->setShortcut(QKeySequence("F2"));
	actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
	actionAide->setShortcut(QKeySequence("F1"));
 
	/* Ajout des icones pour certaines fonctions */
 
	actionNouveauJeu->setIcon(QIcon(".//Images//Tank.bmp"));
	actionQuitter->setIcon(QIcon(".//Images//Exit.gif"));
	actionCommandes->setIcon(QIcon(".//Images//Clavier.jpg"));
	actionAide->setIcon(QIcon(".//Images//Aide.jpg"));
 
	/* Connection des boutons à leurs signaux */
 
	connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
	connect(actionNouveauJeu, SIGNAL(triggered()), this, SLOT(NouveauJeu()));
	connect(actionAPropos, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
	connect(actionCommandes, SIGNAL(triggered()),this,SLOT(PageCommande()));
	connect(actionAide, SIGNAL(triggered()), this, SLOT(Aide()));
 
	setCentralWidget(principale);
 
}
 
	/* slot pour le bouton Nouveau Jeu*/
void FenetreAccueil :: NouveauJeu()
{
	//setCursor(Qt::ForbiddenCursor);
	QVBoxLayout *layout = new QVBoxLayout;
 
	jeu(v,s);
	layout->addWidget(v);
 
/*	QWidget  * wid = new QWidget;
 
	wid = focusWidget();
	QString str = (QString)wid->windowTitle;
 
	if(hasFocus() == true)
	{
		setWindowTitle(str);
	}
*/	
	principale->setLayout(layout);
}
 
	/* slot pour le bouton Commande */
void FenetreAccueil :: PageCommande()
{
 
//	principale->setCursor(Qt::ForbiddenCursor);
 
	QLabel * ImageCommande = new QLabel(principale);
	QPushButton *boutonOK = new QPushButton("Retour page d'accueil", principale);
 
	boutonOK->move(350,615);
	boutonOK->setFont(QFont("Verdana", 18));
	boutonOK->adjustSize();
 
	ImageCommande->setPixmap(QPixmap(".//Images//Commande.jpg"));
 
	boutonOK->show();
	ImageCommande->show();
 
	connect(boutonOK, SIGNAL(clicked()), this, SLOT(Accueil()));
}
	/* slot pour le bouton Retour page d'accueil */
void FenetreAccueil :: Accueil()
{
	QLabel * Accueil = new QLabel(principale);
 
	Accueil->setPixmap(QPixmap(".//Images//Accueil_tank.jpg"));
	Accueil->show();
}
 
	/* slot pour le bouton Aide */
 
void FenetreAccueil :: Aide()
{
	QDialog *Boite_d_aide =  new QDialog(principale);
	QVBoxLayout *layout = new QVBoxLayout;
	QLabel *label = new QLabel(Boite_d_aide);
 
	/* Modification des caractéristiques de la boite de dialogue */
 
	Boite_d_aide->setWindowTitle("Aide");
	Boite_d_aide->setWindowIcon(QIcon(".//Images//Icone_Aide"));
//	Boite_d_aide->setModal(1); // ligne pour savoir si le joueur peut cliquer sur une autre fenetre du jeu alors que l'aide est ouverte 
	label->setText("<h1> <center>Bonjour et bienvenue dans < br/>War TANK ! </center> </h1> <br /> Le but du jeu est simple vous devez <strong > < span style =\"color : red\" >Annihiler </span> </strong>les tanks adverses avec vos obus < br />sans que vos propres tanks soient détruits ! < br /> A vous de jouer ");
 
	layout->addWidget(label);
	Boite_d_aide->setLayout(layout);
	Boite_d_aide->show();
 
}
/*
void FenetreAccueil :: chargement(int nbre)
{
	for(nbre = 0; nbre > 101; nbre ++);
}*/
int main(int argc, char **argv)
{
	QApplication app(argc, argv);
	FenetreAccueil fen;
	fen.show();
 
	return app.exec();
}
La fonction jeu qui est assez petite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
#include "Jeu.h"
void jeu(QGraphicsView *v, Terrain *s)
{
	srand(time(NULL));	
 
	s->start();
	v->setFocus();
 
	v->resize(900, 700);
	v->setScene(s);
 
}
Et ma création de terrain avec ses items.

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
 
#include "Terrain.h"
 
Terrain :: Terrain(int _nbtank,int _nbobstacle)
{
	nb_tank = _nbtank;
	nb_obstacle = _nbobstacle;
	/*
	Tank t();
	for(int i= 0;i< nb_tank; i++)
	{
		tank1.push_back(t);
	}
	*/
	tank = new Tank* [nb_tank];
	obstacle = new Obstacle* [100];
}
 
void Terrain :: start()
{
	W  *widget = new W;
	Obus *obus = new Obus(1);
	Obus *obus1 = new Obus(2);
	Obus *obus2 = new Obus(3);
 
	obus2->setPos(20,20);
	obus1->setPos(10,10);
 
	setBackgroundBrush(QBrush(QColor(143,158,35,255)));
	addItem(widget);
	addItem(obus);
	addItem(obus1);
	addItem(obus2);
 
	for(int i = 0;i<nb_tank;i++)
	{
		tank[i] = new Tank();
		addItem(tank[i]);
 
		tank[0]->setFocus(Qt::PopupFocusReason);
 
		while(collidingItems(tank[i]).isEmpty() == false)
		{
			tank[i]->setPos(rand()%750,rand()%550);
		}
	}
	for(int i = 0;i<nb_obstacle;i++)
	{
		obstacle[i] = new Obstacle();
		addItem(obstacle[i]);
		while(collidingItems(obstacle[i]).isEmpty() == false)
		{
			obstacle[i]->setPos(rand()%750,rand()%550);
		}
	}
	ajouter_obstacle(400,300,100);
	if(tank[0]->hasFocus() == true)
	{
		setBackgroundBrush(QBrush(QColor(10,10,10,255)));
	}
}
 
int Terrain :: collision(QGraphicsItem * item)
{
	for(int i=0; i< nb_obstacle;i++)
	{
		if(collidingItems(obstacle[i]).isEmpty() == false)
		{
			if (obstacle[i]->get_type() == 4)
			{
				return 2;
			}
			return 0;
		}
	}
	for(int i = 0;i<nb_tank;i++)
	{
		if(collidingItems(tank[i]).isEmpty() == false)
		{
			return 0;
		}
	}
	return 1;
}
 
void Terrain :: ajouter_obstacle (qreal x , qreal y , float rayon)
{
	obstacle[nb_obstacle] = new Obstacle(1,-rand()%10+1,rayon);
	obstacle[nb_obstacle]->setPos(x-rayon,y-rayon);
	addItem(obstacle[nb_obstacle]);
	nb_obstacle ++;
 
}

Pour vous aidez je pense que tout se passe dans le Signal NouveauJeu et la fonction start(); dans la classe Terrain.
Comme vous pouvez le voir j'ai fait quelque test et je vois que le tank[0] a bien le focus donc ... je sèche.
Si vous avez une idée ??? Merci d'avance !!!