2018-08-02 00:46:44 +08:00
|
|
|
|
# 无边框自定义标题栏窗口
|
|
|
|
|
|
|
|
|
|
### [Python3.4.4 or Python3.5][PyQt5]
|
|
|
|
|
|
|
|
|
|
原理说明:
|
|
|
|
|
|
|
|
|
|
- 使用一个QWidget(FramelessWindow)作为父窗口, 一个TitleBar作为标题栏, 一个QWidget作为底部容器
|
|
|
|
|
- 父窗口FramelessWindow设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小)
|
|
|
|
|
- TitleBar的最小化最大化关闭等按钮事件关联到父窗口里
|
|
|
|
|
- TitleBar中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动
|
|
|
|
|
|
|
|
|
|
使用方法:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
class MainWindow(QWidget):
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super(MainWindow, self).__init__(*args, **kwargs)
|
|
|
|
|
layout = QVBoxLayout(self, spacing=0)
|
|
|
|
|
layout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
|
layout.addWidget(QPushButton('按钮', self))
|
|
|
|
|
layout.addWidget(QTextEdit(self))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 样式
|
|
|
|
|
StyleSheet = """
|
|
|
|
|
/*标题栏*/
|
|
|
|
|
TitleBar {
|
|
|
|
|
background-color: rgb(54, 157, 180);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*最小化最大化关闭按钮通用默认背景*/
|
|
|
|
|
#buttonMinimum,#buttonMaximum,#buttonClose {
|
|
|
|
|
border: none;
|
|
|
|
|
background-color: rgb(54, 157, 180);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*悬停*/
|
|
|
|
|
#buttonMinimum:hover,#buttonMaximum:hover {
|
|
|
|
|
background-color: rgb(48, 141, 162);
|
|
|
|
|
}
|
|
|
|
|
#buttonClose:hover {
|
|
|
|
|
color: white;
|
|
|
|
|
background-color: rgb(232, 17, 35);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*鼠标按下不放*/
|
|
|
|
|
#buttonMinimum:pressed,#buttonMaximum:pressed {
|
|
|
|
|
background-color: rgb(44, 125, 144);
|
|
|
|
|
}
|
|
|
|
|
#buttonClose:pressed {
|
|
|
|
|
color: white;
|
|
|
|
|
background-color: rgb(161, 73, 92);
|
|
|
|
|
}
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
import sys
|
|
|
|
|
from PyQt5.QtWidgets import QApplication
|
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
|
app.setStyleSheet(StyleSheet)
|
|
|
|
|
w = FramelessWindow()
|
|
|
|
|
w.setWindowTitle('测试标题栏')
|
|
|
|
|
w.setWindowIcon(QIcon('Qt.ico'))
|
|
|
|
|
w.setWidget(MainWindow(w)) # 把自己的窗口添加进来
|
|
|
|
|
w.show()
|
|
|
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 截图
|
|
|
|
|
![截图](ScreenShot/1.gif)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 利用windows api
|
|
|
|
|
|
|
|
|
|
原理说明:
|
|
|
|
|
|
|
|
|
|
- 使用win32gui设置薄边框
|
|
|
|
|
- 重写nativeEvent事件拦截边框的系统边框的显示,并返回各个方向
|
|
|
|
|
|
|
|
|
|
## 截图
|
|
|
|
|
![截图](ScreenShot/1.jpg)
|
|
|
|
|
|
2018-08-02 00:50:47 +08:00
|
|
|
|
![截图](ScreenShot/2.jpg)
|
2018-08-02 00:46:44 +08:00
|
|
|
|
|
|
|
|
|
![截图](ScreenShot/3.gif)
|