此QChangesCapacityEffect使用是否会导致潜在的内存泄漏?(但这是强制重新喷漆的唯一方法)
Would this QChangesOpacityEffect usage cause a potential memory leak? (but only way to force repaint...)
所以,我正在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)
,而不必在每次触发插槽时创建新的效果。请记住上面的重新绘制语义。
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 函数从唯一代码调用正确的子类方法
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 初始化 C++14 中唯一指针向量的正确方法
- 如果指针的子类的方法对于子类是唯一的,如何访问这些方法?
- 唯一 ptr 将所有权移动到包含对象的方法
- C++11 重载方法,并转发到唯一方法
- 此QChangesCapacityEffect使用是否会导致潜在的内存泄漏?(但这是强制重新喷漆的唯一方法)
- 从数组中删除唯一元素的最有效方法
- 将全局对象初始化为指针是唯一成功的方法
- 递归类型真的是构建不连续的任意大小数据结构的唯一方法吗
- 方法,用于在代码中唯一标识方法调用,以测试调用序列是否未更改
- 基类的指针数组:如何调用唯一的派生类方法
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 指针类型是"prevent"声明中调用构造函数的唯一方法吗?
- 在 2D 标准::矢量<矢量中查找唯一值的有效方法<double>>
- 宏是强制内联的唯一方法吗?
- 将QObject连接指定为唯一的正确方法是什么
- 在c++中获得当前实例(例如pid)唯一值的独立于平台的方法是什么?