Question

Je cherche à créer un widget personnalisé. Mon Widget se rend à moins qu'il se trouve dans une zone de défilement. Le code ci-dessous fonctionne. Si je change le cas (0) à un si (1) du constructeur MainWindow, il ne rend pas la chaîne « Bonjour tout le monde ». Je suppose que je dois (re) mettre en œuvre des méthodes supplémentaires, mais jusqu'à présent, je ne l'ai pas été en mesure de trouver les bonnes avec essais et erreurs.

// hellowidget.h
#ifndef HELLOWIDGET_H
#define HELLOWIDGET_H

#include <QtGui>

class HelloWidget : public QWidget
{
    Q_OBJECT
public:
    HelloWidget(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);
};

#endif // HELLOWIDGET_H

// hellowidget.cpp
#include "hellowidget.h"
HelloWidget::HelloWidget(QWidget *parent)
: QWidget(parent)
{
}
void HelloWidget::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     painter.drawText(rect(), Qt::AlignCenter, "Hello World");
}

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
};

#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "hellowidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    HelloWidget *hello = new HelloWidget;
    QWidget *central = hello;

    if( 0 )
    {
        QScrollArea *scroll = new QScrollArea ;
        scroll->setWidget(hello);
        central = scroll;
    }

   setCentralWidget( central );
}

MainWindow::~MainWindow()
{
}

// main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
Était-ce utile?

La solution

Il vous suffit de donner votre HelloWidget une taille et le lieu.

Ajoutez cette ligne à votre code.

hello->setGeometry(QRect(110, 80, 120, 80)); 


Ou si vous voulez remplir la zone de défilement avec votre widget:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
    QScrollArea *const scroll(new QScrollArea);
    QHBoxLayout *const layout(new QHBoxLayout(scroll)); 
    HelloWidget *const hello(new HelloWidget);
    hello->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    layout->addWidget(hello);
    setCentralWidget( scroll );
}

Autres conseils

Par Qt docs , « Lorsque vous utilisez une zone de défilement pour afficher la contenu d'un widget personnalisé, il est important de veiller à ce que l'indice de taille du widget enfant est réglé sur une valeur appropriée. Si un QWidget standard est utilisé pour le widget enfant, il peut être nécessaire d'appeler QWidget :: setMinimumSize () pour faire en sorte que le contenu du widget sont indiqués correctement dans la zone de défilement. "

Est-ce que ça fonctionne bien si vous suivez ces instructions?

Je tirais mes cheveux sur cela aussi, mais finalement trouvé de QScrollArea setWidgetResizable , qui a fait le QScrollArea permettre à mon widget pour développer de prendre l'espace disponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top