0

QScrollAreaは、 QGraphicsViewをウィジェットとして設定すると、何らかの理由でcontentMargins設定を無視します。以下のスニペットを見て、誰かが私が何か間違ったことをしているのか、それとも 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();

ありがとう。

4

2 に答える 2

4

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();
//...
于 2012-06-29T20:29:47.457 に答える
3

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に設定すると、そのウィジェットの親が変更されます。詳細については、オブジェクトツリーと所有権を参照してください。したがって、QScrollArea内にQGraphicsViewを設定する場合、コードは次のようになります。

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

補足として...

QGraphicsSceneでQGraphicsViewsを使用する場合、QScrollAreaのsetContentsMarginsを使用してマージンを設定する代わりに、QGraphicsView自動スクロールを使用し、シーンrectをコンテンツのサイズよりも大きいマージンを持つように設定します。

    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)を参照してください。

マージンとパディングを使用するときに役立つ可能性のある詳細情報は次のとおりです。QStyleSheetsで使用されるボックスモデル。

于 2011-10-20T07:35:04.313 に答える