2013-10-07 277 views
1

我想在MainWindow中創建一個QGraphicScene(具有相應的視圖)。 場景是在一個單獨的類(一個子窗口小部件到主窗口)中定義的。在主窗口中打開一個QGraphicScene子窗口小部件

開放式動作效果很好,我可以打開每張圖片,但它們總是在新的 窗口中打開,而不是在MainWindow中打開。

當我在子窗口小部件中創建一個標籤(或左右)時,它會在主窗口中正確顯示。所以問題似乎是QGraphicScene或QGraphicView。

主窗口:

MainWindow::MainWindow() 
{ 
    QWidget *widget = new QWidget; 
    setCentralWidget(widget); 

    PictureArea = new picturearea(this); 

    QHBoxLayout *HLayout = new QHBoxLayout(this); 

    HLayout->addWidget(PictureArea,1); 

    widget->setLayout(HLayout); 

    createActions();       
    createMenus();     

    this->setMinimumSize(800,600); 
    this->resize(800,600); 


} 

... 

void MainWindow::open() 
{ 
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), 
    QDir::currentPath(), tr("Image Files (*.png *.jpg)")); 

    if (!fileName.isEmpty()) 
    { 
     QImage image(fileName); 
     if (image.isNull()) 
     { 
      QMessageBox::information(this, tr("Image Viewer"), 
      tr("Cannot load %1.").arg(fileName)); 
      return; 
     } 
     //transfer to child widget, guess no mistakes so far 
     PictureArea->setPicture(image);  
    } 


} 

picturearea:

picturearea::picturearea(QWidget *parent) : QWidget(parent) 
{ 



} 

void picturearea::setPicture(QImage image) 
{ 
    QGraphicsScene* scene = new QGraphicsScene(); 
    QGraphicsView* view = new QGraphicsView(scene); 

    QGraphicsPixmapItem* item = 
       new QGraphicsPixmapItem(QPixmap::fromImage(image)); 
    scene->addItem(item); 

    view->show(); 
} 

我怎樣才能創建主窗口中,而不是在一個單獨的窗口中的情景嗎?我使用的是QT 4.7.4,Windows7 64bit。

回答

1

您每次設置圖片時都會創建一個新的QGraphicsSceneQGraphicsView。並且您不會將view放置在任何佈局中,也不會將其設置爲父級,因此當您致電view->show()時,它將在新窗口中打開。

您應該在構造函數中創建一個QGraphicsViewQGraphicsScene

//picturearea.h 
... 
public: 
    QGraphicsView *view; 
    QGraphicsScene *scene;   
... 

//pircurearea.cpp 
picturearea::picturearea(QWidget *parent) : QWidget(parent) 
{ 
    this->setLayout(new QVBoxLayout); 
    view = new QGraphicsView(this); 
    this->layout()->addWidget(view); 
    scene = new QGraphicsScene; 
    view->setScene(scene); 
} 

void picturearea::setPicture(QImage image) 
{ 
    scene->clear(); 
    scene->addPixmap(QPixmap::fromImage(image)); 
} 
+0

它的工作原理:) 非常感謝。這是我想要的。 男人......當然,一個佈局。我很愚蠢^^ – Kyrill