Qt & C++

Qt & C++ - C++ - Programmation

Marsh Posté le 17-03-2014 à 22:35:57    

Bonjour,
 
J'ai un problème avec C++ & Qt pour créer un widget de type frame dans lequel je voudrais ajouter une QgridLayout qui contient plusieurs labels.
Pour ajouter les labels dans le widget QGridLayout cela a priori cela semble être bon ... enfin j'espère  :wahoo:  
 
Quand j'execute mon code, une fenetre s'ouvre mais aucun widget n'est présent ...
 
Pouvez-vous me dire quel est mon erreur ? Je suppose qu'il s'agit de lier le widget QFrame avec la QGridLayout ...  :??:  
 

Code :
  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QFrame>
  4. #include <QGridLayout>
  5. #include <QLabel>
  6. class MyWidget : public QWidget
  7. {
  8. public:
  9.     MyWidget(QWidget *parent = 0);
  10. };
  11. MyWidget::MyWidget(QWidget *parent)
  12.     : QWidget(parent)
  13. {
  14.   QFrame       *MyFrame = new QFrame;
  15.   QGridLayout *MyGrid = new QGridLayout;
  16.   QLabel        *MyLbl_01 = new QLabel("Label_01" );
  17.   QLabel        *MyLbl_02 = new QLabel("Label_02" );
  18.   QLabel        *MyLbl_03 = new QLabel("Label_03" );
  19.   // Ajout des labels dans la Grid
  20.   MyGrid->addWidget(MyLbl_01, 0, 0);
  21.   MyGrid->addWidget(MyLbl_02, 1, 0);
  22.   MyGrid->addWidget(MyLbl_03, 2, 0);
  23. }
  24. int main(int argc, char *argv[])
  25. {
  26.     QApplication app(argc, argv);
  27.     MyWidget widget;
  28.     widget.show();
  29.     return app.exec();
  30. }

Reply

Marsh Posté le 17-03-2014 à 22:35:57   

Reply

Marsh Posté le 17-03-2014 à 23:58:26    

Bonjour !
 
Comme vous l'indiquiez, il manque un "setLayout(MyGrid)" dans le constructeur (ou passer le "this" dans le constructeur du layout).
 
Bonne continuation !

Reply

Marsh Posté le 18-03-2014 à 23:59:09    

Merci, je viens de corriger l'erreur. Par contre, je m'attendais à voir apparaître le qframe mais sans succès (ajout d'une ligne de code pour modifier le contour). En regardant sur Google, j'ai trouvé un exemple de qGroupBox mais l'exemple fourni sur le site de Qt ne donne pas le même aperçu que sur le site. Je suis sous Ubuntu 12.04.4. Est ce normal ?

Reply

Marsh Posté le 19-03-2014 à 09:03:17    

Bonjour !
 
Votre QFrame n'est reliée à aucun autre objet, si on suit le déroulement :  
 
 * Vous créez le QWidget
 * Vous créez la QFrame,
 * Vous créez le Layout et l'ajoutez au QWidget,
 * Vous créez les 3 QLabels,
 * Vous ajoutez les 3 QLabels au Layout
 
La QFrame doit être ajoutée à un moment ou à un autre dans l'arborescence des objets graphiques.
 
Question : Vous n'utilisez pas le designer afin de mieux contrôler ce qui est fait ? Car c'est rare de faire ses IHM "à la main".
 
Bonne continuation !

Reply

Marsh Posté le 19-03-2014 à 23:35:06    

Merci pour la réponse mais comment ajouter le qframe au qwidget puis mettre dans le qframe le qgrid.
 
Pour qtdesigner, je connais mais en lisant le tutoriel intro qt de développez.com: on conseille d'abord de faire le code à la main puis après de faire du qtdesigner.

Reply

Marsh Posté le 20-03-2014 à 11:09:01    

Bonjour !
 
Si vous faites comme vous indiquez, vous aurez un problème de taille / agrandissement, car vous aurez une QFrame sans aucune indication de taille dans un QWidget (la fenêtre) qui n'a pas de layout.
 
(Je ne suis pas certain d'avoir été clair dans cette explication ...)
 
Sinon, pour le faire :  
 
rajoutez "this" comme paramètre dans le constructeur de la frame et, puis "frame->setLayout(grid)".
 
Bonne continuation !

Reply

Marsh Posté le 20-03-2014 à 13:07:10    

Comme dit plus haut, ton widget "MyWidget" n'a aucun layout, le QGridLayout que tu créé se retrouve perdu dans le néant ( faut faire appel à SetLayout(grid) ou this->setLayout(grid), ou frame->setLayout(grid), dépendant de ce que tu cherches) .
Idem pour le QFrame, tu ne précises pas qui va l'avoir, perdu aussi :spamafote:
 
Maintenant, si tu veux faire un widget de type frame (en gros, MyWidget est un QFrame), dans ce cas faut modifier l'héritage :  
 

Code :
  1. class MyWidget : public QFrame
  2. {
  3.    explicit MyWidget( QWidget* Parent = NULL ) : QFrame( Parent )
  4.    { ... }
  5. };


 
Et dans le constructeur, tu créé ton layout + ajoute les labels.
Là ce que tu cherches à faire (admettant que ton code est bon), c'est une fenêtre dans laquelle tu as un QFrame dans lequel tu vas avoir ton grid layout avec les labels.


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed