2011-10-20 17 views
0

QScrollAreaは、QGraphicsViewをウィジェットとして設定したときに何らかの理由でcontentMarginsの設定を無視しています。下のスニペットを見て、誰かが私が何か間違っているのか、それともSDKのバグかもしれないか教えてください。QScrollAreaがコンテンツマージンを設定していません

スニペット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(); 

感謝。

答えて

3

あなたはどのように巣QGraphicsViewとQGraphicsSceneへの構造を混乱しているように見えます。あなたはレイアウトにはQWidgetを追加すると(たぶん、それだけでタイプミスでしたか?)

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

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

または

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

に変更する必要があり、あなたは、ウィジェットの親を変更します。ウィジェット(またはQGraphicsView)をQScrollAreaに設定すると、そのウィジェットの親を変更します。詳細については、Object Trees & Ownershipを参照してください。あなたが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は単なる自動scrolliよりもかなり多くを含んでいるが必要に応じて。あなたはそれの中のすべてをリサイズすることができます。 2Dレイアウト、インタラクション、アニメーションに最適です。詳細についてはQtのGraphics View Framework(http://doc.qt.io/qt-5/graphicsview.html)を参照してください。 QStyleSheetsで使用The Box Model

ここマージンとパディングを使用する場合に有用であり得るより多くの情報です。

+0

私はまだQtのに初心者です。あなたの詳細な答えは本当にQtの概念をもっと理解する助けになりました。私はあなたの提案を間違いなく試みます。 – gplusplus

+0

問題ありません。がんばろう。 – phyatt

4

私はそれをサブクラス化し、手動(QT 4.7で保護された方法である)ビューポートのマージンを設定しQScrollAreaウィジェットに対して適切にコンテンツの余白を動作させるために

// 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(); 
//... 
+0

これは正しい答えです。 – waldyrious

+0

木の木が見えませんでした。正解です。 – Kamajii

関連する問題