Pergunta

QScrollArea , por alguma razão, está ignorando a configuração contentMargins quando eu set QGraphicsView como seu widget. Olhando para o trecho abaixo, alguém por favor pode dizer se estou fazendo algo errado ou que poderia ser um bug no SDK?

trechos 1 (funciona perfeito):

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();

trechos 2 (É como setContentMargins () chamada é completamente ignorado ):

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();

Graças.

Foi útil?

Solução

Parece que você está confundindo a estrutura de como um ninho QGraphicsView e uma QGraphicsScene. (Talvez fosse apenas um erro de digitação?)

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

deve ser alterado para

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

ou

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

Quando você adiciona um QWidget a um layout, você muda pai do widget. Quando você definir um widget (ou QGraphicsView) a um QScrollArea, você muda pai desse widget. Veja objeto Árvores & propriedade para obter mais informações. Então, se você queria montar seu QGraphicsView dentro de um QScrollArea seu código ficaria assim:

    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 uma nota lateral ...

Ao usar QGraphicsViews com um QGraphicsScene, em vez de definir as margens usando setContentsMargins um QScrollArea, eu uso a rolagem automática QGraphicsView e apenas definir o rect cena para ter uma margem maior do que o tamanho do meu conteúdo assim:

    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();

O QGraphicsView inclui um pouco mais de rolagem apenas automática quando necessário. Você pode redimensionar tudo dentro do mesmo e um pouco mais. É ótimo para 2D layouts, interações e animações. Ver Gráficos Ver Quadro do Qt em http://doc.qt.io/qt-5/ graphicsview.html para obter mais informações.

Aqui está mais informações que podem ser úteis ao usar margens e guarnição: O Modelo Box usado por QStyleSheets.

Outras dicas

Para fazer as margens de conteúdo funcionar corretamente para um QScrollArea widget que eu subclasse-lo e definir manualmente as margens da janela de visualização (que é um método protegido em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top