Partage
  • Partager sur Facebook
  • Partager sur Twitter

QT: Héritage de fenêtres

27 mars 2019 à 13:43:55

Bonjour à tous !

Je suis en train de coder une application avec QT pour un projet d'étude, et je rencontre un petit soucis qui m'a l'air de relever du problème de conception.

Je précise que je n'ai jamais codé de grosses applications (par rapport à mon niveau, j'entends par là d'applications dépassant une seule fenêtre et ayant un but plus poussé que de faire un simple Word :) )

Voici mon problème:

Mon programme se découpe en plusieurs fenêtres (des QMainWindow). Je voudrais que ces fenêtres aient toutes la même QMenuBar. Du coup, je me suis dit au départ que j'allais faire une fonction accessible par chaque fenêtre et qui allait juste changer les propriétés de la MenuBar de la fenêtre en question. Comme ceci, j'aurais juste à appeler la fonction dans le constructeur de chaque fenêtre. Maintenant, je me rends compte que ça ne va pas être des plus pratique (Copier/coller le code :-°, etc...).

Du coup, je songe à présent à faire un modèle de fenêtre Mère qui comporterait toutes les propriétés dont auront besoins les autres fenêtres (MenuBar par exemple), et de faire hériter les fenêtres Enfants de celle-ci.

Seulement voila :

1) J'arrive à faire apparaître la fenêtre Mère en l'appelant directement et elle possède tout ce que je veux. Cependant, les Enfants n'ont pas ces propriétés (Voir code ci-dessous)

2) et peut-être question la plus importante) Je ne sais pas si c'est la bonne manière de gérer un programme multi-fenêtre. Peut-être que j'ai une mauvaise approche de la chose. J'ai notamment peur de l'interaction avec le QT Designer. Comme je l'ai dis, je n'ai pas vraiment d'expérience avec ce genre de programmes. Auriez-vous des conseils concernant cela ?

Voici le code test:

MyWindow.h (fenêtre Mère)

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QMainWindow>

namespace Ui {
class MyWindow;
}

class MyWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MyWindow(QWidget *parent = nullptr);
    ~MyWindow();

public:
    void quitter_fenetre();

private:
    Ui::MyWindow *ui;
};

#endif // MYWINDOW_H


MyWindow.cpp

#include "mywindow.h"
#include "ui_mywindow.h"

MyWindow::MyWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyWindow)
{
    ui->setupUi(this);

    QMenu *menu_fichier = this->menuBar()->addMenu(QObject::tr("Fichier"));
    QMenu *menu_aide = this->menuBar()->addMenu(QObject::tr("Aide"));
    QMenu *menu_imprimer = this->menuBar()->addMenu(QObject::tr("Imprimer"));
    QAction *quitter = new QAction("Quitter", this);

    menu_fichier->addAction(quitter);
    menu_aide->addAction(QObject::tr("Consulter l'aide"));
    menu_imprimer->addAction(QObject::tr("Imprimer la page"));

    connect(quitter, &QAction::triggered, this, &MyWindow::quitter_fenetre);
}

MyWindow::~MyWindow()
{
    delete ui;
}


void MyWindow::quitter_fenetre()
{
    this->close();
}



enfant.h (Fenêtre Enfant)

#ifndef ENFANT_H
#define ENFANT_H

#include "mywindow.h"

namespace Ui {
class enfant;
}

class enfant : public MyWindow
{
    Q_OBJECT

public:
    explicit enfant(QWidget *parent = nullptr);
    ~enfant();

private:
    Ui::MyWindow *ui;
};

#endif // ENFANT_H

enfant.cpp

#include "enfant.h"
#include "ui_enfant.h"
#include "ui_mywindow.h"

enfant::enfant(QWidget *parent) :
    MyWindow(parent),
    ui(new Ui::MyWindow)
{
    ui->setupUi(this);
}

enfant::~enfant()
{
    delete ui;
}


Et le main.cpp

#include "enfant.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    enfant w;
    w.show();

    return a.exec();
}

J'ai essayé pas mal de chose comme change le new UI::enfant dans le constructeur, etc, mais je ne suis arrivé à rien.

Merci d'avance :)




  • Partager sur Facebook
  • Partager sur Twitter
Quand le sage désigne la lune, l'idiot regarde le doigt.
10 janvier 2020 à 23:15:47

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)