【问题标题】:Qt SpinBox causes program to not respondQt SpinBox 导致程序无响应
【发布时间】:2013-05-01 17:53:58
【问题描述】:

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

感谢您的帮助!

这是一个sn-p的代码。我没有包括设置每个像素值的东西。我知道我做得对。 changeMinColor 是 spinbox 信号的插槽之一。

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

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

【问题讨论】:

  • 我猜这是一堆更新。这不是错误的信号/或槽函数,因为它可以正常工作,直到它被长时间按住。我想知道是否有办法防止更新堆积如山,比如减慢微调器的速度。
  • 好吧,我已经添加了一些代码。我不确定要包括什么。因为它工作正常,直到被信号卡住为止。
  • connect(ui->minColorSpin, SIGNAL(valueChanged(double)),SLOT(changeMinColor(double)));
  • 原来我只需要修复几行。无论如何,谢谢!

标签: qt qspinbox


【解决方案1】:

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

【讨论】:

  • 这太棒了!谢谢你。有效!我做的事情有点不同。我初始化场景一次,并确保在设置之前清除它。谢谢!
  • 创建一个自定义的 QGraphicsPixmapItem,重载paint,并且仅在必要时从绘制方法(或直接绘制)重建像素图可能会更有效。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多