python qt5自定義無標題欄、窗口拖動、關閉、最小化

因開發界面需要,Qtdesigner設計的原始界面實在有點兒太傳統了,有點不堪入目,哈哈哈哈哈,這裏做一次記錄。

一、窗口設計無標題欄,基礎美化過程

下面這裏是窗口設計界面

# coding:utf-8

from PyQt5 import QtCore,QtGui,QtWidgets
import sys

class MainUi(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setFixedSize(960,700)
        self.main_widget = QtWidgets.QWidget()  # 創建窗口主部件
        self.main_layout = QtWidgets.QGridLayout()  # 創建主部件的網格佈局
        self.main_widget.setLayout(self.main_layout)  # 設置窗口主部件佈局爲網格佈局

        self.left_widget = QtWidgets.QWidget()  # 創建左側部件
        self.left_widget.setObjectName('left_widget')
        self.left_layout = QtWidgets.QGridLayout()  # 創建左側部件的網格佈局層
        self.left_widget.setLayout(self.left_layout) # 設置左側部件佈局爲網格

        self.right_widget = QtWidgets.QWidget() # 創建右側部件
        self.right_widget.setObjectName('right_widget')
        self.right_layout = QtWidgets.QGridLayout()
        self.right_widget.setLayout(self.right_layout) # 設置右側部件佈局爲網格

        self.main_layout.addWidget(self.left_widget,0,0,12,2) # 左側部件在第0行第0列,佔8行3列
        self.main_layout.addWidget(self.right_widget,0,2,12,10) # 右側部件在第0行第3列,佔8行9列
        self.setCentralWidget(self.main_widget) # 設置窗口主部件

def main():
    app = QtWidgets.QApplication(sys.argv)
    gui = MainUi()
    gui.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

下面是關閉、最小化、最大化按鈕

self.left_close = QtWidgets.QPushButton("") # 關閉按鈕
self.left_visit = QtWidgets.QPushButton("") # 空白按鈕
self.left_mini = QtWidgets.QPushButton("")  # 最小化按鈕
self.left_layout.addWidget(self.left_mini, 0, 0,1,1)
self.left_layout.addWidget(self.left_close, 0, 2,1,1)
self.left_layout.addWidget(self.left_visit, 0, 1, 1, 1)
self.left_close.setFixedSize(15,15) # 設置關閉按鈕的大小
self.left_visit.setFixedSize(15, 15)  # 設置按鈕大小
self.left_mini.setFixedSize(15, 15) # 設置最小化按鈕大小
self.left_close.setStyleSheet('''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
self.left_visit.setStyleSheet('''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
self.left_mini.setStyleSheet('''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')

下面是窗口透明和去除邊框

self.setWindowOpacity(0.9) # 設置窗口透明度
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 設置窗口背景透明
self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隱藏邊框

爲了避免隱藏窗口邊框後,左側部件沒有背景顏色和邊框顯示,我們再對左側部件添加QSS屬性:

QWidget#left_widget{
    background:gray;
    border-top:1px solid white;
    border-bottom:1px solid white;
    border-left:1px solid white;
    border-top-left-radius:10px;
    border-bottom-left-radius:10px;
}

我們發現圖形界面中左側部件和右側部件中有一條縫隙,我們通過設置佈局內部件的間隙來把那條縫隙去除掉:

self.main_layout.setSpacing(0)

二、窗口拖動、關閉、最小化代碼實現

此處最大化功能就不寫了,一般情況下用不到,設計一個最大化按鈕僅做美化就足矣

def left_close_click(self): #關閉按鈕單擊事件
        exit()
    def left_mini_click(self): #最小化按鈕單擊事件
        self.showMinimized()
    def left_visit_click(self): #最大化按鈕單擊事件
        pass
def mousePressEvent(self, event): #鼠標拖拽窗口移動
        if event.button() == Qt.LeftButton:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()  # 獲取鼠標相對窗口的位置
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠標圖標
    def mouseMoveEvent(self, QMouseEvent): #鼠標拖拽窗口移動
        if Qt.LeftButton and self.m_flag:
            self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置
            QMouseEvent.accept()
    def mouseReleaseEvent(self, QMouseEvent): #鼠標拖拽窗口移動
        self.m_flag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

參考文章:Python GUI教程(十六):在PyQt5中美化和裝扮圖形界面

文章首發於州的先生博客 https://zmister.com 及州的先生微信公衆號(ID:zmister2016)
轉載務必保留原文鏈接 Python GUI教程(十六):在PyQt5中美化和裝扮圖形界面
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章