Mon widget ne s'affiche pas
-
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(); }
-
Bonjour,
En général un QScrollArea ne s'utilise pas avec un layout. C'est setWidget qui est la fonction principale à utiliser.
-
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 :
( image url) -
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.