I have one QGraphicsScene
to which I have added some instances of QGraphicsItem
.
I need to display a particular section of my whole scene in individual views.
To do that, I want to create multiple instances of QGraphicsView
each of which displays a particular section of my QGraphicsScene
(not a similar portion).
How can it be done?
QGraphicsScene mcpGraphicsScene = new QGraphicsScene(this);
QGraphicsRectItem * mcpGraphicsRect = mcpGraphicsScene->addRect(5,5,200,200);
QGraphicsLineItem * mcpGraphicsLine = mcpGraphicsScene->addLine(500,500,300,300);
QGraphicsView * mcpGraphicsView1 = new QGraphicsView(this);
mcpGraphicsView1->setScene(mcpGraphicsScene);
mcpGraphicsView1->setGeometry(260,20,311,500);
QGraphicsView * mcpGraphicsView2 = new QGraphicsView(this);
mcpGraphicsView2->setScene(mcpGraphicsScene);
mcpGraphicsView2->setGeometry(260,520,311,1061);
You are using the wrong function, you are using setGeometry which is telling the View where it should be placed relative to its parent (which is the widget, not the scene). To define the area of the scene that the view is responsible for showing you need to call use setSceneRect
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QLayout>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QHBoxLayout* myLayout = new QHBoxLayout(this);
QGraphicsScene* mcpGraphicsScene = new QGraphicsScene(this);
mcpGraphicsScene->addRect(5,5,200,200);
mcpGraphicsScene->addLine(500,500,300,300);
QGraphicsView * mcpGraphicsView1 = new QGraphicsView(mcpGraphicsScene, this);
mcpGraphicsView1->setSceneRect(0,0,150,150);
QGraphicsView * mcpGraphicsView2 = new QGraphicsView(mcpGraphicsScene, this);
mcpGraphicsView2->setSceneRect(0,150,600,600);
myLayout->addWidget(mcpGraphicsView1);
myLayout->addWidget(mcpGraphicsView2);
QWidget *window = new QWidget();
window->setLayout(myLayout);
setCentralWidget(window);
}
MainWindow::~MainWindow()
{
delete ui;
}
QGraphicsScene has render API, which you can use to render certain portion of QGraphicsScene. You can render it over QWidget.
void QGraphicsScene::render(QPainter * painter, const QRectF & target = QRectF(), const QRectF & source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)
something like following, I tested following code works fine.
#include "mygraphicsview.h"
#include <QGraphicsScene>
#include <QPixmap>
#include <QGraphicsView>
#include <QPen>
#include <QBrush>
MyGraphicsView::MyGraphicsView(QWidget *parent) :
QWidget(parent)
{
setGeometry(QRect(100,100,300,300));
scene = new QGraphicsScene(QRect(0,0,600,600));
scene->addRect(20,20,100,100,QPen(),QBrush(Qt::black));
scene->addRect(10,150,100,100,QPen(),QBrush(Qt::red));
}
void MyGraphicsView::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
scene->render(&painter,QRect(0,0,300,300),QRect(10,10,200,200));
}
#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
#include <QWidget>
class QGraphicsScene;
class MyGraphicsView : public QWidget
{
Q_OBJECT
public:
MyGraphicsView(QWidget *parent = 0);
void paintEvent(QPaintEvent *event);
signals:
public slots:
private:
QGraphicsScene* scene;
};
#endif // MYGRAPHICSVIEW_H
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With