在主窗口中打开一个QGraphicSscene子窗口小部件

时间:2013-10-07 14:44:36

标签: qt qgraphicsview qgraphicsitem qgraphicsscene

我试图在MainWindow中创建一个QGraphicScene(带有适当的View)。 场景是在一个单独的类(主窗口的子窗口小部件)中定义的。

开放行动运作良好,我可以打开每张照片,但它们总是以新的方式打开 窗口,而不是在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();
}

如何在MainWindow中创建场景而不是在单独的窗口中?我使用的是QT 4.7.4,Windows7 64位。

1 个答案:

答案 0 :(得分: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));
}