0

我正在开发一个自定义样式的 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 绘画缓存 - 如果存在这样的东西(后备存储??)。

4

1 回答 1

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 代码!!)解决了这个问题。

于 2012-10-22T12:29:59.867 回答