1. 程式人生 > 其它 >PyQt5入門(二十五)異形視窗

PyQt5入門(二十五)異形視窗

技術標籤:PyQt5pyqt5異形視窗

一.實現不規則視窗(異形視窗)

通過mask實現異形視窗

需要一張透明的png圖,透明部分被扣出,形成一個非矩形的區域

程式碼:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class AbnormityWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("異形視窗")
        self.pix = QBitmap('../picture/images/mask.png')
        self.resize(self.pix.size())
        #設定掩膜,視窗就是掩膜的形狀
        self.setMask(self.pix)

    def paintEvent(self, event):
        painter=QPainter(self)
        painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap('../picture/images/screen1.jpg'))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = AbnormityWindow()
    form.show()
    sys.exit(app.exec_())

執行結果:

可見視窗成了掩膜的形狀。

掩膜圖片: 視窗圖片:

執行出的視窗:

二.移動和關閉不規則視窗(異形視窗)

pyqt5中的座標系

程式碼:

結合程式碼看移動距離

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class AbnormityWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("異形視窗")
        self.pix = QBitmap('../picture/images/mask.png')
        self.resize(self.pix.size())
        self.setMask(self.pix)

    #滑鼠按下
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            #滑鼠按下或抬起標誌位
            self.m_drag = True
            #當前單擊點相對於視窗本身的座標,永遠是正的
            self.m_DragPosition = event.globalPos() - self.pos()
            #print(self.m_DragPosition)
            #設定游標形狀
            self.setCursor(QCursor(Qt.OpenHandCursor))
            '''
            # 當前單擊點相對於螢幕的座標,包括標題欄和邊框
            print(event.globalPos())
            # 當前單擊點相對於視窗的座標,忽略標題欄和邊框
            print(event.pos())
            '''
            # 左上角座標相對於螢幕的座標,包括標題欄和邊框
            print(self.pos())
        #按下右鍵
        if event.button() == Qt.RightButton:
            self.close()


    #滑鼠移動
    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            # 當左鍵移動窗體修改偏移值
            # QPoint
            '''
            實時計算視窗左上角座標,注意是左上角!!!!!!
            這個移動是從上次的視窗位置往現在到達的位置移動,
            所以是現在的globalPos()減去移動之前的單擊點到視窗邊框的距離,就是當前左上角座標
            '''
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)


    #滑鼠抬起
    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        #cursor(n.)游標
        self.setCursor(QCursor(Qt.ArrowCursor))


    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap('../picture/images/screen1.jpg'))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = AbnormityWindow()
    form.show()
    sys.exit(app.exec_())

執行結果:

介面和上面一樣,就是左鍵按住可以拖動,單擊右鍵可以關閉視窗。

三. 實現異形視窗動畫效果

這塊有點繞腦子,我先休息會。

程式碼:

執行結果:

這玩意一直在旋轉。自己試試吧。