这种QChangesOpacityEffect用法会导致潜在的内存泄漏吗? (但这是强制重涂的唯一方法...)

时间:2019-01-12 01:24:04

标签: c++ qt

因此,我正在使用QMdiArea中的一些QWidget,并且我想使用QGraphicsOpacityEffect来通过拨盘在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()时也会发生同样的情况。关于此原因的任何想法?我该如何防止内存泄漏,同时又迫使不透明性随转盘立即改变?

谢谢!

1 个答案:

答案 0 :(得分:1)

只要将父对象传递给QGraphicsOpacityEffect 设置具有效果的小部件,就不会出现内存泄漏。

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

  

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

您已保证将删除中间对象。关于最终的GraphicsEffect,由于ui->graphicsView小部件被销毁,所以GraphicsOpacityEffect也被销毁(请参见Qt Object Trees and Ownership)。


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


正如杰里米·弗里斯纳(Jeremy Friesner)在comments中提到的那样,就像您之前尝试过的那样,将QGraphicOpacityEffect *op设置为类的成员,并在您的广告位中调用op->setOpacity(x)可能会更有效。无需在每次触发广告位时创建新效果。请记住上面的重绘语义。