使每个选项卡宽度相同且可扩展
Make every tab the same width and also expandable
我正在尝试实现类似浏览器选项卡的功能。所有选项卡必须具有相同的宽度并且还可以展开,因此当有很多选项卡时,它们需要调整大小并适合 window(完全像 Chrome 或 Firefox 那样)。
问题:
如果一个选项卡的文本比其他选项卡多,则该选项卡会更大。像这样:
如果我生成很多选项卡,它总是比其他选项卡大。
我试过的:
我尝试添加样式表来更改宽度,但如果我将宽度更改为特定数字,选项卡将是静态的,不会根据选项卡的数量调整大小以适应 window .我也尝试调整 min/max 宽度,弄乱 QSizePolicy,但没有机会。
我查看了 QT5 for C++ 的文档并在谷歌上搜索了很多,但没有地方谈论这个或任何关于这个的选项。
也许我需要在 python 中做一些计算并作为参数添加到样式表,但不确定如何做。也许我缺少一个简单的选项。
我的代码:(这是完整代码,有需要的可以复制粘贴测试)
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTabWidget,\
QVBoxLayout, QHBoxLayout, QSizePolicy
class Container(QWidget):
def __init__(self, text):
super(Container, self).__init__()
self.hbox = QHBoxLayout()
self.hbox.setSpacing(0)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.hbox)
self.button = QPushButton(text)
self.hbox.addWidget(self.button)
class CustomWidget (QWidget):
def __init__(self, parent=None):
super(CustomWidget, self).__init__(parent)
self.button = QPushButton("Add tab")
self.button.clicked.connect(self.buttonClicked)
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
self.tabs.setDocumentMode(True)
self.tabs.setElideMode(Qt.ElideRight)
self.tabs.setUsesScrollButtons(True)
self.tabs.tabCloseRequested.connect(self.closeTab)
self.tabs.addTab(Container("Very big titleeeeeeeeee"),
"Very big titleeeeeeeeeeee")
self.tabs.addTab(Container("smalltext"), "smalltext")
self.tabs.addTab(Container("smalltext2"), "smalltext2")
vbox = QVBoxLayout()
vbox.addWidget(self.button)
vbox.addWidget(self.tabs)
self.setLayout(vbox)
self.resize(600, 600)
def closeTab(self, index):
tab = self.tabs.widget(index)
tab.deleteLater()
self.tabs.removeTab(index)
def buttonClicked(self):
self.tabs.addTab(Container("smalltext2"), "smalltext2")
app = QApplication([])
app.setStyleSheet("""
QTabBar::tab {
background: lightgray;
color: black;
border: 0;
/* min-width: 100px; */
max-width: 200px;
/* width: 150px; */
height: 20px;
padding: 5px;
}
QTabBar::tab:selected {
background: gray;
color: white;
}
""")
widget = CustomWidget()
widget.show()
sys.exit(app.exec_())
其他信息:
操作系统:Windows10
Python版本:3.6.2
PyQt 版本:5.9.1
要为所有选项卡设置宽度,我们必须覆盖 tabSizeHint()
方法,在这种情况下,我们 return 所有选项卡的宽度相同。
class TabBar(QTabBar):
def tabSizeHint(self, index):
size = QTabBar.tabSizeHint(self, index)
w = int(self.width()/self.count())
return QSize(w, size.height())
分配此自定义选项卡栏后,我们使用 setTabBar()
method of QTabWidget
。
self.tabs = QTabWidget()
self.tabs.setTabBar(TabBar())
输出:
例子可以在下面找到link
我正在尝试实现类似浏览器选项卡的功能。所有选项卡必须具有相同的宽度并且还可以展开,因此当有很多选项卡时,它们需要调整大小并适合 window(完全像 Chrome 或 Firefox 那样)。
问题:
如果一个选项卡的文本比其他选项卡多,则该选项卡会更大。像这样:
如果我生成很多选项卡,它总是比其他选项卡大。
我试过的:
我尝试添加样式表来更改宽度,但如果我将宽度更改为特定数字,选项卡将是静态的,不会根据选项卡的数量调整大小以适应 window .我也尝试调整 min/max 宽度,弄乱 QSizePolicy,但没有机会。
我查看了 QT5 for C++ 的文档并在谷歌上搜索了很多,但没有地方谈论这个或任何关于这个的选项。
也许我需要在 python 中做一些计算并作为参数添加到样式表,但不确定如何做。也许我缺少一个简单的选项。
我的代码:(这是完整代码,有需要的可以复制粘贴测试)
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTabWidget,\
QVBoxLayout, QHBoxLayout, QSizePolicy
class Container(QWidget):
def __init__(self, text):
super(Container, self).__init__()
self.hbox = QHBoxLayout()
self.hbox.setSpacing(0)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.hbox)
self.button = QPushButton(text)
self.hbox.addWidget(self.button)
class CustomWidget (QWidget):
def __init__(self, parent=None):
super(CustomWidget, self).__init__(parent)
self.button = QPushButton("Add tab")
self.button.clicked.connect(self.buttonClicked)
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
self.tabs.setDocumentMode(True)
self.tabs.setElideMode(Qt.ElideRight)
self.tabs.setUsesScrollButtons(True)
self.tabs.tabCloseRequested.connect(self.closeTab)
self.tabs.addTab(Container("Very big titleeeeeeeeee"),
"Very big titleeeeeeeeeeee")
self.tabs.addTab(Container("smalltext"), "smalltext")
self.tabs.addTab(Container("smalltext2"), "smalltext2")
vbox = QVBoxLayout()
vbox.addWidget(self.button)
vbox.addWidget(self.tabs)
self.setLayout(vbox)
self.resize(600, 600)
def closeTab(self, index):
tab = self.tabs.widget(index)
tab.deleteLater()
self.tabs.removeTab(index)
def buttonClicked(self):
self.tabs.addTab(Container("smalltext2"), "smalltext2")
app = QApplication([])
app.setStyleSheet("""
QTabBar::tab {
background: lightgray;
color: black;
border: 0;
/* min-width: 100px; */
max-width: 200px;
/* width: 150px; */
height: 20px;
padding: 5px;
}
QTabBar::tab:selected {
background: gray;
color: white;
}
""")
widget = CustomWidget()
widget.show()
sys.exit(app.exec_())
其他信息:
操作系统:Windows10
Python版本:3.6.2
PyQt 版本:5.9.1
要为所有选项卡设置宽度,我们必须覆盖 tabSizeHint()
方法,在这种情况下,我们 return 所有选项卡的宽度相同。
class TabBar(QTabBar):
def tabSizeHint(self, index):
size = QTabBar.tabSizeHint(self, index)
w = int(self.width()/self.count())
return QSize(w, size.height())
分配此自定义选项卡栏后,我们使用 setTabBar()
method of QTabWidget
。
self.tabs = QTabWidget()
self.tabs.setTabBar(TabBar())
输出:
例子可以在下面找到link