2013-05-09 2 views
6

QGraphicsSceneQGraphicsItem의 인스턴스를 추가했습니다.하나의 QGraphicsScene에 대한 다중 QGraphicsView

개별적인 장면에서 내 전체 장면의 특정 섹션을 표시해야합니다.

이렇게하려면 각각 QGraphicsScene (유사한 부분이 아님)의 특정 섹션을 표시하는 QGraphicsView의 인스턴스를 여러 개 만들고 싶습니다.

어떻게 할 수 있습니까?

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을 사용하고 있습니다. 보기를 담당하는 장면의 영역을 정의하려면 사용 문의가 필요합니다. 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

안녕하세요, 의심 스럽습니다, graphcsScene() 안에 여러 개의 graphicsView()가 있습니다. 각각은 QGraphicsItem을 상속받은 하나의 DrawItem 클래스에서 동일한 것을 그립니다. 이제 MainWindow에서 개별 graphicsView()를 업데이트하는 방법은 무엇입니까? –

+0

@XavierGeoffrey 정말 다른 질문입니다. 뷰의 업데이트 정책은 QGraphicsView :: setViewportUpdateMode()에 의해 설정됩니다. 업데이트 모드를 none으로 설정하면 수동으로 update를 호출해야합니다. 신호/슬롯 또는 직접 호출을 통해 발생할 수 있습니다. 그러나 스마트 업데이 트가 항상 나를 위해 최선을 다해 왔습니다. http://doc.qt.io/qt-5/qgraphicsview.html#viewportUpdateMode-prop –

+0

안녕하세요. 시간 내 주셔서 감사합니다. 이미 수동으로 QTimer 신호/슬롯에서 업데이트를 호출하고 있습니다. 내 문제는 10 개의 'QTimer'가있는'Mainwindow '에 10 개의 동일한 그래픽 항목이 있습니다. 신호/슬롯에서 update()를 호출하면 모든'paintEvent()'가 트리거됩니다. 'Mainwindow'에서 각 그래픽 뷰의 업데이트를 제어하는 ​​방법을 알고 싶습니다. –

1

QGraphicsScene에는 QGraphicsScene의 특정 부분을 렌더링하는 데 사용할 수있는 렌더링 API가 있습니다. QWidget을 통해 렌더링 할 수 있습니다.

무효 QGraphicsScene :: 다음과 같은 (QPainter를 * 화가, CONST는 & 대상 = QRectF(), CONST는 & 소스 = QRectF() 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