Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.10.0 - Qt Creator : 4.5.0 - Qt Installer : 3.0.2 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4] appel widget dans un QStackedWidget

November 2006 modifié dans Année 2006
Bonsoir.

J'ai un petit probleme pour afficher un membre d'un QStackedWidget.

Voila le topo, j'ai un colone de bouton, et a chaque bouton, correspond l'affichage d'un widget dans la partie libre.
#include <QtGui>
#include "window.h"
#include "dialog.h"

//constructeur
Window::Window(QWidget *parent) : QWidget(parent){
hbox = new QHBoxLayout;
dialog = new QStackedWidget;

dialog->addWidget(new AboutDialog);
dialog->addWidget(new InfoIpDialog);

hbox->addWidget(createButtonBox());
hbox->addWidget(dialog, 1);
setLayout(hbox);

setWindowTitle(tr("ip"));
resize(640, 480);
}

//methodes

//button box
QGroupBox *Window::createButtonBox(){
QGroupBox *groupButtonBox = new QGroupBox(tr("Menu"), this);

//creation des diffrents boutons
QPushButton *infoIpButton = new QPushButton(tr("&IP infos"));
QPushButton *maxClientButton = new QPushButton(tr("&Max client"));
QPushButton *maxSubnetButton = new QPushButton(tr("&Max Subnet"));
QPushButton *aboutButton = new QPushButton(tr("&About"));
QPushButton *quitButton = new QPushButton(tr("&Quit"));

//creation du container + placer bouttons
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(infoIpButton);
vbox->addWidget(maxClientButton);
vbox->addWidget(maxSubnetButton);
vbox->addWidget(aboutButton);
vbox->addWidget(quitButton);
vbox->addStretch(1);
groupButtonBox->setFixedSize(100, 480);
groupButtonBox->setLayout(vbox);

//actions des boutons
connect(infoIpButton, SIGNAL(clicked()), this, SLOT(infoIp()));
//connect(maxClientButton, SIGNAL(clicked()), this, SLOT(maxClient()));
//connect(maxSubnetButton, SIGNAL(clicked()), this, SLOT(maxSubnet()));
connect(aboutButton, SIGNAL(clicked()), this, SLOT(about()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

return groupButtonBox;
}

//slots
void Window::about(){
//ici qqch mqis je ne sais pas quoi

}

void Window::infoIp(){
//idem
}
le probleme est le suivant, j'ai beau clique sur mes boutons, rien ne s'affiche.

que faut t'il faire pour premertre l'affichage d'un widget present dans la QStackedWidget??

merci

ps: je suis un noob en qt

Réponses

  • Salut,

    Il faut que tu gardes une trace des widgets appartenant à QStackedWidget. Par exemple, pour ton about, tu déclareras AboutDialog *aboutDlg dans l'entête, puis au lieu de:
    dialog->addWidget(new AboutDialog);
    tu écriras
    aboutDlg = new AboutDialog;
    dialog->addWidget(aboutDlg);
    Et dans le slot about tu as juste à caler cette ligne:
    dialog->setCurrentWidget(aboutDlg);
    A noter que tu as aussi la possibilité de passer par des index si tu n'as pas de manipulation à faire sur tes widgets :)
  • c'a n'a pas l'air de fonctionner. Rien ne s'affiche.

    voici quand meme le code de la classe About:
    AboutDialog::AboutDialog(QWidget *parent) : QWidget(parent){
    QGroupBox *aboutGroup = new QGroupBox(tr("About"));
    QVBoxLayout *layout = new QVBoxLayout;
    QLabel *label = new QLabel;

    label->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    label->setText("about");
    label->setAlignment(Qt::AlignBottom | Qt::AlignRight);

    layout->addWidget(label);
    aboutGroup->setLayout(layout);
    }
    elle ne contient rien d'autre q'un label pour le moment.
  • Montre voir plutôt le code de la classe qui utilise le QStackedWidget stp. (.h plus .cpp dans 2 balises dissociées, plus pratique pour se repérer :)).
    Là, y'a rien à dire.
  • voici tout le code alors:

    window.h
    #ifndef WINDOW_H
    #define WINDOW_H

    #include <QWidget>
    #include "dialog.h"

    class QGroupBox;
    class QHBoxLayout;
    class QStackedWidget;
    class QListWidget;
    class QListWidgetItem;
    //class AboutDialog;

    class Window : public QWidget{

    Q_OBJECT

    public:
    Window(QWidget *parent = 0);

    private:
    QHBoxLayout *hbox;
    QStackedWidget *dialog;
    QGroupBox *createButtonBox();
    //QGroupBox *createAboutBox();
    //QGroupBox *createInfoIpBox();
    AboutDialog *aboutDig;

    private slots:
    void about();
    void infoIp();
    //void maxClient();
    //void maxSubnet();
    };

    #endif
    dialog.h
    #ifndef DIALOG_H
    #define DIALOG_H

    #include <QWidget>

    class AboutDialog : public QWidget{
    public:
    AboutDialog(QWidget *parent = 0);
    };

    class InfoIpDialog : public QWidget{
    public:
    InfoIpDialog(QWidget *parent = 0);
    };

    #endif
    window.cpp
    #include <QtGui>
    #include "window.h"
    //#include "dialog.h"

    //constructeur
    Window::Window(QWidget *parent) : QWidget(parent){
    hbox = new QHBoxLayout;
    dialog = new QStackedWidget;

    aboutDig = new AboutDialog;

    dialog->addWidget(aboutDig);
    dialog->addWidget(new InfoIpDialog);

    hbox->addWidget(createButtonBox());
    hbox->addWidget(dialog, 1);
    setLayout(hbox);

    setWindowTitle(tr("ip"));
    resize(640, 480);
    }

    //methode createButtonBox: voir plus haut

    //slots
    void Window::about(){
    dialog->setCurrentWidget(aboutDig);

    }

    void Window::infoIp(){
    //idem about()
    }
    le about.cpp voir plus haut

    autre info (peut etre inutile), je n'ai aucunes erreures de compillation.
  • Bon, j'avais effectivement pas repris le connect. Mais comme je n'avais mis que les corrections, il fallait donc le laisser :P
  • ben, mes connect sont bon non?? je ne les ai pas changés.
  • Pardon, j'avions point vu le commentaire concernant les boutons image
    Je regarderais plus en détail de chez moi.
  • Ok, ça me reviens en lisant mon code; je m'étais bien arraché les cheveux là-dessus: tout était bon, pas de warning à la compil, pas de warning du moc à l'exécution, bref tout allait bien, sauf qu'on voyait rien :D
    Tout comme toi en fait ;)

    Et la fonction magique que j'ai utilisé pour le faire apparaitre était setGeometry(...) sur le layout.
    J'ai eu beau lire et relire, puis vérifier et revérifier, j'ai rien trouvé de tel dans la doc. Soit je suis complétement passé à côté de quelque chose, soit il y a un vrai problème :/

    Bref, fait un resize ou setGeometry histoire de voir.
    Note: j'ai utilisé cette fonction directement car je ne voulais pas de layout pour mon utilisation. Selon ton cas, tu devrais peut-être pencher pour QStackedLayout. Je ne sais pas si ça change le problème, mais tu peux toujours lui donner une chance :)
  • November 2006 modifié
    Pourquoi ne pas donner de parent aux widgets et layouts ? Exemple :
        dialog = new QStackedWidget(this);
    au lieu de
        dialog = new QStackedWidget;
  • Même avec un parent ça ne change rien; c'est assez déroutant. Je n'ai pas vu d'exemple l'utilisant, donc on ne peut pas comparer en plus.
  • Voici l'exemple qui se raproche le plus de ce que je veux faire: http://doc.trolltech.com/4.2/dialogs-configdialog.html

    Cest exemple utilise une QListIWidgetItem contenent des icones.

    sinon, je vais essayer avec QStackedLayout. On verra ce que ca donne.
  • November 2006 modifié
    C'est marrant (facon de parler ;)) mais j'ai eu le meme genre de probleme la semaine derniere.
    Moi je l'ai resolu avec un appel a adjustSize sur le qwidget conteneur !

    Mais c'est vrai que cela me parait etrange

    Ludo
  • Pourtant, c'est vraiment trop gros pour être un bug :/
  • ok, c'est resolut.

    Dans, mes widget (about pour exemple), il fallait mettre this comme parent a mon layout principal.

    donc au lieu de:
    AboutDialog::AboutDialog(QWidget *parent) : QWidget(parent){
    QGroupBox *aboutGroup = new QGroupBox(tr("About"));
    c'est :
    AboutDialog::AboutDialog(QWidget *parent) : QWidget(parent){
    QGroupBox *aboutGroup = new QGroupBox(tr("About"), this);
    je vous remercie tous.
Connectez-vous ou Inscrivez-vous pour répondre.