Cours:DiyWidgetQT : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Principe)
(Principe)
Ligne 52 : Ligne 52 :
  
  
On pourra ensuite ajouter un objet de ce type dans l'interface graphique par exemple en faisant une promotion comme [[Cours:HeritageWidgetQT|{{Rouge|vu}} dans une autre séance]]
+
On pourra ensuite ajouter un objet de ce type dans l'interface graphique :
 
+
*soit en faisant une promotion comme [[Cours:HeritageWidgetQT|{{Rouge|cf sur cette page}}]]
ou ajouter un attribut dans la classe MainWindow puis ajouter cet objet dans l'interface graphique, par ex :
+
*soit en créant un attribut dans la classe MainWindow
 +
**modifier la déclaration de la classe MainWindow :
 
<source lang=cpp>
 
<source lang=cpp>
 +
  // .h
 
   ...
 
   ...
  // .h
 
 
   MonWidget monWidget
 
   MonWidget monWidget
 
   ...
 
   ...
 
+
</source>
 +
**dans l'interface graphique :
 +
***ajouter un objet de type QWidget que l'on nommera {{Rouge|zoneWidget}}
 +
***ajouter un QPushButton dans ce zoneWidget
 +
***sélectionner zoneWidget et définir un {{Rouge|layout}} :
 +
****dans la barre d'icone en haut de l'écran
 +
****choisir "mettre en page horizontalement"
 +
***supprimer le QPushButton
 +
**on peut alors ajouter l'objet monWidget dans zoneWidget :
 +
<source lang=cpp>
 +
  // .cpp
 
   ...
 
   ...
  // .cpp
+
   ui->zoneWidget->layout()->addWidget(&monWidget);
   ui->unWidget->layout()->addWidget(&monWidget);
 
 
   // ou
 
   // ou
 
   setCentralWidget(&monWidget);
 
   setCentralWidget(&monWidget);

Version du 28 septembre 2025 à 19:57

Principe

Pour créer votre propre Widget, il convient de spécialiser la classe QWidget :

class MonWidget : public QWidget
{
    Q_OBJECT
public:
    MonWidget(QWidget *parent = nullptr);

signals:
};


Il suffit ensuite de redéfinir la méthode paintEvent qui est bien entendue déclarée comme virtual dans la classe QWidget !

protected:
    void paintEvent(QPaintEvent *event) override;

Cette méthode ne sera pas appelée directement. On utilisera les méthodes update ou repaint au besoin !


On utilisera la classe QPainter pour faire le dessin du widget, ex :

void MonWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPainter painter(this);
    QPen pen;

    pen.setWidth(4);
    pen.setColor(QColor(255,0,0));
    painter.setBrush(QColor(0,220,220));
    painter.setPen(pen);
    painter.drawRect(10,10,width()-20,height()-20);

    pen.setWidth(10);
    pen.setColor(QColor(0,0,0));
    painter.setBrush(QColor(0,200,0));
    painter.setPen(pen);
    QPointF centre(width()/2,height()/2);
    painter.drawEllipse(centre,50,50);

}


On pourra ensuite ajouter un objet de ce type dans l'interface graphique :

  • soit en faisant une promotion comme cf sur cette page
  • soit en créant un attribut dans la classe MainWindow
    • modifier la déclaration de la classe MainWindow :
   // .h
   ...
   MonWidget monWidget
   ...
    • dans l'interface graphique :
      • ajouter un objet de type QWidget que l'on nommera zoneWidget
      • ajouter un QPushButton dans ce zoneWidget
      • sélectionner zoneWidget et définir un layout :
        • dans la barre d'icone en haut de l'écran
        • choisir "mettre en page horizontalement"
      • supprimer le QPushButton
    • on peut alors ajouter l'objet monWidget dans zoneWidget :
   // .cpp
   ...
   ui->zoneWidget->layout()->addWidget(&monWidget);
   // ou
   setCentralWidget(&monWidget);

Ajout de fonctionnalité

  • ajouter 4 boutons sur l'interface graphique
    • haut
    • bas
    • gauche
    • droite
  • chaque appui sur un bouton permettra de déplacer la balle dans le sens indiqué