QScrollArea 不尊重 contentMargins 设置
-
27-10-2019 - |
题
Q滚动区域, 出于某种原因,忽略了 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(就像 设置内容边距() 调用被完全忽略):
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 时,您就更改了该小部件的父级。看 对象树和所有权 了解更多信息。因此,如果您想在 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();
作为旁注...
当将 QGraphicsViews 与 QGraphicsScene 一起使用时,我没有使用 QScrollArea 的 setContentsMargins 设置边距,而是使用 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 的图形视图框架: http://doc.qt.io/qt-5/graphicsview.html 了解更多信息。
以下是使用边距和填充时可能有用的更多信息: 盒子模型 由 QStyleSheets 使用。
其他提示
要使内容边距正常工作要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();
//...