Python PyQT5 QTabar展开选项卡标题
我正在编写一个只有两个选项卡的QTabwidget。但是选项卡标题(名称)不适合QTabwidget宽度。我想适应选项卡栏的长度(两个选项卡标题) 受此启发,我认为您可以覆盖Python PyQT5 QTabar展开选项卡标题,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我正在编写一个只有两个选项卡的QTabwidget。但是选项卡标题(名称)不适合QTabwidget宽度。我想适应选项卡栏的长度(两个选项卡标题) 受此启发,我认为您可以覆盖showEvent(甚至resizeEvent)来计算新的宽度并通过样式表进行设置 它不是规范的,但它确实起到了作用 导入系统 从PyQt5.qtwidts导入QMainWindow、QApplication、QWidget、QTabWidget、QVBoxLayout 类应用程序(QMainWindow): 定义初始化(自
showEvent
(甚至resizeEvent
)来计算新的宽度并通过样式表进行设置
它不是规范的,但它确实起到了作用
导入系统
从PyQt5.qtwidts导入QMainWindow、QApplication、QWidget、QTabWidget、QVBoxLayout
类应用程序(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.table_widget=MyTableWidget(self)
self.setCentralWidget(self.table_小部件)
self.show()
类MyTableWidget(QWidget):
定义初始化(自身,父级):
超级(QWidget,self)。\uuuuu初始化\uuuuuuuuuu(父级)
self.layout=QVBoxLayout(self)
self.tabs=QTabWidget()
self.tabs.tabBar().setExpansing(True)
self.tab1=QWidget()
self.tab2=QWidget()
self.tabs.resize(300200)
self.tabs.addTab(self.tab1,“tab1”)
self.tabs.addTab(self.tab2,“tab2”)
#创建第一个选项卡
self.tab1.layout=QVBoxLayout(self)
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def resizeEvent(自我,事件):
super().resizeEvent(事件)
self.\u set\u tabs\u width()
def showEvent(自我、事件):
super().showEvent(事件)
self.\u set\u tabs\u width()
定义设置标签宽度(自):
tabs\u count=self.tabs.count()
tabs\u width=self.tabs.width()
制表符宽度=制表符宽度/制表符计数
css=“QTabBar::tab{width:%spx;}”%tab\u width
self.tabs.setStyleSheet(css)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
ex=App()
sys.exit(app.exec_())
选项卡的大小是使用当前QStyle给出的提示计算的 由于QTabWidget使用选项卡栏的sizeHint来设置选项卡栏大小,并且sizeHint通常基于,因此您必须重新实现这两个功能:
- sizeHint()是必需的,以便提供与父级相同的宽度(或高度)李>
- tabSizeHint()考虑sizeHint()的基本实现,根据选项卡的内容计算提示,如果小于当前大小,则建议使用可用空间除以选项卡计数的大小李>
类选项卡栏(qtwidts.qtabar):
def sizeHint(自身):
hint=super().sizeHint()
如果self.isVisible()和self.parent():
如果不是self.shape()&self.RoundedEast:
#水平的
hint.setWidth(self.parent().width())
其他:
#垂直的
hint.setHeight(self.parent().height())
返回提示
def tabSizeHint(自身,索引):
hint=super().tabSizeHint(索引)
如果不是self.shape()&self.RoundedEast:
averageSize=self.width()/self.count()
如果super().sizeHint().width()
请注意,这是一个非常基本的实现,在某些情况下,您可能会看到具有很长选项卡名称的滚动按钮,即使理论上应该有足够的空间来查看它们。请参阅QTabar(您可以使用tab小部件上的
tabBar()
来获得它。我已经尝试过这个,self.tabs.tabBar().setExpansing(对),但没有起作用
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget,QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
class App(QMainWindow):
def __init__(self):
super().__init__()
self.table_widget = MyTableWidget(self)
self.setCentralWidget(self.table_widget)
self.show()
class MyTableWidget(QWidget):
def __init__(self, parent):
super(QWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
self.tabs = QTabWidget()
""" Here I want to fit the two tab
headers withthe QTabwidget width
"""
self.tab1 = QWidget()
self.tab2 = QWidget()
self.tabs.resize(300,200)
self.tabs.addTab(self.tab1,"Tab 1")
self.tabs.addTab(self.tab2,"Tab 2")
# Create first tab
self.tab1.layout = QVBoxLayout(self)
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
class TabBar(QtWidgets.QTabBar):
def sizeHint(self):
hint = super().sizeHint()
if self.isVisible() and self.parent():
if not self.shape() & self.RoundedEast:
# horizontal
hint.setWidth(self.parent().width())
else:
# vertical
hint.setHeight(self.parent().height())
return hint
def tabSizeHint(self, index):
hint = super().tabSizeHint(index)
if not self.shape() & self.RoundedEast:
averageSize = self.width() / self.count()
if super().sizeHint().width() < self.width() and hint.width() < averageSize:
hint.setWidth(averageSize)
else:
averageSize = self.height() / self.count()
if super().sizeHint().height() < self.height() and hint.height() < averageSize:
hint.setHeight(averageSize)
return hint
# ...
self.tabWidget = QtWidgets.QTabWidget()
self.tabWidget.setTabBar(TabBar(self.tabWidget))