Как прокрутить все содержимое моих пользовательских QGraphicsWidgets?

У меня есть собственный QGraphicsWidget с именем «TestContentArea», который добавляется в QGraphicsScene. В своем собственном QGraphicsWidget я добавляю несколько дочерних QGraphicsWidget, добавленных к его макету. У меня проблема в том, что содержимое пользовательского 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_HTestContentArea.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());
}

Из 100 видимых только 11 прямоугольников

0

Решение

Проблема вызвана тем, что вы определяете очень маленький sceneRect по сравнению с тем, что должно быть, и это то, что QScrollBar принять в качестве ссылки SceneRect установить свой ассортимент. Так что решение простое, не устанавливайте sceneRect так что Qt вычисляет его самостоятельно, так как он изменяется:

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

чтобы:

m_scene = new QGraphicsScene(this);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]