如何滚动自定义 QGraphicsWidget 的所有内容?

Posted

技术标签:

【中文标题】如何滚动自定义 QGraphicsWidget 的所有内容?【英文标题】:How do I scroll all the contents of my custom QGraphicsWidgets? 【发布时间】:2018-08-27 21:01:36 【问题描述】:

我有一个名为“TestContentArea”的自定义 QGraphicsWidget,它被添加到 QGraphicsScene 中。在我的自定义 QGraphicsWidget 中,我添加了一些子 QGraphicsWidgets 添加到其布局中。我遇到的问题是自定义 QGraphicsWidget 的内容超出了用户可以滚动的区域。下面附上一个显示这一点的最小示例。 100 个矩形中只有 11 个可见。在这个示例中,如何滚动所有 100 个子小部件?

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>

#include "TestContentArea.h"

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    //Constructor
    explicit MainWindow(QWidget *parent = nullptr);
    //Deconstructor
    ~MainWindow();

private:
    //Private members
    Ui::MainWindow *ui;
    QGraphicsScene * m_scene;
    QGraphicsView * m_view;
    TestContentArea * m_testContentArea;
;

#endif // MAINWINDOW_H

MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    m_scene = new QGraphicsScene(0, 0, 880, 630, this);

    m_view = new QGraphicsView(m_scene, this);
    m_view->setAlignment(Qt::AlignLeft | Qt::AlignTop);

    m_testContentArea = new TestContentArea();
    m_scene->addItem(m_testContentArea);

    setCentralWidget(m_view);


MainWindow::~MainWindow()

    delete ui;


TestContentArea.h:

#ifndef TESTCONTENTAREA_H
#define TESTCONTENTAREA_H

#include <QGraphicsWidget>
#include <QGraphicsLinearLayout>


class TestContentArea: public QGraphicsWidget

public:
    //Constructor
    TestContentArea(QGraphicsWidget* parent = nullptr);

private:
    //Private members
    QGraphicsLinearLayout * m_layout;

;

#endif // TESTCONTENTAREA_H


TestContentArea.cpp:

#include "TestContentArea.h"

#include <QGraphicsLinearLayout>
#include <QGraphicsRectItem>
#include "RectangleWidget.h"

TestContentArea::TestContentArea(QGraphicsWidget* parent)

    Q_UNUSED(parent);

    setAcceptHoverEvents(true);

    m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
    m_layout->setContentsMargins(30, 30, 0, 0);

    for(int i= 0; i< 100; i++)
    
        RectangleWidget* rect = new RectangleWidget(this);
        m_layout->addItem(rect);

    

    setLayout(m_layout);



RectangleWidget.h:

#ifndef Rectangle_H
#define Rectangle_H

#include <QGraphicsWidget>
#include <QJsonObject>
#include <QGraphicsLinearLayout>
#include <QGraphicsProxyWidget>
#include <QPushButton>

class RectangleWidget: public QGraphicsWidget

public:
    RectangleWidget(QGraphicsWidget* parent = nullptr);

    // Overriding functions
    QRectF boundingRect() const override;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;

private:
    //Private member variables
    QGraphicsLinearLayout * m_layout;
    QPushButton * m_button;


;

#endif // Rectangle_H

RectangleWidget.cpp:

#include "RectangleWidget.h"
#include <QPainter>

RectangleWidget::RectangleWidget(QGraphicsWidget *parent)




void RectangleWidget::paint(QPainter *painter,
    const QStyleOptionGraphicsItem *option, QWidget *widget /*= 0*/)

    Q_UNUSED(widget);
    Q_UNUSED(option);

    //Draw border
    painter->drawRoundedRect(boundingRect(), 0.0, 0.0);


QRectF RectangleWidget::boundingRect() const


    return QRectF(QPointF(0,0), geometry().size());

【问题讨论】:

提供minimal reproducible example QScrollArea 怎么样? @eyllanesc 我继续整理了一个最小的示例。在此示例中,仅显示 11 个子小部件(无法进一步滚动)。我希望这可以为您提供足够的信息。谢谢。 什么是ButtonWidget 您的代码显然不是minimal reproducible example,我已尝试修补缺少的内容,但我没有看到任何问题,因为 QGraphicsView 具有垂直和水平滚动条,它可以显示问题的图像和改进它显示的代码。 【参考方案1】:

问题是因为你定义了一个非常小的sceneRect 与它应该是什么相比,那就是QScrollBarSceneRect 作为引用来建立它的范围。所以解决方法很简单,不要设置任何sceneRect,让Qt自己计算,因为它会发生变化:

m_scene = new QGraphicsScene(0, 0, 880, 630, this);

到:

m_scene = new QGraphicsScene(this);

【讨论】:

我最初添加了该代码以将场景设置为与 MainWindow 完全相同的尺寸。我不知道它会限制整个区域。非常感谢您的回答!

以上是关于如何滚动自定义 QGraphicsWidget 的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在自定义 QGraphicsWidget 中嵌入 QWidget?

如何根据 QGraphicScene 缩放/调整 QGraphicsWidget 的大小?

Qt Embedded:使用 QGraphicsView 和 QGraphicsWidget 在两个屏幕上显示

如何在 UWP ScrollViewer 中自定义水平滚动拇指

滚动时隐藏自定义表格视图单元格标签如何解决?

Flutter 如何在使用自定义滚动视图时(或内部)显示自定义剪辑器