20

アップデート

Qt とDWMの使用例については、 「 Using Blur Behind on Windows 」を参照してください。代替テキスト http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png


元の質問:

Qt で Windows Aero Glass ウィンドウを作成したいのですが、次のようになります。 代替テキスト

しかし、いくつかを呼び出した後my_window->repaint()、ウィンドウのラベルが壊れます: 代替テキスト

しかし、ウィンドウのサイズを少し変更すると、適切に再描画されます。


問題は、ウィンドウの背景を消去して、ウィジェットがきれいなガラスに自分自身をペイントするようにするにはどうすればよいかということです。


問題を再現するための短いコードは次のとおりです (Vista with Aero):

class Window(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.setLayout(QVBoxLayout())
        self.layout().addWidget(QLabel("This is the text"))

        # let the whole window be a glass
        self.setAttribute(Qt.WA_NoSystemBackground)
        from ctypes import windll, c_int, byref
        windll.dwmapi.DwmExtendFrameIntoClientArea(c_int(self.winId()), byref(c_int(-1)))
    def mousePressEvent(self, event):
        self.repaint()

ここでウィンドウをクリックするか、Alt-Tab数回クリックするだけです。

とにかく、Aero Glass でラベルを使用することは、私が必要としているものではありません。なぜなら、QLabel は (ウィンドウのタイトルのように) しばらく光って自分自身をペイントする方法を知らないからです。私が必要としているのは、「ガラス」をきれいにする一般的な方法です。

4

2 に答える 2

6

使用するだけです:

QPainter p

p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(boundsRect, QColor(0, 0, 0, 0));

これにより、古い内容が破棄され、透明色で塗りつぶされます。

詳細はこちら

編集:CompositionMode_Clearを使用して、四角形を任意の色でペイントすることをお勧めします。

于 2009-01-27T19:40:01.127 に答える
1

私はしばらくグーグルで調べていたので、解決策を共有すると思いました:

WA_NoSystemBackground を WA_TranslucentBackground に置き換え、mousepressevent を忘れます

ウィンドウは透明なエアロ ガラスになり、必要に応じて自動的に再レン​​ダリングされます。

于 2011-08-16T10:55:43.067 に答える