0

シーンの QImage の色を変更する QSpinBox があります。すべてがうまく機能します。色が正しく更新されます。QSpinBox の矢印を押したままにすると、すべて正常に動作します。QSpinBox の矢印を長時間押し続けると問題が発生します。約 1 分ほど保持すると、最終的にアプリケーションが応答を停止し、画像が消えることがあります。これを潜在的に引き起こしている可能性があることを誰かが知っているかどうか疑問に思っていました。アプリケーションが信号で行き詰まる可能性はありますか? もしそうなら、どうすればこれを修正できますか?

ご協力いただきありがとうございます!

コードのスニペットを次に示します。各ピクセル値を設定するためのものは含めていません。私は自分が正しくやっていると知っています。changeMinColor は、スピンボックスのシグナル用のスロットの 1 つです。

void binFileDialog::changeMinColor(double value)
{
    lowColorValue = value;
    ui->maxColorSpin->setMinimum(lowColorValue + .0001);
    setBinScene();
}
void binFileDialog::setBinScene()
{
    float lowValue = lowColorValue;
    float highValue = highColorValue;
    QImage img = QImage(bFile.ncols, bFile.nrows, QImage::Format_RGB32);
    // go through and set  call img.setPixel with rgb values based on contents of bFile
    // and the min and max colors lowValue and highValue.
    QPixmap pm = QPixmap::fromImage(img);
    QGraphicsScene *scene = new QGraphichsScene;
    ui->graphicsView->setSceneRect(0,0, bFile.ncols, bFile.nrows);
    scene->addPixmap(pm);
    ui->graphicsView->setScene(scene);
}

changeMinColorQSpinBox のvalueChanged信号に接続されています。

connect(ui->minColorSpin, SIGNAL(valueChanged(double)),
                          SLOT(changeMinColor(double))); 

また、スピンボックスを押し続けると、メモリが増加することにも気付きました。これは間違っているに違いありません。私は何を忘れていますか?助けてくれてありがとう。

4

1 に答える 1

2

setBinScene() は毎回新しい QGraphicsScene を作成しますが、これは決して削除されません。スピンボックスの値が変更されるたびに setBinScene() が呼び出されるため、コードはリークされた QGraphicsScene オブジェクトを積み上げます。シーンをまとめて再作成することは避け、代わりにQGraphicsPixmapItemを更新することをお勧めします。

シーンを初期化します (1 回):

QGraphicsScene *scene = new QGraphicsScene(this);
m_pixmapItem = new QGraphicsPixmapItem;
scene->addItem(m_pixmapItem);
ui->graphicsView->setScene(scene);

イメージを設定/更新するには:

m_pixmapItem->setPixmap(pm);
ui->graphicsView->setSceneRect(0,0, bFile.ncols, bFile.nrows); //might want to avoid this one if the dimensions do not change
于 2013-05-01T21:11:39.330 に答える