2013-10-07 3 views
1

Я пытаюсь создать QGraphicScene (с соответствующим представлением) в MainWindow. Сцена определена в отдельном классе (дочерний виджет к главному окну).открыть дочерний виджет QGraphicScene в главном окне

Открытое действие работает хорошо, и я могу открывать каждую картинку, но они всегда открываются в новом окне , а не внутри MainWindow.

Когда я создаю метку (или так) в дочернем виджете, она отображается правильно в главном окне. Таким образом, проблема представляется QGraphicScene или QGraphicView.

MainWindow:

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(); 
} 

Как я могу создать сцену внутри MainWindow и не в отдельном окне? Я использую QT 4.7.4, Windows7 64bit.

ответ

1

Вы создаете новый QGraphicsScene и QGraphicsView каждый раз, когда вы устанавливаете изображение. И вы не помещаете свой view внутри любого макета или устанавливаете для него родителя, поэтому он открывается в новом окне, когда вы вызываете view->show().

Вы должны создать QGraphicsView и QGraphicsScene внутри вашего конструктора.

//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