72 lines
No EOL
2 KiB
Markdown
72 lines
No EOL
2 KiB
Markdown
# 无边框自定义标题栏窗口
|
||
|
||
### [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) |