Qt QScrollArea不考虑内容页边距设置

Qt QScrollArea不考虑内容页边距设置,qt,qgraphicsview,qscrollarea,Qt,Qgraphicsview,Qscrollarea,由于某种原因,当我设置为它的小部件时,它忽略了contentMargins设置。看看下面的代码片段,有人能告诉我我是否做错了什么,或者它可能是SDK中的一个bug吗 代码片段1(非常适用): 代码片段2(就像完全忽略了调用): 谢谢。您似乎混淆了如何嵌套QGraphicsView和QGraphicsCenter的结构。(可能只是打字错误?) 应改为 QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene()

由于某种原因,当我设置为它的小部件时,它忽略了
contentMargins
设置。看看下面的代码片段,有人能告诉我我是否做错了什么,或者它可能是SDK中的一个bug吗

代码片段1(非常适用):

代码片段2(就像完全忽略了调用):


谢谢。

您似乎混淆了如何嵌套QGraphicsView和QGraphicsCenter的结构。(可能只是打字错误?)

应改为

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

当您将QWidget添加到布局时,您将更改该小部件的父级。当您将小部件(或QGraphicsView)设置为QScrollArea时,您将更改该小部件的父级。有关更多信息,请参阅。因此,如果您想在QScrolla区域内设置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();
作为旁注

将QGraphicsView与QGraphicscene一起使用时,我使用QGraphicsView自动滚动,而不是使用QScrollArea的setContentsMargins设置边距,只需将scene 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不仅仅包括在需要时自动滚动。你可以调整它里面的所有东西,甚至更多。它是伟大的二维布局,互动和动画。有关更多信息,请参阅位于的Qt的图形视图框架


以下是使用边距和填充时可能有用的更多信息:由QStyleSheets使用。

要使内容边距对QScrolArea小部件正常工作,我将其子类化并手动设置视口边距(这是QT 4.7中的一种受保护方法)

//扩展类
带边距的QScrollArea类:公共QScrollArea
{
公众:
虚拟void resizeEvent(QResizeEvent*event)重写
{
//在此处定义内容页边距

setViewportMargins(5,0,0,0);//我还是Qt的新手;您详细的回答确实帮助我更好地理解了Qt的概念。我一定会尝试您的建议。看不见树木,也看不见树木。回答正确。
    QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(), sa);
    QGraphicsView *widgetToScroll = new QGraphicsView();
    sa->setWidget(widgetToScroll);
    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();
    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();
// 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();
//...