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
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()
{
 
}
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
 
#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
 
}
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
 
#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);
}
Merci d'avance pour vos suggestions.