因開發界面需要,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中美化和裝扮圖形界面