此QChangesCapacityEffect使用是否会导致潜在的内存泄漏?(但这是强制重新喷漆的唯一方法)

Would this QChangesOpacityEffect usage cause a potential memory leak? (but only way to force repaint...)

本文关键字:方法 唯一 新喷漆 泄漏 是否 QChangesCapacityEffect 内存      更新时间:2023-10-16

所以,我正在QMdiArea中处理一些QWidget,我想使用QGraphicsCapacityEffect,用表盘来处理QWidget中图形视图的不透明度。

这是接收拨号信号以设置新不透明度的插槽:

void MainWindow::changeWindow1Transparency(int dialValue)
{
QGraphicsOpacityEffect* op = new QGraphicsOpacityEffect(ui->graphicsView); //Potential memory leak here
op->setOpacity(qreal(dialValue)/255);
ui->graphicsView->setGraphicsEffect(op);
ui->graphicsView->repaint();
}

这是我唯一能在转动表盘时立即改变不透明度的方法。但我担心这可能会导致内存泄漏,因为新的不断产生新的效果。

我已经尝试将这个QGraphicOpacityEffect *op设置为类的属性。但是,当我转动表盘时,不透明度不会立即改变,只有当我在QMdiArea周围移动窗口时。调用QGraphicsView->GraphicsEffects()时也会发生同样的情况。。你知道为什么会这样吗?如何防止内存泄漏,同时强制不透明度随刻度盘立即改变?

谢谢!

只要将父对象传递给QGraphicsCapacityEffect设置具有该效果的小部件,就不应该发生内存泄漏。

你设置ui->graphicsView->setGraphicsEffect(op)的方式,根据QWidget::setGraphicsEffect:

将效果设置为小部件的效果。如果这个小部件上已经安装了效果,QWidget将在安装新效果之前删除现有效果。

您已经保证中间对象将被删除。关于最终的GraphicsEffect,由于ui->graphicsView小部件被销毁,GraphicsOpcityEffect也被销毁(请参见Qt对象树和所有权)。


至于强制更改表盘的不透明度,请尝试将repaint();添加到插槽中。这将重新绘制整个小部件。(在那之后,也可以尝试parentWidget()->repaint(),因为父母有时需要一点轻推。)


正如Jeremy Friesner在评论中提到的,正如你之前尝试过的那样,将QGraphicOpacityEffect *op设置为类的成员可能会更有效,在你的插槽中调用op->setOpacity(x),而不必在每次触发插槽时创建新的效果。请记住上面的重新绘制语义。