2012-10-22 44 views
0

我正在处理一个自定义样式的QMessageBox。在方法擦亮我的自定义将QStyle类()我称之为:如何刷新QWidget绘画缓存?

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

的解决方案来自SRC/GUI /对话框/ 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_TranslucentBackground时将Qt :: WA_NoSystemBackground设置为true。上面的解决方法(它是官方的Qt代码!!)解决了这个问题。