我正在开发一个自定义样式的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绘图缓存 - 如果这样的话存在(后备存储??)。
答案 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代码!!)解决了这个问题。