2013-05-09 3 views
6

У меня есть один QGraphicsScene, к которому я добавил несколько экземпляров QGraphicsItem.Несколько QGraphicsView для одного QGraphicsScene

Мне нужно отобразить конкретный раздел всей моей сцены в отдельных видах.

Для этого я хочу создать несколько экземпляров 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); 

ответ

4

Вы используете неправильную функцию, вы используете setGeometry, которые задаем View, где он должен быть помещен относительно его родителя (который является виджетом, а не сцена). Для того, чтобы определить область сцены, что мнение отвечает за показ вам нужно позвонить Использовать 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; 
} 
+0

Привет, у меня есть сомнения, у меня есть несколько graphicsView() внутри graphcsScene(). Каждый из них рисует одну и ту же вещь из одного класса DrawItem, который наследует QGraphicsItem. Теперь, как обновить отдельную графику() от MainWindow? –

+0

@ XavierGeoffrey, это действительно разные вопросы. Политика обновления представления устанавливается с помощью QGraphicsView :: setViewportUpdateMode(), если вы настроили режим обновления равным нулю, тогда вам нужно вручную вызвать обновление. Это может произойти через сигнал/слот или прямой вызов. Однако Smart-обновление всегда срабатывало лучше всего для меня. http://doc.qt.io/qt-5/qgraphicsview.html#viewportUpdateMode-prop –

+0

Привет, спасибо за ваше время. Я уже вручную вызываю обновление в сигнале/слоте QTimer. Моя проблема: у меня есть 10 одинаковых графических элементов в 'Mainwindow' с 10' QTimer'. В сигнале/слоте я вызываю только update(), который запускает все 10 'paintEvent()'. Я хотел бы знать, как управлять обновлением каждого графика с помощью «Mainwindow». –

1

QGraphicsScene имеет API визуализации, которые вы можете использовать, чтобы сделать определенную часть QGraphicsScene. Вы можете сделать это через QWidget.

аннулируется QGraphicsScene :: Render (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 
+0

Я попытался выше код. Это не решает проблему. Просмотров ничего не отображают. – Abhishek

+0

Да, я понял, что он не работает с QGraphicsView, не знаю почему. Но он отлично работает с QWidget. В вашем случае вам не нужен QGraphicsView? – Kunal

+0

одной из причин, по которым он не работал, не было активного художника, это нужно сделать под paintEvent() – Kunal

Смежные вопросы