Как очистить 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!!) решает эту проблему.