IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Rafraîchissement de l'IHM par un dialogue non modal


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut Rafraîchissement de l'IHM par un dialogue non modal
    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.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Par défaut
    Rebonjour,

    J'ai pu finalement résoudre ce problème moi-même en m'inspirant d'un programme d'introduction au multithreading sur http://qt.developpez.com/doc/latest/...pesending.html.
    J'ai fait émettre un signal par le bouton du dialog sans préciser de destinataire.
    Par la suite, ce signal est récupéré par la mainwindow qui le connecte à la classe dessin et le tour est joué.
    Ci-dessous les sources modifiées.
    J'espère que ça pourra être utile à quelqu'un.

    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
    67
    68
    69
     
    #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);
        // ici se fait la connection
       QObject::connect(dlg, SIGNAL(modifSignal()), zoneDessin, SLOT(modifierImage()));
     
       // création des menus
       CreerMenu();
     
       QWidget *zoneCentrale = new QWidget;
       // création d'un layout dans lequel on va dessiner. Ce dessin devrait
       // être modifié 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
    32
     
    #include <QPixmap>
    #include <QHBoxLayout>
    #include <QApplication>
     
     
    #include "zone_dessin.h"
     
    Zone_dessin::Zone_dessin(QWidget *parent) : QWidget(parent)
    {
        QHBoxLayout *Hlayout = new QHBoxLayout;
        Modifier = true;
        image = new QLabel(this);
        Hlayout->addWidget(image);
        modifierImage();    
        Hlayout->setContentsMargins ( 0, 0, 0, 0 );
        setLayout(Hlayout);
    }
     
     
    // 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
    21
    22
    23
    24
     
    #include  <QPushButton>
    #include  <QHBoxLayout>
     
    #include "dialog.h"
    #include "mainwindow.h"
    #include "zone_dessin.h"
     
    Dialog::Dialog(QWidget *parent) : QDialog(parent)
    {
     
        // 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()), this, SLOT(envoiSignal()));
        QHBoxLayout *Hlayout = new QHBoxLayout;
        Hlayout->addWidget(modifBtn);
        setLayout(Hlayout);
    }
     
    void Dialog::envoiSignal()
    {
        emit modifSignal();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/10/2005, 16h15
  2. Réponses: 2
    Dernier message: 28/07/2005, 13h58
  3. [Virtual Pascal] [OWL] Actions clavier dans un dialogue non modal
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 28/07/2005, 11h04
  4. [MFC] instance unique de dialogue non modale
    Par venomelektro dans le forum MFC
    Réponses: 5
    Dernier message: 02/02/2005, 12h41
  5. dimension boite de dialogue non modale
    Par afan dans le forum MFC
    Réponses: 25
    Dernier message: 21/10/2004, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo