8

(私はPySideを使用していますが、答えはどの言語バインディングでも同じ/似ていると思います)。

ここにある形をした時計の例を取り上げて、時計の文字盤 (円) を透明にして、時計の針と分刻みだけが見えるようにしようとしています。そのまま、例を実行すると、次のようになります。Windows 7 を使用しています。

これまでのところ、(コンストラクターで)次のことを試しました。

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • 時計が表示される (タスク バーに表示される) が、どこにも表示されない
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • 時計が表示されますが、背景は黒一色です。
  • self.setWindowOpacity(0.5)
    • 時計が表示されますが、時計全体が透明です。背景(顔)は透明にしたいけど、時計の針は見えるようにしたい。
4

3 に答える 3

11

とった!

これは、元のサンプルコード(コンストラクター)からのものです。

    ...
    self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
    ...

これが変更された(そして私の質問に従って機能する)バージョンです:

    ...
    self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    ...

削除することself.windowFlags()は私が欠けていた部分でした。(なぜこれを削除する必要があったのか、そもそもなぜそこにあったのかは正確にはわかりません...まだ学ぶことがたくさんあります)。

于 2011-10-06T16:26:38.847 に答える
6

私の記憶が正しければ、スタイルシートも設定する必要がありました。

self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")

それが役立つことを願っています。

于 2011-10-19T18:40:04.683 に答える
1

時計の例では、次のとおりです。

void ShapedClock::resizeEvent(QResizeEvent * /* event */)
 {
     int side = qMin(width(), height());
     QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                          side, QRegion::Ellipse);
     setMask(maskedRegion);
 }

「setMask」は丸い形をします
が、PySide にも同じものがあります:

def resizeEvent(self, event):
        side = min(self.width(), self.height())
        maskedRegion = QtGui.QRegion(self.width()/2 - side/2, self.height()/2 - side/2, side, side, QtGui.QRegion.Ellipse)
        self.setMask(maskedRegion)

それもうまくいくはずですか?

于 2011-10-06T13:26:15.713 に答える