2013-03-06 89 views
2

我還在學習Qt,我在Qt中做了一個小項目,我用qt ui設計器創建了一個簡單的ui,並且使用QGraphicsView顯示了一個由QFileDialog加載的圖像,但是當我將加載的圖像文件添加到QgraphicsScene,該圖像不顯示在graphicview中。 graphicView保持空白,請幫助我,謝謝!QGraphicsView什麼也沒有

Project2::Project2(QWidget *parent, Qt::WFlags flags) 
: QMainWindow(parent, flags) 
{ 
ui = new Ui::Project2Class; 
ui->setupUi(this); 

this->scene = new QGraphicsScene; 

this->scene->setSceneRect(0, 0, 649, 459); 

connect(ui->mapLoaderButton, SIGNAL(clicked()), this, SLOT(GetfilePath())); 


ui->graphicsView->setScene(this->scene);  
} 


void Project2::GetfilePath() 
    { 

    QString filePath = QFileDialog::getOpenFileName(this, tr("Select file"), "", tr("Files (*.jpg*)")); 

    if (filePath.isNull() == false) 
    { 
    QImage image(filePath); 

    QSize size = image.size(); 
    ui->graphicsView->scene()->addItem(&QGraphicsPixmapItem(QPixmap::fromImage(image))); 
    ui->graphicsView->scene()->update(); 
    ui->graphicsView->viewport()->update(); 
}} 

回答

2

QGraphicsScene,最Qt的,可變的takes ownership。該變量應該動態分配。

堆棧上創建的變量將不起作用,因爲它們的生存期太短,QObject稍後將嘗試刪除它們。

你需要用'new'創建你的QGraphicsPixmapItem。從QObject的繼承

ui->graphicsView->scene()->addItem(new QGraphicsPixmapItem(QPixmap::fromImage(image))); 

一切都可以自己(和所有)其他QObject的類。當QObject被銷燬時,它會對其所有子級調用「刪除」。 QObject班希望'擁有'自己的孩子。我自己的意思是控制自己的生命。

在你的情況下,你在堆棧上創建了QObject(QGraphicsPixmapItem)。它的生命週期由堆棧控制(但QObject認爲它正在控制它),堆棧將在到達'addItem()'函數調用的分號時刪除它。作爲一般的C++經驗法則,如果一個函數要求指針,不要給它一個臨時(未命名)的對象。 作爲一個通用的Qt經驗法則,如果函數要求指針,甚至不給它一個命名的局部變量 - 最想要一個動態分配的變量,所以看看the documentation上的函數,看看它是否提到「擁有所有權」。如果是這樣,''它,讓Qt後'刪除'它。

+0

謝謝你,你的迴應節省了我的時間,現在項目正常運作。 – RottenRonin 2013-03-06 01:59:49

+0

很高興聽到它!祝您在編碼上好運。 – 2013-03-06 02:00:57