Может ли это использование QChangesOpacityEffect вызвать потенциальную утечку памяти? (но единственный способ заставить перекрасить ...) - PullRequest
0 голосов
/ 12 января 2019

Итак, я работаю с некоторыми QWidgets внутри QMdiArea, и я хочу поиграть с непрозрачностью графического представления внутри QWidgets с помощью циферблата, используя QGraphicsOpacityEffect.

Это слот, который получает сигнал набора для установки новой непрозрачности:

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 голосов
/ 12 января 2019

Там не должно быть утечкой памяти, пока вы передаете родительский объект в свой QGraphicsOpacityEffect или установите виджет с эффектом.

Способ, которым вы настроили ui->graphicsView->setGraphicsEffect(op), в соответствии с QWidget::setGraphicsEffect:

Устанавливает эффект как эффект виджета. Если в этом виджете уже установлен эффект, QWidget удалит существующий эффект перед установкой нового эффекта.

У вас есть гарантия, что промежуточные объекты будут удалены. Что касается окончательного GraphicsEffect, то, как ваш ui->graphicsView виджет уничтожается, так и GraphicsOpacityEffect (см. Деревья объектов Qt и владение ).


Что касается принудительного изменения непрозрачности на вашем диске, попробуйте добавить repaint(); в ваш слот. Это перекрасит весь ваш виджет. (И после этого также попробуйте parentWidget()->repaint(), так как родитель иногда нуждается в небольшом подталкивании.)


Как Джереми Фризнер упоминает в комментариях , и, как вы уже пробовали ранее, может быть более эффективно установить QGraphicOpacityEffect *op в качестве члена класса, вызывая op->setOpacity(x) в своем слоте, не имея создавать новый эффект при каждом срабатывании слота. Помните о семантике перерисовки, приведенной выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...