Pregunta

Estoy intentando crear un widget personalizado. Mi Widget hace por sí mismo a menos que sea dentro de un área de desplazamiento. El código siguiente funciona. Si cambio el caso de (0) a un si (1) dentro del constructor MainWindow, no va a hacer que la cadena "Hola Mundo". Asumo que debo (re) aplicar algunos métodos adicionales, pero hasta ahora no he sido capaz de encontrar los correctos con ensayo y error.

// 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();
}
¿Fue útil?

Solución

Usted sólo tiene que dar su HelloWidget un tamaño y lugar.

Añadir esta línea a su código.

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



O si lo desea rellenar el área de desplazamiento con tu 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 );
}

Otros consejos

Qt docs , "Cuando se utiliza un área de desplazamiento para mostrar la contenido de un widget personalizado, es importante asegurarse de que el tamaño de pista del control hijo se establece en un valor adecuado. Si se utiliza un QWidget estándar para el control hijo, puede que sea necesario llamar QWidget :: setMinimumSize () para asegurar que el contenido del widget se muestran correctamente dentro del área de desplazamiento ".

¿Funciona bien si usted sigue estas instrucciones?

Me estaba tirando de mi pelo hacia fuera sobre esto también, pero finalmente encontré setWidgetResizable , que hizo que el QScrollArea permitir que mi aparato se expanda para ocupar el espacio disponible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top