Placer un layout dans un scrollArea
-
Bonjour,
J'essaie de placer des boutons (ou autres objets) dans un QScrollArea beaucoup plus grand que ma fenêtre.
Mais j'aimerai aussi les réorganiser proprement avec un QVBoxLayout à l'intérieur du scrollArea.Mon code ne fonctionne pas. Pourriez-vous y jeter un coup d'oeil svp ?
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(1000,800); m_mainWidget = new QWidget(this); // création du widget principal invisible supportant tous les autres éléments graphiques m_hLayout = new QHBoxLayout(this); // Création d'un horizontal layout scrollArea = new QScrollArea(this); //scrollArea->setFixedSize(900,790); // Création d'un ScrollArea scrollArea->setBackgroundRole(QPalette::LinkVisited); // scrollBar = new QScrollBar(this); scrollBar->setRange(1,2000); // et d'une ScrollBar m_mainWidget->setLayout(m_hLayout); // le mainWidget sera d'abord organisé en colonnes (2 colonnes en fait... voir les 2 lignes suivantes) m_hLayout->addWidget(scrollArea); // On place le ScrollArea dans la 1e cellule (colonne du horizontal layout) m_hLayout->addWidget(scrollBar); // On place une ScrollBar dans la 2e cellule (colonne du horizontal layout) //m_vLayout = new QVBoxLayout(this); // le scroll area contiendra un vertical layout //scrollArea->setLayout(m_vLayout); for (int i=0; i<365; i++) { QPushButton* btn = new QPushButton ("Sans nom", scrollArea); list_btn.append(btn); list_btn[i]->setText(QString("bouton %1").arg(i)); //m_vLayout->addWidget(btn); btn->move(10, 60*i); } setCentralWidget(m_mainWidget); } MainWindow::~MainWindow() { }
-
Bonjour,
En utilisant Google Translate, cela peut sembler étrange.Vous devez définir son widget de défilement.
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(..)Voici un exemple qui crée une telle configuration.
// setup scroll area auto scrollArea = new QScrollArea(centralWidget()); scrollArea ->move(10, 10); scrollArea ->resize(400, 400); // you dont need this as you should put it in a layout in your widget scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setWidgetResizable(true); // set up its center widget as docs tells auto scrollAreaWidgetContents = new QWidget(); auto verticalLayout = new QVBoxLayout(scrollAreaWidgetContents); verticalLayout->setSpacing(4); verticalLayout->setContentsMargins(4, 4, 4, 4); // setup the "row" handler widget using a from layout auto rowHandlerwidget = new QWidget(scrollAreaWidgetContents); auto formLayout = new QFormLayout(rowHandlerwidget); formLayout->setSpacing(4); formLayout->setContentsMargins(1, 1, 1, 1); // add some "rows! for (int numRows = 0; numRows < 50; ++numRows) { auto label = new QLabel(rowHandlerwidget); label ->setText( "Im Setting:" + QString::number(numRows)); formLayout->setWidget(numRows, QFormLayout::LabelRole, label); if ( numRows % 3 ) { auto lineEdit = new QLineEdit(rowHandlerwidget); formLayout->setWidget(numRows, QFormLayout::FieldRole, lineEdit); } else { auto combo = new QComboBox(rowHandlerwidget); formLayout->setWidget(numRows, QFormLayout::FieldRole, combo); } } // assign row hander widget verticalLayout->addWidget(rowHandlerwidget); // assign scrollsbox widget scrollArea->setWidget(scrollAreaWidgetContents);
-
Bonsoir,
@mrjj said in Placer un layout dans un scrollArea:
centralWidget()
Est-ce qu'il y a un widget central ?
Si non, il faut ajoutersetCentralWidget(scrollArea);
. -
Tout à fait, c'était ça. Tout fonctionne.
Etant débutant j'ai vraiment cherché partout depuis trois jours un code valide, et j'ai vu que je n'étais pas le seul à avoir cherché ce sujet.J'aimerais donc remettre le code complet proposé par mrjj, pour que d'autres puissent s'en inspirer.
Super bout de code ! Merci.main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QScrollArea> #include <QFormLayout> #include <QVBoxLayout> #include <QLabel> #include <QLineEdit> #include <QComboBox> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: QScrollArea* scrollArea; QFormLayout* formLayout; QVBoxLayout* verticalLayout; QLabel* label; QLineEdit* lineEdit; QComboBox* combo; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(1000,800); scrollArea = new QScrollArea(centralWidget()); scrollArea ->move(10, 10); scrollArea ->resize(400, 400); // you dont need this as you should put it in a layout in your widget scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setBackgroundRole(QPalette::LinkVisited); scrollArea->setWidgetResizable(true); // set up its center widget as docs tells auto scrollAreaWidgetContents = new QWidget(); verticalLayout = new QVBoxLayout(scrollAreaWidgetContents); verticalLayout->setSpacing(4); verticalLayout->setContentsMargins(4, 4, 4, 4); // setup the "row" handler widget using a from layout auto rowHandlerwidget = new QWidget(scrollAreaWidgetContents); formLayout = new QFormLayout(rowHandlerwidget); formLayout->setSpacing(4); formLayout->setContentsMargins(1, 1, 1, 1); // add some "rows! for (int numRows = 0; numRows < 50; ++numRows) { label = new QLabel(rowHandlerwidget); label ->setText( "Im Setting:" + QString::number(numRows)); formLayout->setWidget(numRows, QFormLayout::LabelRole, label); if ( numRows % 3 ) { lineEdit = new QLineEdit(rowHandlerwidget); formLayout->setWidget(numRows, QFormLayout::FieldRole, lineEdit); } else { combo = new QComboBox(rowHandlerwidget); formLayout->setWidget(numRows, QFormLayout::FieldRole, combo); } } // assign row hander widget verticalLayout->addWidget(rowHandlerwidget); // assign scrollsbox widget scrollArea->setWidget(scrollAreaWidgetContents); setCentralWidget(scrollArea); } MainWindow::~MainWindow() { }
-
@Morgatte said in Placer un layout dans un scrollArea:
scrollArea = new QScrollArea(centralWidget());
centralWidget()
n'est du coup pas utile puisque de toute façon un pointeur null est retourné. -
Voici un exemple re réponse:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMainWindow>
#include <QPainter>
#include <QLine>
#include <QPen>
#include <QGroupBox>
#include <QGridLayout>
#include <QScrollArea>
#include <QPaintEvent>
#include <qDebug>
#include <QPushButton>
#include <QApplication>
#include <QLabel>class Widget : public QMainWindow
{
Q_OBJECTpublic:
Widget(QWidget *parent = 0);
~Widget();private:
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "zonescroll.h"Widget::Widget(QWidget *parent)
: QMainWindow(parent)
{ZoneScroll *zone = new ZoneScroll;
QScrollArea *scroll = new QScrollArea ; scroll->setFixedHeight(800); scroll->setFixedWidth(1000); scroll->setWidget(zone); QWidget *central = scroll; QGroupBox *box = new QGroupBox("Rolland",central); box->setFixedWidth(600); box->setFixedHeight(100); QGridLayout *layout = new QGridLayout(); layout->addWidget(box,2,3);
central->setLayout(layout);
this->setCentralWidget(central); zone->setGeometry(QRect(110, 80, 1200, 300)); QPushButton *Quitter = new QPushButton("Quitter",scroll); Quitter->setGeometry(1000,20,100,30);
QObject::connect(Quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
}
Widget::~Widget()
{
}zonescroll.h
#ifndef ZONESCROLL_H
#define ZONESCROLL_H#include <QtGui>
#include <QWidget>
#include <QGroupBox>
#include <QGridLayout>class ZoneScroll : public QWidget
{
Q_OBJECT
public:
ZoneScroll(QWidget *parent = 0);
void paintEvent(QPaintEvent *event);
};#endif // ZONESCROLL_H
zonescroll.cpp
#include "zonescroll.h"ZoneScroll::ZoneScroll(QWidget *parent) : QWidget(parent)
{}
void ZoneScroll::paintEvent(QPaintEvent *event)
{
QPainter painter(this);QLine *line = new QLine(); QPen *couleur = new QPen(); couleur->setColor(Qt::blue); couleur->setWidth(3); line->setLine(50,50,300,80); painter.setPen(*couleur); painter.drawLine(*line);
}
main.cpp
#include "widget.h"#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);Widget w;
w.show();
return a.exec();
}