Bonjour,
M'étant mis à Qt depuis peu, je réécris d'anciennes applications pour les tester.
J'ai actuellement des soucis pour réactualiser le dessin d'un widget depuis une boite de dialogue non modale.
Dans le programme original, je sélectionne un nom de circuit dans une listbox de la boite et son dessin apparait dans la fenêtre principale. J'effectuais cela sans thread en utilisant la méthode donnée par CGi dans son tutoriel sur les API windows. Sous Qt, je n'y arrive pas quelle que soit la méthode utilisée (Qpainter, QGraphicsScene avec upfate()). J'ai réécris une petite application à partir du modèle fourni par Denys Bulant.
J'y affiche une image en fenêtre principale dans un label et j'essaie de faire se retourner cette image en cliquant sur un bouton d'un dialogue non modale par la méthode signal/slot. Malheureusement, rien ne se passe. J'ai fait un test en démarrant un timer de 1 seconde qui est connecté au même slot et ça fonctionne. J'ai également essayé l'instruction qApp->processEvents() qui a été suggéré dans un autre post, mais ça reste sans effet.
Quelqu'un aurait-il une idée de ce qui bloque et puis je m'abstenir d'un thread ?
Je joins ci-dessous les implémentations des classes utilisées.
La première construit la fenêtre principale.
La deuxième : Zone_dessin affiche l'image et contient le slot.
La troisième est celle du dialogue non modal.
mainwindow.cpp
zone_dessin.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 #include <QMenu> #include <QMenuBar> #include <QHBoxLayout> #include <QMessageBox> #include <QApplication> #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), dlg(0) { setGeometry ( 50, 100, 250, 250); // instanciations dlg = new Dialog(); zoneDessin = new Zone_dessin(this); // création des menus CreerMenu(); QWidget *zoneCentrale = new QWidget; // création d'un layout dans lequel on va dessiner. Ce dessin devrait // être modifier chaque fois que le bouton de la boite amodale sera appuyé. QHBoxLayout *Hlayout = new QHBoxLayout; Hlayout->addWidget(zoneDessin); Hlayout->setMenuBar(menuBar); Hlayout->setContentsMargins ( 0, 0, 0, 0 );// enlever les marges du layout zoneCentrale->setLayout(Hlayout); setCentralWidget(zoneCentrale); } // Affichée de façon modeless, l'utilisateur peut continuer d'interagir avec le reste de l'application void MainWindow::swapShowDialogModeless() { // Si elle est deja affichee, on cache la boite de dialogue sinon on l'affiche dlg->setVisible(!dlg->isVisible()); } // Affichage d'information à propos de ce "logiciel" void MainWindow::about() { QMessageBox::about(0, "Tuto: Menus et dialogues", "Utilisation d'une boite de dialogue non modale"); } void MainWindow::CreerMenu() { QMenu *menu = new QMenu(tr("Divers..."), this); menuBar = new QMenuBar(this); // Les actions correspondront aux items de menus QAction *modelessAct = new QAction("Dialogue non modale", this); QAction *aboutAct = new QAction("A propos...", this); QAction *closeAct = new QAction("Quitter", this); menuBar->addMenu(menu); menu->addAction(modelessAct); menu->addAction(aboutAct); menu->addAction(closeAct); // Définition des comportements des actions connect(modelessAct, SIGNAL(triggered()), this, SLOT(swapShowDialogModeless())); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); connect(closeAct, SIGNAL(triggered()), qApp, SLOT(quit())); } MainWindow::~MainWindow() { }
dialog.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 #include <QPixmap> #include <QTimer> #include <QApplication> #include "zone_dessin.h" Zone_dessin::Zone_dessin(QWidget *parent) : QWidget(parent) { Modifier = false; image = new QLabel(this); //si timer utilisé, les images se modifient sans problème /*QTimer *timer = new QTimer(this); timer->setInterval(1000); timer->start(); connect(timer, SIGNAL(timeout()), this, SLOT(modifierImage()));*/ modifierImage(); } // modifier le dessin suivant la valeur d'un booléen void Zone_dessin::modifierImage() { if(Modifier) image->setPixmap(QPixmap("vignette_C.jpg")); else image->setPixmap(QPixmap("vignette_D.jpg")); Modifier = !Modifier; qApp->processEvents();// sans effet ici }
Merci d'avance pour vos suggestions.
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 #include <QPushButton> #include <QHBoxLayout> #include "dialog.h" #include "mainwindow.h" #include "zone_dessin.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { Zone_dessin *dessin = new Zone_dessin(0); // Elle est simplement composée d'un bouton "Retourner" QPushButton *modifBtn = new QPushButton("Retourner", this); // lequel devrait retourner l'image dans la fenêtre principale QObject::connect(modifBtn, SIGNAL(clicked()), dessin, SLOT(modifierImage())); QHBoxLayout *Hlayout = new QHBoxLayout; Hlayout->addWidget(modifBtn); setLayout(Hlayout); }
Partager