Qt SpinBox导致程序无法响应

时间:2013-05-01 17:53:59

标签: qt qspinbox

我有一个QSpinBox可以改变场景中QImage的颜色。一切正常。颜色正确更新。如果我按住QSpinBox上的箭头一切正常。当我按住QSpinBox上的箭头很长一段时间时,我确实遇到了问题。当我拿着它大约一分钟左右时,我的应用程序最终会停止响应,有时图像会消失。我想知道是否有人知道可能导致这种情况的原因。我的应用程序是否有可能因信号陷入困境?如果是这样,我该如何解决这个问题?

感谢您的帮助!

这是一段代码。我没有包含设置每个像素值的东西。我知道我做得对changeMinColor是旋转盒信号的一个插槽。

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

changeMinColor连接到QSpinBox的valueChanged信号:

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

我也注意到,当我按住旋转盒时,我的记忆力会增加。这一定是错的。我忘记了什么?再次感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

setBinScene()每次都会创建一个永不删除的新QGraphicsScene。当spinbox的每个值更改调用setBinScene()时,您的代码会堆积泄漏的QGraphicsScene对象。 我建议避免一起重新创建场景,只需更新QGraphicsPixmapItem

初始化场景(一次):

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