Pregunta

QScrollArea , por alguna razón, está ignorando la regulación contentMargins cuando fijo QGraphicsView como su artilugio. Mirando el siguiente fragmento de código, por favor alguien puede decir si estoy haciendo algo mal o podría ser un error en el SDK?

Fragmento 1 (perfecto funciona):

QWidget *appWindow = new QWidget;

QScrollArea *sa = new QScrollArea(appWindow);
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setContentMargins(50, 50, 50, 50);

QWidget *widgetToScroll = new QWidget(sa);
widgetToScroll->resize(5000, 5000);
sa->setWidget(widgetToScroll);

QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow);
appWindowLayout->addWidget(sa);
appWindow->setLayout(appWindowLayout);

appWindow->show();

Fragmento 2 (Es como setContentMargins () llamada se ignora por completo ):

QWidget *appWindow = new QWidget;

QScrollArea *sa = new QScrollArea(appWindow);
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setContentMargins(50, 50, 50, 50);

QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(sa), sa);
widgetToScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop);
widgetToScroll->resize(5000, 5000);
sa->setWidget(widgetToScroll);

QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow);
appWindowLayout->addWidget(sa);
appWindow->setLayout(appWindowLayout);

appWindow->show();

Gracias.

¿Fue útil?

Solución

Parece que está confundiendo la estructura de nido de cómo un QGraphicsView y una QGraphicsScene. (Tal vez fue sólo un error tipográfico?)

    QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(sa), sa);

debe ser cambiado a

    QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(), sa);

o

    QGraphicsView *widgetToScroll = new QGraphicsView();
    sa->setWidget(widgetToScroll);

Cuando se agrega un QWidget a una presentación, cambiar al padre del widget. Al configurar un widget (o QGraphicsView) a un QScrollArea, cambia los padres de ese widget. Ver árboles de objetos y Propiedad para más información. Así que si usted quiere configurar su QGraphicsView dentro de un QScrollArea su código sería el siguiente:

    QWidget *appWindow = new QWidget;

    QScrollArea *sa = new QScrollArea(); // No need to specify a parent here if
                                         // you add it to a layout later
    sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    sa->setContentsMargins(50, 50, 50, 50);

    QGraphicsView *widgetToScroll = new QGraphicsView();
    widgetToScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    widgetToScroll->resize(5000, 5000);
    sa->setWidget(widgetToScroll); // This sets the parent for widgetToScroll

    QVBoxLayout *appWindowLayout = new QVBoxLayout();
    appWindowLayout->addWidget(sa); // This sets the parent for sa
    appWindow->setLayout(appWindowLayout); // This sets the parent for appWindowLayout

    appWindow->show();

Como nota al margen ...

Cuando se utiliza QGraphicsViews con un QGraphicsScene, en lugar de establecer los márgenes utilizando setContentsMargins de un QScrollArea, utilizo el desplazamiento automático QGraphicsView y acaba de establecer la escena rect tener un margen mayor que el tamaño de mi contenido de este modo:

    QWidget *appWindow = new QWidget;

    QGraphicsView *widgetToScroll = new QGraphicsView();
    QGraphicsScene *scene = new QGraphicsScene();
    scene->addRect(0,0, 5000, 5000);

    widgetToScroll->setSceneRect(-50,-50, 5050, 5050);
    widgetToScroll->setScene(scene);

    QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow);
    appWindowLayout->addWidget(widgetToScroll);

    appWindow->setLayout(appWindowLayout);
    appWindow->show();

El QGraphicsView incluye un poco más de movimiento en sentido vertical automática solo cuando sea necesario. Puede cambiar el tamaño de todo el interior de la misma y un poco más. Es ideal para 2D diseños, interacciones y animaciones. Ver Vista Gráfica marco de Qt en http://doc.qt.io/qt-5/ graphicsview.html para más información.

Aquí hay más información que puede ser útil cuando se utiliza márgenes y rellenos: El modelo de caja utilizado por QStyleSheets.

Otros consejos

Para hacer que los márgenes de contenido funcionan correctamente para un QScrollArea widget de I subclase y establecer manualmente los márgenes de ventana gráfica (que es un método protegido en QT 4.7)

// Extended class
class QScrollAreaWithMargins : public QScrollArea
{
public:

    virtual void resizeEvent(QResizeEvent *event) override
    {
        // Define content margins here
        setViewportMargins(5, 0, 0, 0); // <<<<< SET MARGINS HERE
        QScrollArea::resizeEvent(event);
    }
};

// Usage
//...
mEditorScrollArea = new QScrollAreaWithMargins();
//...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top