2013-05-09 75 views
6

我有一個QGraphicsScene我已經添加了一些QGraphicsItem的實例。單個QGraphicsScene的多個QGraphicsView

我需要在個別視圖中顯示整個場景的特定部分。

爲此,我想創建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這說的是查看它應該是相對於它的父(這是小部件,而不是現場)放置。要定義的場景你需要調用使用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()? – 2015-05-25 07:07:29

+0

@XavierGeoffrey這真的是一個不同的問題。視圖的更新策略由QGraphicsView :: setViewportUpdateMode()設置,如果將更新模式設置爲none,則必須手動調用update。這可能通過信號/插槽或直接調用發生。然而,智能更新一直對我來說最合適。 http://doc.qt.io/qt-5/qgraphicsview.html#viewportUpdateMode-prop – 2015-05-26 11:07:15

+0

嗨,謝謝你的時間。我已經在'QTimer'信號/插槽上手動調用更新。我的問題是,我在10個'QTimer'的'Mainwindow'中有10個相同的圖形項目。在信號/槽中,我只調用update(),它觸發所有10個'paintEvent()'。我想知道如何從「主窗口」控制每個圖形視圖的更新。 – 2015-05-26 13:11:31

1

QGraphicsScene有渲染API,你可以用它來渲染QGraphicsScene的某些部分。你可以通過QWidget來渲染它。

空隙QGraphicsScene ::渲染(QPainter的*畫家,常量QRectF &目標= 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 2013-05-14 11:16:28

+0

是的,我意識到它不適用於QGraphicsView,不知道爲什麼。但它在QWidget中可以正常工作。在你的情況下,你不需要QGraphicsView的權利? – Kunal 2013-05-15 01:51:00

+0

它不工作的原因之一是,沒有活躍的畫家,它需要在paintEvent() – Kunal 2013-05-15 01:55:52

相關問題