Несколько QGraphicsView для одного QGraphicsScene
у меня есть один QGraphicsScene
к которому я добавил несколько экземпляров QGraphicsItem
.
мне нужно отобразить определенный раздел всей моей сцены в отдельных видах.
для этого я хочу создать несколько экземпляров QGraphicsView
каждый из которых отображает определенный раздел QGraphicsScene
(не похожая часть).
как это можно сделать?
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);
2 ответов
вы используете неправильную функцию, вы используете setGeometry, которая сообщает представление, где оно должно быть размещено относительно его родителя (который является виджетом, а не сценой). Чтобы определить область сцены, за показ которой отвечает представление, необходимо вызвать 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 имеет API рендеринга, который можно использовать для рендеринга определенной части QGraphicsScene. Вы можете отобразить его через QWidget.
недействительным на qgraphicsscene::рендер(рисовальщика QPainter * живописец, с const qrectf тоже цель & = qrectf тоже(), с const qrectf тоже & источник = qrectf тоже () в Qt::AspectRatioMode aspectRatioMode = интервала QT::KeepAspectRatio)
что-то вроде следующего, я тестировал следующий код отлично работает.
#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