Как очистить QWidget Painting-Cache?

Я работаю над пользовательским стилем QMessageBox. В моем собственном классе QStyle в методе polish() я вызываю:

if( (pDialog = qobject_cast<QDialog*>( pWidget )) != NULL )
{
    pDialog->setWindowFlags( pDialog->windowFlags() | Qt::FramelessWindowHint );
    // Allow QStyle draw widget background
    pDialog->setAttribute( Qt::WA_StyledBackground, true );

    // Set window background transparent
    QPalette oPalette = pDialog->palette();
    oPalette.setBrush( QPalette::Window, QBrush(Qt::transparent) );
    pDialog->setPalette( oPalette );
}

Это работает нормально, если мы не используем полупрозрачную границу: полупрозрачная часть становится темнее и темнее при каждом перекрашивании (например, при многократном нажатии "Показать детали" / "Скрыть детали").

ОБНОВЛЕНИЕ: Я только что понял, что при перемещении окна сообщения перемещается "слишком темный полупрозрачный контент". Таким образом, я хочу очистить кэш рисования QWidget - если что-то подобное существует (backing-store??).

1 ответ

Решение приходит из src/gui/dialogs/qdialog.cpp в строке 268:

#ifdef Q_WS_S60
if (S60->avkonComponentsSupportTransparency) {
    bool noSystemBackground = testAttribute(Qt::WA_NoSystemBackground);
    // also sets WA_NoSystemBackground
    setAttribute(Qt::WA_TranslucentBackground);
    // restore system background attribute
    setAttribute(Qt::WA_NoSystemBackground, noSystemBackground); 
}
#endif

Если установить только Qt::WA_NoSystemBackground, я понял, что фон не закрашивается вообще - даже не тот, который вызывается Qt::WA_NoSystemBackground!

Это вызвано методом QWidget::setAttribute(), который устанавливает значение Qt::WA_NoSystemBackground в true при установке Qt::WA_TranslucentBackground. Обходной путь сверху (это официальный код Qt!!) решает эту проблему.

Другие вопросы по тегам