如何刷新QWidget绘图缓存?

时间:2012-10-22 11:26:52

标签: qt qt4 qdialog qmessagebox qstyle

我正在开发一个自定义样式的QMessageBox。在方法polish()的自定义QStyle类中,我调用:

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绘图缓存 - 如果这样的话存在(后备存储??)。

1 个答案:

答案 0 :(得分:1)

解决方案来自第268行的src / gui / dialogs / qdialog.cpp:

#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_TranslucentBackground时将Qt :: WA_NoSystemBackground设置为true。上面的解决方法(它的官方Qt代码!!)解决了这个问题。