반투명 PySide2 제작 창

10736 단어 pyside2Python
이 글은 Takumi Akashiro 혼자 Advent Calendar 2020의 셋째 날이다.

오프닝


네, Advent Calendar 셋째 날에는 소재가 없어요.
처음에는 실용적인 글을 쓰는 의식이 있었다1
어쩔 수 없으니까 여기서부터 다음 주 월요일까지 내가 좋아하는 조사 내용을 적어놓을게.
그와는 전혀 관계가 없다.
그러니 3일째 보도를 보세요!

개막사


여러분은 창의 투과 처리를 써 본 적이 있습니까?지금까지 일한 적 한 번도 없어!
갑자기 창을 덮어쓸 수 있는 프로그램을 만들고 싶어서 잠깐 기억하고 싶어요. (던지기)
반투명 창은 잘하는 것과 못하는 것이 있어 구분해서 사용해야 한다
오늘의 보도는 이 점에 입각하여 해설을 하고 싶습니다!

오늘의 샘플 코드

#!python3
# encoding:utf-8

from PySide2 import QtWidgets
from PySide2 import QtCore

class Window(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle("Sample")
        self.setStyleSheet("background-color:white;")
        self.setFixedSize(480, 320)

        hbox = QtWidgets.QHBoxLayout()
        vbox = QtWidgets.QVBoxLayout()
        hbox.addLayout(vbox)

        button_first = QtWidgets.QPushButton("Button: 1")
        button_first.setStyleSheet("background-color:gray; color:white;height:100%")
        vbox.addWidget(button_first)

        button_second = QtWidgets.QPushButton("Button: 2")
        button_second.setStyleSheet("background-color:darkgray; color:white;height:100%")
        vbox.addWidget(button_second)

        textedit = QtWidgets.QTextEdit("QtWidgets.QTextEdit")
        textedit.setStyleSheet("background-color:lightgray;")
        hbox.addWidget(textedit)

        self.setLayout(hbox)


if __name__ == "__main__":
    app = QtWidgets.QApplication()
    window = Window()
    window.show()
    exit(app.exec_())


네, Qt제로 특이한 잡화 창구가 없습니다.
오늘 이걸 통해서 보고 싶어요.

방법 1 창 배경의 투명도 설정


self.setwindow Flags에서 "WA Translucent Background"1 창의 배경을 통과할 수 있도록 설정합니다.
하지만 이렇게 되면'WA Translucent Background'를 설정할 때
배경을 추가한 WA NoSystemBackground의 영향을 받지 않아 배경색을 그리지 않았습니다.
paintEvent 측면에 배경색을 그려야 합니다.
class Window(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        # ~中略~
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setStyleSheet("background-color: rgba(255, 255, 255, 127);")

    def paintEvent(self, event):
        # NOTE: トップレベルのWidgetはWA_TranslucentBackgroundフラグが立つと、
        #       背景が描画されなくなるので、paintEvent側で描画する。
        painter = QtGui.QPainter(self)
        painter.fillRect(0, 0, self.width(), self.height(), painter.background())

장점
특정 작은 위젯만 통과할 수 있습니다
결점
창의 Widget 전송은 윈도 Flags의 Frameless 윈도 Hint가 필요하기 때문에 제목 표시줄이 사라졌습니다

방법2 창에 투명도를 직접 적용

class Window(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        # ~中略~
        self.setWindowOpacity(0.5)
장점
투명성을 구현하는 간단한 방법
결점
Widget의 투명도는 개별적으로 설정할 수 없습니다.

끝맺다


채점 태그
레벨(5레벨)
추천도

난이도

집게
★★★★
통용성

콩나물도
★★★★

(위에서 설명한 가공된 이미지)
이번엔 사실 덮는 일과 다른 일에 해보고 싶다는 느낌을 조사했지만 안 돼...
먼저 PySide 2+Qt를 구축하고 QtWin 모듈을 추가하면 Win7 시대에 흔히 볼 수 있는 유리 프레임을 사용할 수 있다
위의 그림처럼 느껴지지만... 이번엔 그렇게 열정이 없어서...
뭐, 수법 1에 자기 작품 제목 표시줄만 추가하면 돼, 문제없어!!!(최선을 다해 패배를 인정하지 않는다)
그래서 개인적으로는 소화가 잘 안 돼요.
오늘의 보도는 여기까지입니다.
그럼 안녕!
그 일대의 말은 매주 토요일에 기사를 한 편 쓸 계획이다. 

좋은 웹페이지 즐겨찾기