QScrollArea не соблюдает настройку contentMargins - PullRequest
0 голосов
/ 20 октября 2011

QScrollArea по некоторым причинам игнорирует настройку contentMargins, когда я устанавливаю QGraphicsView в качестве его виджета. Глядя на фрагмент ниже, кто-то может сказать, если я делаю что-то не так или это может быть ошибка в SDK?

Фрагмент 1 (работает идеально):

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

Фрагмент 2 (это похоже на setContentMargins () вызов полностью игнорируется):

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 июня 2012

Чтобы поля содержимого работали правильно для виджета QScrollArea, я создаю его подкласс и вручную устанавливаю поля просмотра (это защищенный метод в 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();
//...
3 голосов
/ 20 октября 2011

Похоже, вы путаете структуру того, как вкладывать QGraphicsView и QGraphicsScene. (Может быть, это была просто опечатка?)

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

следует изменить на

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

или

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

Когда вы добавляете QWidget в макет, вы изменяете родителя виджета. Когда вы устанавливаете виджет (или QGraphicsView) на QScrollArea, вы меняете родителя этого виджета. См. Деревья объектов и владение для получения дополнительной информации. Поэтому, если вы хотите настроить свой QGraphicsView внутри QScrollArea, ваш код будет выглядеть так:

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

В качестве примечания ...

При использовании QGraphicsViews с QGraphicsScene вместо установки полей с помощью setContentsMargins QScrollArea я использую автоматическую прокрутку QGraphicsView и просто устанавливаю прямоугольник сцены, чтобы иметь больший запас, чем размер моего контента, например:

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

QGraphicsView включает в себя гораздо больше, чем просто автоматическую прокрутку, когда это необходимо. Вы можете изменить размер всего внутри и даже немного больше. Он отлично подходит для 2D макетов, взаимодействий и анимации. Смотрите Qt Graphics View Framework по адресу http://doc.qt.io/qt-5/graphicsview.html для получения дополнительной информации.

Вот дополнительная информация, которая может быть полезна при использовании полей и отступов: Модель Box , используемая QStyleSheets.

...