Skip to content

Commit 0f20306

Browse files
committed
Tab角落控件位置占满
1 parent 817db1b commit 0f20306

File tree

5 files changed

+109
-1
lines changed

5 files changed

+109
-1
lines changed

QProxyStyle/Lib/TabCornerStyle.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
"""
5+
Created on 2021年06月23日
6+
@author: Irony
7+
@site: https://pyqt.site , https://github.com/PyQt5
8+
9+
@file: TabCornerStyle
10+
@description:
11+
"""
12+
from PyQt5.QtCore import QRect
13+
from PyQt5.QtWidgets import QProxyStyle, QStyle
14+
15+
16+
class TabCornerStyle(QProxyStyle):
17+
18+
def subElementRect(self, element, option, widget):
19+
try:
20+
rect = super(TabCornerStyle, self).subElementRect(element, option, widget)
21+
if element == QStyle.SE_TabWidgetRightCorner and rect.isValid():
22+
# 标签tab的矩形范围
23+
tab_rect = self.subElementRect(QStyle.SE_TabWidgetTabBar, option, widget)
24+
# 内容面板的矩形范围
25+
panel_rect = self.subElementRect(QStyle.SE_TabWidgetTabPane, option, widget)
26+
ext_height = 2 * self.pixelMetric(QStyle.PM_TabBarBaseHeight, option, widget)
27+
# 修正过后填充的矩形范围
28+
cor_rect = QRect(tab_rect.x() + tab_rect.width() + ext_height, tab_rect.y() + ext_height,
29+
panel_rect.width() - tab_rect.width() - 2 * ext_height,
30+
tab_rect.height() - 2 * ext_height)
31+
return cor_rect
32+
return rect
33+
except Exception as e:
34+
print(e)
35+
return QRect()

QProxyStyle/README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- 目录
44
- [QTabWidget Tab文字方向](#1qtabwidget-tab文字方向)
5+
- [QTabWidget 角落控件位置](#2qtabwidget-角落控件位置)
56

67
## 1、QTabWidget Tab文字方向
78
[运行 TabTextDirection.py](TabTextDirection.py)
@@ -10,4 +11,15 @@
1011
2. `sizeFromContents` 转置size
1112
3. `drawControl` 绘制文字
1213

13-
![TabTextDirection](ScreenShot/TabTextDirection.png)
14+
![TabTextDirection](ScreenShot/TabTextDirection.png)
15+
16+
## 2、QTabWidget 角落控件位置
17+
[运行 TabCornerWidget.py](TabCornerWidget.py)
18+
19+
1. 通过 `app.setStyle(TabCornerStyle())` 设置代理样式
20+
2. `setCornerWidget` 设置自定义角落控件
21+
22+
原理是通过代理样式中对 `SE_TabWidgetRightCorner` 计算的结果进行校正,使得角落控件占满右边空白位置,
23+
然后再配合自定义控件中使用 `QSpacerItem` 占据右边位置使得 + 号按钮居左,表现效果为 + 号按钮跟随标签的增加和减少
24+
25+
![TabCornerStyle](ScreenShot/TabCornerStyle.png)
20.8 KB
Loading

QProxyStyle/TabCornerWidget.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
"""
5+
Created on 2021年06月23日
6+
@author: Irony
7+
@site: https://pyqt.site , https://github.com/PyQt5
8+
9+
@file: TabCornerWidget
10+
@description:
11+
"""
12+
from PyQt5.QtCore import pyqtSignal, Qt
13+
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QSpacerItem, QSizePolicy, \
14+
QTabWidget
15+
16+
from QProxyStyle.Lib.TabCornerStyle import TabCornerStyle
17+
18+
19+
class TabCornerWidget(QWidget):
20+
signalTabAdd = pyqtSignal()
21+
22+
def __init__(self, *args, **kwargs):
23+
super(TabCornerWidget, self).__init__(*args, **kwargs)
24+
layout = QHBoxLayout(self)
25+
layout.setContentsMargins(0, 0, 0, 0)
26+
self.buttonAdd = QPushButton('+', self, toolTip='添加新标签页', clicked=self.signalTabAdd.emit)
27+
layout.addWidget(self.buttonAdd)
28+
layout.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
29+
30+
def resizeEvent(self, event):
31+
super(TabCornerWidget, self).resizeEvent(event)
32+
# 更新按钮高度
33+
if hasattr(self, 'buttonAdd'):
34+
self.buttonAdd.setFixedSize(self.height(), self.height())
35+
36+
37+
if __name__ == '__main__':
38+
import sys
39+
40+
app = QApplication(sys.argv)
41+
app.setStyle(TabCornerStyle())
42+
43+
tab1 = QTabWidget()
44+
cor1 = TabCornerWidget(tab1)
45+
cor1.signalTabAdd.connect(lambda: tab1.addTab(QWidget(tab1), 'tab' + str(tab1.count() + 1)))
46+
tab1.setCornerWidget(cor1, Qt.TopRightCorner)
47+
tab1.show()
48+
49+
tab2 = QTabWidget()
50+
tab2.setTabPosition(QTabWidget.South) # tab 标签方向
51+
cor2 = TabCornerWidget(tab2)
52+
cor2.signalTabAdd.connect(lambda: tab2.addTab(QWidget(tab2), 'tab' + str(tab2.count() + 1)))
53+
tab2.setCornerWidget(cor2, Qt.BottomRightCorner)
54+
tab2.show()
55+
56+
for i in range(10):
57+
tab1.addTab(QWidget(tab1), 'tab' + str(i + 1))
58+
tab2.addTab(QWidget(tab1), 'tab' + str(i + 1))
59+
60+
sys.exit(app.exec_())

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ https://pyqt.site 论坛是专门针对PyQt5学习和提升开设的网站,分
222222
- [串口调试小助手](QSerialPort/SerialDebugAssistant.py)
223223
- [QProxyStyle](QProxyStyle)
224224
- [Tab文字方向](QProxyStyle/TabTextDirection.py)
225+
- [Tab角落控件位置占满](QProxyStyle/TabCornerWidget.py)
225226
- [QMessageBox](QMessageBox)
226227
- [消息对话框倒计时关闭](QMessageBox/CountDownClose.py)
227228
- [自定义图标等](QMessageBox/CustomColorIcon.py)

0 commit comments

Comments
 (0)