Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. Mon widget ne s'affiche pas
Forum Updated to NodeBB v4.3 + New Features

Mon widget ne s'affiche pas

Scheduled Pinned Locked Moved Unsolved French
4 Posts 2 Posters 970 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Morgatte
    wrote on last edited by Morgatte
    #1

    Boujour,

    J'ai pacé des boutons dans un scrollArea. Ils sont visibles on les voit.
    Je crée un widget perso appelé CustomTimeline. Il est visible en dehors du scrollArea, mais pas dedans, alors que les boutons oui.

    Je ne vois pas pourquoi.

    _verticalScrollArea.pro

    #-------------------------------------------------
    #
    # Project created by QtCreator 2021-06-20T17:23:50
    #
    #-------------------------------------------------
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = _verticalScrollArea
    TEMPLATE = app
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which has been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    CONFIG += c++11
    
    SOURCES += \
            main.cpp \
            mainwindow.cpp \
        customtimeline.cpp
    
    HEADERS += \
            mainwindow.h \
        customtimeline.h
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    

    customtimeline.h

    #ifndef CUSTOMTIMELINE_H
    #define CUSTOMTIMELINE_H
    
    #include <QObject>
    #include <QWidget>
    
    class CustomTimeline : public QWidget
    {
        Q_OBJECT
    public:
        explicit CustomTimeline(QWidget *parent = nullptr);
    
    protected:
        void paintEvent(QPaintEvent* e);
        void mousePressEvent(QMouseEvent* e);
    
    signals:
    
    public slots:
    };
    
    #endif // CUSTOMTIMELINE_H
    

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    
    #include <QScrollArea>
    #include <QLayout>
    #include <QLabel>
    #include <QLineEdit>
    #include <QComboBox>
    #include <QPushButton>
    #include "customtimeline.h"
    
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        QScrollArea* scrollArea;
        QGridLayout* grilleLayout;
        QVBoxLayout* verticalLayout;
        QLabel* label;
        QLineEdit* lineEdit;
        QComboBox* combo;
    
        QWidget* widgetPrincipal;
        QWidget* scrollAreaWidgetContents;
    
    
        QList<QPushButton*> list_bt;         // ici, est une liste contenant plusieurs pointeurs de type QPushButton
    
        QList<CustomTimeline*> list_tl;          // ici, est une liste de widgets personnels de type Timeline
        CustomTimeline* tline;
    
    
        QPushButton* bt18;
        QPushButton* bt19;
        QPushButton* bt20;
    
    };
    
    #endif // MAINWINDOW_H
    
    

    customtimeline.cpp

    #include "customtimeline.h"
    #include <QPainter>
    #include <QDebug>
    
    
    
    CustomTimeline::CustomTimeline(QWidget *parent) : QWidget(parent)
    {
        this->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
    }
    
    
    
    void CustomTimeline::paintEvent(QPaintEvent *e)     // Qu'est-ce que paintEvent, c'est un événement qui est appelé à chaque fois
    {                                                   // que l'objet doit être changé visuellement.
    
        QPainter p(this); // QPainter est un Objet qui sert à peindre sur qquechose.
                          // On va peindre sur quoi ? sur this qui est le widget lui-même.
    
        p.setPen(Qt::yellow);
        p.setBrush(Qt::gray);
        p.drawRoundRect(0,0,this->width()-1,40,0,0);
        //p.setPen(Qt::white);
        //p.drawText(0,0,"Custom Time Line");
        //updateGeometry();
        qDebug() << "CustomTimeline créé";
    }
    
    
    
    void CustomTimeline::mousePressEvent(QMouseEvent *e)
    {
        repaint();
        qDebug() << "Custom Timeline pressé";
    }
    
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "customtimeline.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        this->setFixedSize(2000,800);
    
    
        /* LE BUT : est de créer un widget principal contenant un ScrollArea contenant lui-même un widget conteneur contenant des boutons.
         * widgetPrincipal-->ScrollArea-->scrollAreaWidgetContents-->boutons
         * De plus certains de ces widgets doivent être organisés avec des layouts.
         * Le widget principal est organisé avec un layout de type grille 2x2 (ou autre...)
         * le conteneur de boutons (scrollAreaWidgetContents) sera organisé avec un layout de type vertical. (n lignes)
         * widgetPrincipal(grilleLayout)-->ScrollArea-->scrollAreaWidgetContents(verticalLayout)-->boutons
        */
    
    
        // 1. Instanciation des widgets de type conteneurs
        widgetPrincipal = new QWidget(this);                    // Widget principal (vide) qui contiendra tous les autres éléments graphiques
        scrollArea = new QScrollArea;                           // On initialise une zone de scoll (pas encore visible)
        scrollAreaWidgetContents = new QWidget(scrollArea);     // Création d'un widget vide (futur contenu de cette zone de scroll, et conteneur des boutons)
    
    
        // 1.1 Instantiation des layouts
        grilleLayout = new QGridLayout;                         // Layout de type grille à attribuer au widgetPrincipal
        verticalLayout = new QVBoxLayout;                       // Layout vertical à attribuer au conteneur de boutons (scrollAreaWidgetContents)
    
    
        // 1.2 Application des Layouts sur les différents conteneurs
        widgetPrincipal->setLayout(grilleLayout);               // On attribue le layout grille au widget principal
        scrollAreaWidgetContents->setLayout(verticalLayout);    // On attribue le layout vertical au conteneur de boutons
    
    
        // 1.3 Attribution du widget à scoller à la zone de scroll
        scrollArea->setWidget(scrollAreaWidgetContents);        // Le widget conteneur de boutons devient le widget à translaté dans la zone de scroll
    
    
    
        scrollArea->move(10, 10);
        scrollArea->setBackgroundRole(QPalette::NoRole);
        scrollArea->setWidgetResizable(true);
        scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
        //scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);  // Je ne veux pas de scrollBar horizontale
        //scrollArea ->resize(1400, 700);                                   // Ligne inutile si vous placez ce scrollArea dans un layout, (ce qui est le cas ici)
    
    
    
    
        // 2. Instanciation des boutons (et attribution d'un parent = leur conteneur respectif)
    
        for(int i=0; i<50; i++)
        {
            CustomTimeline* tl = new CustomTimeline(scrollAreaWidgetContents);
            list_tl.append(tl);
            verticalLayout->addWidget(list_tl[i]);
        }
    
        for(int i=0; i<365; i++)
        {
            QPushButton* cbtn = new QPushButton ("tous le même nom", scrollAreaWidgetContents);
            list_bt.append(cbtn);                               // Ajoute le pointeur sur le bouton à une liste
            //list_bt[i]->move(0,30*i);                           // Je positionne mon CustumButton dans ma fenêtre principale
            list_bt[i]->setText(QString("btn %1").arg(i));      // Je renomme les boutons
            verticalLayout->addWidget(list_bt[i]);
        }
    
    
    
    
    
        /*
        bt1 = new QPushButton("bt1", scrollAreaWidgetContents);
        bt2 = new QPushButton("bt2", scrollAreaWidgetContents);
        bt3 = new QPushButton("bt3", scrollAreaWidgetContents);
        bt4 = new QPushButton("bt4", scrollAreaWidgetContents);
        bt5 = new QPushButton("bt5", scrollAreaWidgetContents);
        bt6 = new QPushButton("bt6", scrollAreaWidgetContents);
        bt7 = new QPushButton("bt7", scrollAreaWidgetContents);
        bt8 = new QPushButton("bt8", scrollAreaWidgetContents);
        bt9 = new QPushButton("bt9", scrollAreaWidgetContents);
        bt10 = new QPushButton("bt10", scrollAreaWidgetContents);
        bt11 = new QPushButton("bt11", scrollAreaWidgetContents);
        bt12 = new QPushButton("bt12", scrollAreaWidgetContents);
        bt13 = new QPushButton("bt13", scrollAreaWidgetContents);
        bt14 = new QPushButton("bt14", scrollAreaWidgetContents);
        bt15 = new QPushButton("bt15", scrollAreaWidgetContents);
        bt16 = new QPushButton("bt16", scrollAreaWidgetContents);
        bt17 = new QPushButton("bt17", scrollAreaWidgetContents);
        */
        bt18 = new QPushButton("bt18", widgetPrincipal);
        bt19 = new QPushButton("bt19", widgetPrincipal);
        bt20 = new QPushButton("bt20", widgetPrincipal);
        /*
        // 2.1 Positionner les widgets dans les layouts
        verticalLayout->addWidget(bt1);
        verticalLayout->addWidget(bt2);
        verticalLayout->addWidget(bt3);
        verticalLayout->addWidget(bt4);
        verticalLayout->addWidget(bt5);
        verticalLayout->addWidget(bt6);
        verticalLayout->addWidget(bt7);
        verticalLayout->addWidget(bt8);
        verticalLayout->addWidget(bt9);
        verticalLayout->addWidget(bt10);
        verticalLayout->addWidget(bt11);
        verticalLayout->addWidget(bt12);
        verticalLayout->addWidget(bt13);
        verticalLayout->addWidget(bt14);
        verticalLayout->addWidget(bt15);
        verticalLayout->addWidget(bt16);
        verticalLayout->addWidget(bt17);
        */
    
        grilleLayout->addWidget(scrollArea, 0, 0); // On place la totalité du scroll dans la case 0,0 de la grille
        grilleLayout->addWidget(bt18, 0, 1); bt18->setStyleSheet("color: #0FFF00; background-color: #CC3399;");
        grilleLayout->addWidget(bt19, 1, 0); bt19->setStyleSheet("color: #0FFF00; background-color: #CC3399;");
        grilleLayout->addWidget(bt20, 1, 1); bt20->setStyleSheet("color: #0FFF00; background-color: #CC3399;");
        bt18->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
    
    
        CustomTimeline* tline = new CustomTimeline(widgetPrincipal);
        grilleLayout->addWidget(tline, 1, 0); tline->setStyleSheet("color: #0FFF00; background-color: #CC3399;");
    
    
        setCentralWidget(widgetPrincipal);
    
    }
    
    
    
    MainWindow::~MainWindow()
    {
    
    }
    
    
    

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    
    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Bonjour,

      En général un QScrollArea ne s'utilise pas avec un layout. C'est setWidget qui est la fonction principale à utiliser.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Morgatte
        wrote on last edited by Morgatte
        #3

        Je débute donc ça reste un peu floue.

        Il me semblait que setWidget servait à définir quel widget deviendra LE widget à scroller.
        Mais moi c'est un ensemble de widgets (sous forme de lignes) que je souhaite scroller.
        D'ou un conteneur scrollable contenant un layout servant à organiser son contenu.
        Je ne peux pas utiliser plusieurs setWidget() d'affilé ? n'est-ce pas ?

        Mais bon, surtout, ça n'explique pas pourquoi un widget de type QPushButton est visible dans et en dehors de la scrollArea, alors qu'un custom widget ne s'affiche qu'en dehors de cette même zone. je fais une bêtise mais je ne la vois pas.

        J'obtiens une fenêtre comme celle-ci. Où les premiers CustomTimeline ne sont pas visibles alors que les boutons qui suivent, le sont :
        (1.jpeg image url)

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Pourquoi le widget principal n'est pas celui du scroll area ?

          Cette partie n'est pas claire.

          Si tout doit être présenté par le scroll area, alors il faut que tout soit logé dans un widget qui sera mis sur le scroll area.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved