QScrollAreaいを尊重しcontentMargins設定
-
27-10-2019 - |
質問
QScrollArea, 何らかの理由で無視し、 contentMargins
設定時設定します QGraphicsView そのパーツをプレゼント!のスニペットを以下に誰か教えて下さい場合になっている異物混入など異常が認んでいれば、それらを受け取ったバグです。
スニペット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();
感謝。
解決
のように認識してい混乱の構造にどのように巣を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ではなく、設定のマージンを使用し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を含んだけで自動スクロールが必要です。サイズ変更ができますものの中でもします。では2次元レイアウトの相互作用やアニメーション見Qtのグラフィックビューの枠組みで http://doc.qt.io/qt-5/graphicsview.html ます。
こちらの方が情報利用者の方に有益と思われる利用時のマージンとpaddings: のボックスモデル 使用QStyleSheets.
他のヒント
は、私はそれをサブクラス化し、手動
(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();
//...