0

カスタム スタイルの 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 ペインティング キャッシュをフラッシュしたい - このようなものが存在する場合 (バッキング ストア??)。

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 によってトリガーされたものでさえ、背景がまったく描画されないことに気付きました!

これは、Qt::WA_TranslucentBackground を設定するときに、Qt::WA_NoSystemBackground を true に設定する QWidget::setAttribute() メソッドが原因です。上記の回避策 (公式の Qt コードです!!) は、この問題を解決します。

于 2012-10-22T12:29:59.867 に答える