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

Discussion :

Faire un bouton appelé dans plusieurs vues

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Faire un bouton appelé dans plusieurs vues
    Bonjour,

    J'ai un problème sur mon IHM, celle ci présente plusieurs pages avec des boutons, mais certains boutons doivent etre communs.
    Typiquement j'ai un bouton "start" qui se trouve sur la page principale, mais j'ai un mode me permettant de regrouper certains boutons en acces rapide sur une meme page qui devrait contenir ce fameux bouton "Start".

    La solution qui me viendrait en tete serait de déplacer mon bouton entre les differents layout mais ca me semble compliqué a réaliser et surtout a maintenir

    Il faut également savoir que mon bouton start n'est pas qu'un simple QPushButton, il peut afficher des textes modifiés via des trames CAN ou Ethernet donc j'aimerai éviter de creer autant d'instances de boutons que je n'ai de pages, il me faudrait au moins un element central sur lequel appliquer les modifications, et que les "boutons" visibles par l'utilisateur soient synchronisés automatiquement avec cet element central, mais j'avoue que je seche un peu sur comment faire?


    Etant donné la puissance de Qt je suis persuadé qu'il existe une solution mais je ne vois pas laquelle?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Le plus simple, c'est de créer une QAction que tu rendra disponible à partir de tes différentes pages, et de l'ajouter (à l'aide de la fonction membre addAction) à chacun des boutons qui doit exécuter l'action en question

    D'un autre coté, il "suffira" de connecter un seul slot à connecter à l'action (sur le signal triggered de l'action) pour que tous le boutons auxquels tu auras ajouté l'action en question provoquent l'exécution du slot en question.

    En gros, cela devrait donner un code proche de
    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
    /*  au niveau de la fenêtre principale */
    class MainWindow : public QMainWindow{
        /* je passe tout le reste */
    public:
        QAction * getTheAction(){
            return theAction;
        }
    private:
        void onActionTriggered(); // le slot appelé lorsque le signal triggered de l'action est émis
        QAtction * theAction; // l'action à effectuer depuis "différents endroits"
    };
    MainWindow(/* ... */): QMainWindow(/* ...*/){
        theAction = new QAction(this); // permet à l'action d'être intégrée dans le système parent enfants de la fenêtre principale 
        /* OU OU OU */
        theAction = new QAction("Faire chanter la poupée", this); //idem, mais le texte"faire chanter la poupée" est utilisé pour les boutons
        /* OU OU OU */
        theAction = new QAction(aKindyIcon, "Faire chanter la poupée", this); // idem que pour la précédante, permet d'aficher l'icone aKindyIcon 
     
        connect(theAction, &QAction::triggered, this, &MainWindow::onActionTriggered); // connecte le slot à l'action
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* au niveau des différentes pages */
    MaPage(QWidget * parent):/* .... */{
        QPusButton * button = new QPusButton;
        button->addAction(dynamic_cast<MainWindow *>(parent)->getTheAction()); //That all folks :D
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Wohhhhhh

    Sur le papier ca a l'air de correspondre pile poil a mes besoins !

    Merci beaucoup, encore plus avec l'exemple c'est au top !!

    Je regarde pour mettre ca en application, encore merci !!!!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bon, j'ai peur de ne pas comprendre...

    Histoire de maitriser le truc j'ai fait un exemple tout simple, ma fenetre principale qui appelle mon bouton distant, et lorsque je clique sur mon bouton distant je m'attendais a avoir mes qDebug() apparaitre;

    Ma classe principale testabstractionbfp.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
     
     
    TestAbstractionBFP::TestAbstractionBFP(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::TestAbstractionBFP)
    {
        ui->setupUi(this);
     
     
        theAction = new QAction(this);
        connect(theAction, SIGNAL(triggered(bool)), this, SLOT(onActionTriggered(bool)));
     
        BoutonDistant *test = new BoutonDistant(this);
    }
     
     
    void TestAbstractionBFP::onActionTriggered(bool toto)
    {
        qDebug() << toto;
    }
     
     
    TestAbstractionBFP::~TestAbstractionBFP()
    {
        delete ui;
    }
    et testabstractionbfp.h
    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
     
    namespace Ui {
    class TestAbstractionBFP;
    }
     
    class TestAbstractionBFP : public QWidget
    {
        Q_OBJECT
     
    public:
     
        QAction *getTheAction()
        {
            qDebug() << "yes";
            return theAction;
        }
     
        explicit TestAbstractionBFP(QWidget *parent = 0);
        ~TestAbstractionBFP();
     
    private slots:
        void onActionTriggered(bool toto);
     
    private:
     
        QAction *theAction;
        Ui::TestAbstractionBFP *ui;
    };
    mon bouton distant: BoutonDistant.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BoutonDistant::BoutonDistant(QWidget *parent) : QWidget(parent)
    {
     
        QPushButton *button = new QPushButton("Bonjour", this);
     
        button->addAction(dynamic_cast<TestAbstractionBFP*>(parent)->getTheAction());
    }
    et mon boutonDistant.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class BoutonDistant : public QWidget
    {
        Q_OBJECT
    public:
        explicit BoutonDistant(QWidget *parent = 0);
     
    signals:
     
    public slots:
    };



    Malheureusement en l'état il ne se passe strictement rien lorsque je clique sur mon bouton.
    En revanche si je remplace mon QPushButton par un QLabel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BoutonDistant::BoutonDistant(QWidget *parent) : QWidget(parent)
    {
     
        QLabel *button = new QLabel("Bonjour", this);
     
        button->addAction(dynamic_cast<TestAbstractionBFP*>(parent)->getTheAction());
    }
    J'ai bien "Yes" qui apparait dans mon qDebug lorsque la fenetre est créée donc il passe bien par getTheAction()
    en revanche le onActionTriggered n'est jamais appelé.

    Donc il semble y avoir un probleme avec les QAction sur les QPushbutton, et l'autre point qui me perturbe le plus c'est que je ne comprends pas bien le fonctionnement du QAction, ca n'agit pas vraiment comme un signal que l'on pourrait emettre d'ou l'on veut apparement, il sont émis sur certains evenement bien définis des objets, mais du coup je ne comprends pas comment faire pour qu'il soit emis au moment ou je le decide (par exemple au relachement de mon bouton, ou a la reception d'une trame CAN...)?


    Cordialement

    Vincent

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Au temps pour moi, j'oubliais un truc très important: Tu connecte le signal qui t'intéresse pour le bouton (on part sur clicked, par défaut, mais d'autres sont envisageables ) au signal triggered de l'action, parce que cela ne se fait pas automatiquement

    Et, au final, au lieu de transmettre MainWindow au constructeur de ta page, tu peux te contenter de transmettre theAction, sans la transmettre au constructeur de la classe de base de ta page.

    Voici un exemple minimal complet, avec une boite de dialogue

    La boite de dialogque qui doit provoquer l'action dans la fenêtre principale:
    dialog.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef DIALOG_H
    #define DIALOG_H
    #include <QDialog>
    class MainWindow;
    class Dialog : public QDialog
    {
    public:
        Dialog(QAction * theAction);
    private:
     
    };
     
    #endif // DIALOG_H
    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 "dialog.h"
    #include <mainwindow.h>
    #include <QPushButton>
    #include <QAction>
    #include <QVBoxLayout>
    Dialog::Dialog(QAction *theAction)
    {
        QPushButton * ok=new QPushButton("Ok");
        connect(ok, &QPushButton::clicked, this, &QDialog::accept);
        QPushButton * cancel = new QPushButton("Cancel");
        connect(cancel, &QPushButton::clicked, this, &QDialog::reject);
        QPushButton * theButton = new QPushButton("Klick me");
        theButton->addAction(theAction);
        connect(theButton, &QPushButton::clicked, theAction, &QAction::triggered);
        QVBoxLayout * layout = new QVBoxLayout;
        layout->addWidget(theButton);
        layout->addWidget(ok);
        layout->addWidget(cancel);
        setLayout(layout);
    }
    Par facilité, j'ai créé un widget central pour la fenêtre principale sous la forme de
    centralwidget.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef CENTRALWIDGET_H
    #define CENTRALWIDGET_H
     
    #include <QWidget>
    class MainWindow;
    class CentralWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit CentralWidget(QAction *theAction, MainWindow *parent);
     
    };
     
    #endif // CENTRALWIDGET_H
    centralwidget.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
    #include "centralwidget.h"
    #include <QPushButton>
    #include <QAction>
    #include <QVBoxLayout>
    #include <mainwindow.h>
    CentralWidget::CentralWidget(QAction *theAction, MainWindow * parent)
    {
        QPushButton * button=new QPushButton("Klick me");
        button->addAction(theAction);
        connect(button, &QPushButton::clicked, theAction, &QAction::triggered);
        QPushButton * other = new QPushButton("Show dialog");
        connect(other, &QPushButton::clicked, parent, &MainWindow::showDialog);
        QVBoxLayout * layout = new QVBoxLayout;
        layout->addWidget(button);
        layout->addWidget(other);
        setLayout(layout);
    }
    la fenêtre principale, qui utilise les deux classes ci-dessus
    MainWindow.h
    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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        void showDialog();
    private:
        void onActionClicked();
        QAction * theAction;
    };
     
    #endif // MAINWINDOW_H
    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
    #include "mainwindow.h"
    #include <QAction>
    #include <QMessageBox>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <centralwidget.h>
    #include <dialog.h>
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        theAction=new QAction("clik on me", this);
        connect(theAction, &QAction::triggered, this, &MainWindow::onActionClicked);
        CentralWidget * central = new CentralWidget(theAction, this);
        setCentralWidget(central);
    }
     
    MainWindow::~MainWindow()
    {
     
    }
    void MainWindow::showDialog(){
        Dialog d(theAction);
        d.exec();
    }
    void MainWindow::onActionClicked(){
        QMessageBox msgBox;
        msgBox.setText("The action has been triggered.");
        msgBox.exec();
    }
    le fichier main.cpp qui produit l'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mainwindow.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    Et, pour faire bonne mesure, le fichier .pro qui permettra de compiler le tout
    Code qt-pro : 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
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = testMBSA
    TEMPLATE = app
    DEFINES += QT_DEPRECATED_WARNINGS
     
    CONFIG += c++11
     
    SOURCES += \
            main.cpp \
            mainwindow.cpp \
        dialog.cpp \
        centralwidget.cpp
     
    HEADERS += \
            mainwindow.h \
        dialog.h \
        centralwidget.h
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    (En fait, il a été généré automatiquement par QtCreator vu que je l'utilisais... j'en ai juste viré les commentaires )

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour ton retour, par contre je crois qu'il y'a un soucis dans le fichier CentralWidget.h, il doit y avoir une erreur de copier/coller?

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par modelvincent Voir le message
    Merci beaucoup pour ton retour, par contre je crois qu'il y'a un soucis dans le fichier CentralWidget.h, il doit y avoir une erreur de copier/coller?
    Effectivement, j'ai du être un peu distrait... Voilà qui est corrigé

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    YEEEEESSSSSS !! merci ca fonctionne, il ne me reste plus qu'a porter tout ca dans mon code.

    Vraiment merci pour le temps que tu m'as consacré !

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

Discussions similaires

  1. [XL-2010] faire excécuter une macro dans plusieurs onglets
    Par fibule38 dans le forum Excel
    Réponses: 2
    Dernier message: 19/11/2015, 13h11
  2. [V8] Ajout d'un bouton imprimer dans une vue tree
    Par bizou-nours dans le forum Odoo (ex-OpenERP)
    Réponses: 0
    Dernier message: 10/06/2015, 11h55
  3. Bouton "Lu" dans la vue de tous les sous-forums
    Par scheu dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 15/12/2008, 17h07
  4. [C# 1.1] Fonction appelée dans plusieurs classes
    Par fregolo52 dans le forum C#
    Réponses: 1
    Dernier message: 25/10/2006, 09h36
  5. Source LaTeX : faire un bouton poussoir dans le PDF
    Par pierrot_latex dans le forum Editeurs / Outils
    Réponses: 3
    Dernier message: 24/02/2006, 14h52

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