从 QLayout 中的 QTabBar 中删除 padding/margin
remove padding/margin from QTabBar in QLayout
我有一个应用程序,我希望 QTabBar 位于与 QTabWidget 区域不同的 VBoxLayout 中。它可以使用下面的代码工作,但我遇到了样式问题。在我将 QTabBar 与 QTabWidget 分开之前我没有任何问题,但现在我不知道如何按照我想要的方式设置它的样式。
#!/usr/bin/env python2
from PyQt4 import QtGui, QtCore
from peaks import *
class mainWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setWindowFlags(QtCore.Qt.Dialog)
self.tabWidget = QtGui.QTabWidget()
self.tabBar = QtGui.QTabBar()
self.tabBar.setContentsMargins(0,0,0,0)
self.tabWidget.setTabBar(self.tabBar)
self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
self.tabWidget.setIconSize(QtCore.QSize(35, 35))
self.tab1 = QtGui.QWidget()
self.tab2 = QtGui.QWidget()
tabLayoutBox = QtGui.QVBoxLayout()
tabLayoutBox.setContentsMargins(0,0,0,0)
tabLayoutBox.addWidget(self.tabBar)
mainHBox = QtGui.QHBoxLayout()
mainHBox.setContentsMargins(0,0,0,0)
mainHBox.setSpacing(0)
mainHBox.setMargin(0)
mainHBox.addLayout(tabLayoutBox)
mainHBox.addWidget(self.tabWidget)
mainVBox = QtGui.QVBoxLayout()
mainVBox.addWidget(QtGui.QWidget())
mainVBox.addLayout(mainHBox)
self.setLayout(mainVBox)
self.tabWidget.addTab(self.tab1, 'tab1')
self.tabWidget.addTab(self.tab2, 'tab2')
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
app.setStyleSheet(
"QTabBar { alignment: right; }"
"QTabBar::tear { width:0; border: none; }"
"QTabBar::scroller { width:0; border: none; }"
)
main = mainWindow()
main.show()
sys.exit(app.exec_())
然而,有几件事我想要,但我不知道该怎么做:
我想消除 QTabWidget 和 QTabBar 之间的差距。我一直在尝试各种方法,例如 setContentsMargins(0,0,0,0)
和设置样式表,但我尝试过的都没有用。
我希望 QTabBar 与 QTabWidget 的顶部齐平。有趣的是,每当 window 调整大小时,选项卡似乎会在顶部之间快速来回切换。
我看过的东西:
- Qt Use QTabBar in a Different QLayout
- http://doc.qt.io/qt-5/stylesheet-examples.html
- https://wiki.qt.io/Adjust_Spacing_and_Margins_between_Widgets_in_Layout
更新: 我可以通过将 QTabBar miminumSizeHint() 设置为 (15,15) 并设置 QTabBar::tab { margin-right: -15px; }
来模拟我想要的行为,但这不允许我实际上单击选项卡。出于某种原因,选项卡下方(即右侧)有一个 space,我不知道如何摆脱它。
第二次更新: 我已经确定了我认为的主要问题。我的代码使用
self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
将选项卡移动到左侧,但 QTabWidget 假定那里有一个 tabBar,因此额外 space。如果我这样做
self.tabWidget.setTabPosition(QtGui.QTabWidget.East)
空白 space 出现在右侧。所以我能做的一件事就是直接在 tabBar 上设置 tabShape:
self.tabBar.setShape(QtGui.QTabBar.RoundedWest)
然而,这会在 QTabWidget 期望 QTabBar 所在的顶部留下空白 space。我可以在 setShape
之前使用 setTabPosition
将 space 向右移动,但这并不能解决实际摆脱它的问题。
我无法弄清楚如何隐藏空的 space 所以我只是使用一个非常容易实现的 QTabBar + QStackedWidget。为了使一个像 QTabWidget 一样,您需要做的就是将 QTabBar.currentChanged
连接到 QStackedWidget.setCurrentIndex
:
self.stacked = QtGui.QStackedWidget()
self.tabBar = QtGui.QTabBar()
self.tabBar.currentChanged.connect(self.stacked.setCurrentIndex)
self.tabBar.setShape(QtGui.QTabBar.RoundedWest)
self.tabBar.updateGeometry()
self.tabBar.setContentsMargins(0,0,0,0)
我还写了一个方便的函数来模拟 QTabWidget.addTab
:
def addTab(self, widget, name):
self.stacked.addWidget(widget)
self.tabBar.addTab(name)
您的问题是您通过将标签栏添加到布局来覆盖标签栏定位。
当您使用线条时,选项卡栏不再出现在选项卡小部件中。
tabLayoutBox = QtGui.QVboxLayout()
tabLayoutBox.addWidget(self.tabBar)
这些行重新设置标签栏的父级。看起来您只想使用 setTabPosition() 而不是创建自己的标签栏。您不需要设置新的标签栏,除非您创建了自定义标签栏 class 并想使用它。
我不知道您为什么要在单独的布局中使用它,但另一个选项是使用
tabLayoutBox.setSpacing(0)
这是小部件之间用于分隔它们的间距。该间距用于小部件。您在布局中有布局,因此 setSpacing(0) 可能不适用于布局上的间距。如果不是,您可能需要子 class QVBoxLayout 并创建您自己的布局。
编辑
我发现 insertSpacing 效果更好。
mainHBox.insertSpacing(1, -25)
我有一个应用程序,我希望 QTabBar 位于与 QTabWidget 区域不同的 VBoxLayout 中。它可以使用下面的代码工作,但我遇到了样式问题。在我将 QTabBar 与 QTabWidget 分开之前我没有任何问题,但现在我不知道如何按照我想要的方式设置它的样式。
#!/usr/bin/env python2
from PyQt4 import QtGui, QtCore
from peaks import *
class mainWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setWindowFlags(QtCore.Qt.Dialog)
self.tabWidget = QtGui.QTabWidget()
self.tabBar = QtGui.QTabBar()
self.tabBar.setContentsMargins(0,0,0,0)
self.tabWidget.setTabBar(self.tabBar)
self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
self.tabWidget.setIconSize(QtCore.QSize(35, 35))
self.tab1 = QtGui.QWidget()
self.tab2 = QtGui.QWidget()
tabLayoutBox = QtGui.QVBoxLayout()
tabLayoutBox.setContentsMargins(0,0,0,0)
tabLayoutBox.addWidget(self.tabBar)
mainHBox = QtGui.QHBoxLayout()
mainHBox.setContentsMargins(0,0,0,0)
mainHBox.setSpacing(0)
mainHBox.setMargin(0)
mainHBox.addLayout(tabLayoutBox)
mainHBox.addWidget(self.tabWidget)
mainVBox = QtGui.QVBoxLayout()
mainVBox.addWidget(QtGui.QWidget())
mainVBox.addLayout(mainHBox)
self.setLayout(mainVBox)
self.tabWidget.addTab(self.tab1, 'tab1')
self.tabWidget.addTab(self.tab2, 'tab2')
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
app.setStyleSheet(
"QTabBar { alignment: right; }"
"QTabBar::tear { width:0; border: none; }"
"QTabBar::scroller { width:0; border: none; }"
)
main = mainWindow()
main.show()
sys.exit(app.exec_())
然而,有几件事我想要,但我不知道该怎么做:
我想消除 QTabWidget 和 QTabBar 之间的差距。我一直在尝试各种方法,例如
setContentsMargins(0,0,0,0)
和设置样式表,但我尝试过的都没有用。我希望 QTabBar 与 QTabWidget 的顶部齐平。有趣的是,每当 window 调整大小时,选项卡似乎会在顶部之间快速来回切换。
我看过的东西:
- Qt Use QTabBar in a Different QLayout
- http://doc.qt.io/qt-5/stylesheet-examples.html
- https://wiki.qt.io/Adjust_Spacing_and_Margins_between_Widgets_in_Layout
更新: 我可以通过将 QTabBar miminumSizeHint() 设置为 (15,15) 并设置 QTabBar::tab { margin-right: -15px; }
来模拟我想要的行为,但这不允许我实际上单击选项卡。出于某种原因,选项卡下方(即右侧)有一个 space,我不知道如何摆脱它。
第二次更新: 我已经确定了我认为的主要问题。我的代码使用
self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
将选项卡移动到左侧,但 QTabWidget 假定那里有一个 tabBar,因此额外 space。如果我这样做
self.tabWidget.setTabPosition(QtGui.QTabWidget.East)
空白 space 出现在右侧。所以我能做的一件事就是直接在 tabBar 上设置 tabShape:
self.tabBar.setShape(QtGui.QTabBar.RoundedWest)
然而,这会在 QTabWidget 期望 QTabBar 所在的顶部留下空白 space。我可以在 setShape
之前使用 setTabPosition
将 space 向右移动,但这并不能解决实际摆脱它的问题。
我无法弄清楚如何隐藏空的 space 所以我只是使用一个非常容易实现的 QTabBar + QStackedWidget。为了使一个像 QTabWidget 一样,您需要做的就是将 QTabBar.currentChanged
连接到 QStackedWidget.setCurrentIndex
:
self.stacked = QtGui.QStackedWidget()
self.tabBar = QtGui.QTabBar()
self.tabBar.currentChanged.connect(self.stacked.setCurrentIndex)
self.tabBar.setShape(QtGui.QTabBar.RoundedWest)
self.tabBar.updateGeometry()
self.tabBar.setContentsMargins(0,0,0,0)
我还写了一个方便的函数来模拟 QTabWidget.addTab
:
def addTab(self, widget, name):
self.stacked.addWidget(widget)
self.tabBar.addTab(name)
您的问题是您通过将标签栏添加到布局来覆盖标签栏定位。
当您使用线条时,选项卡栏不再出现在选项卡小部件中。
tabLayoutBox = QtGui.QVboxLayout()
tabLayoutBox.addWidget(self.tabBar)
这些行重新设置标签栏的父级。看起来您只想使用 setTabPosition() 而不是创建自己的标签栏。您不需要设置新的标签栏,除非您创建了自定义标签栏 class 并想使用它。
我不知道您为什么要在单独的布局中使用它,但另一个选项是使用
tabLayoutBox.setSpacing(0)
这是小部件之间用于分隔它们的间距。该间距用于小部件。您在布局中有布局,因此 setSpacing(0) 可能不适用于布局上的间距。如果不是,您可能需要子 class QVBoxLayout 并创建您自己的布局。
编辑
我发现 insertSpacing 效果更好。
mainHBox.insertSpacing(1, -25)