2014-10-28 56 views
3

我在這段代碼中的某處發現了一個奇怪的內存泄漏。該方法是連接到另一個線程中的方法的SLOT。它有兩件事:1它用另一個線程所在的迭代來更新文本框。 2它將GUI上顯示的圖像更新爲與該迭代相對應的圖像。Qt內存泄漏使用QPixmap

它適用於10-30次迭代,然後爆炸。看到它在任務管理器中的內存使用情況,我可以看到它一開始就穩定下來,然後每次迭代都會將內存使用量增加大約10%。我能做些什麼來消除泄漏?

Transition::Transition(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Transition) 

    { 
    ui->setupUi(this); 
    this->files = files; 
    imageObject = new QImage(); 
    scene = new QGraphicsScene(this); 
} 

Transition::~Transition() 
{ 
    delete ui; 
    delete imageObject; 
    delete scene; 
} 

有問題的SLOT:

void Transition::onCounterChanged(QString counter){ 
    ui->imageCounter->setText(counter); 
    foldername = ui ->folderName->toPlainText(); 
    int m = counter.toInt(); 
    QString filename = files[m]; 
    imageObject->load(filename); 
    image = QPixmap::fromImage(*imageObject); 

    scene->clear();//THIS FIXES THE LEAK 

    scene->addPixmap(image); 
    ui->picDisplay->setScene(scene); 
    ui->picDisplay->fitInView(image.rect(),Qt::IgnoreAspectRatio); 
} 
+1

發出信號的頻率和頻率如何? – Robert 2014-10-28 15:42:15

+2

最小的可運行示例將有助於測試您的問題。您可以添加它嗎? – gmas80 2014-10-28 15:42:17

回答

5

我想你不要簡單地更新你的形象,而是創造新的圖片項目的場景以:

void Transition::onCounterChanged(QString counter) 
{ 
    [..] 
    imageObject->load(filename); 
    image = QPixmap::fromImage(*imageObject); 
    scene->addPixmap(image); // <----- Adds new pixmap item to the scene 
    [..] 
} 

所以,10後-30次迭代,你的場景中有10-30個像素圖項目。我認爲,您必須使用QGraphicsPixmapItem::setPixmap()函數更新現有QGraphicsPixmapItem,而不是在每次迭代中創建一個新函數。

+0

如何從設置像素圖到更新場景? – user3241316 2014-10-28 16:15:51

+1

我無法弄清楚在這種情況下如何使用'QGraphicsPixMapItem',但將'scene-> clear();'放在'scene-> addPixmap(image);'上方'似乎有效。感謝找到泄漏 – user3241316 2014-10-28 19:09:22

+0

@ user3241316檢查此:https://qt.gitorious.org/qt/qt/source/a8b6d332a6639b5dd2f3ac938251b12b7e4ad406:src/gui/graphicsview/qgraphicsscene.cpp#L2732你在你的情況下做多少不必要的事情!並檢查此:https://qt.gitorious.org/qt/qt/source/a8b6d332a6639b5dd2f3ac938251b12b7e4ad406:src/gui/graphicsview/qgraphicsscene.cpp#L3066正如你可以看到這種方法是非常簡單的。那麼爲什麼你不在代碼中使用一個QGraphicsPixmapItem,而是在每次迭代中使用setPixmap作爲'vahancho'建議?他給了你非常有用的建議! – Chernobyl 2014-10-28 19:55:23