我有一个应用程序,我希望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的顶部齐平。有趣的是,每当调整窗口大小时,标签似乎会在顶部之间快速切换。
我看过的东西:
更新:我可以通过将QTabBar miminumSizeHint()设置为(15,15)并设置QTabBar::tab { margin-right: -15px; }
来模拟我想要的行为,但这并不能让我实际点击标签。由于某种原因,标签下方(即右侧)有一个空格,我不知道如何摆脱它。
第二次更新:我已经确定了我认为的主要问题。我的代码使用
self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
将选项卡移动到左侧,但QTabWidget假定那里有tabBar,因此有额外的空间。如果我做
self.tabWidget.setTabPosition(QtGui.QTabWidget.East)
该空白区域显示在右侧。所以我可以做的一件事是直接在tabBar上设置tabShape:
self.tabBar.setShape(QtGui.QTabBar.RoundedWest)
但是这会在QTabWidget期望QTabBar的顶部留下一个空白区域。我可以在setTabPosition
之前使用setShape
向右移动该空格,但这并不能解决实际摆脱它的问题。
答案 0 :(得分:2)
我无法弄清楚如何隐藏空白空间,所以我只是使用QTabBar + QStackedWidget,这很容易实现。为了使QTabWidget像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)
答案 1 :(得分:0)
您的问题是您通过将标签栏添加到布局来覆盖标签栏定位。
使用这些行时,标签栏不再位于标签窗口小部件中。
tabLayoutBox = QtGui.QVboxLayout()
tabLayoutBox.addWidget(self.tabBar)
这些行重新显示标签栏。看起来你只想使用setTabPosition()而不是创建自己的标签栏。除非您创建自定义标签栏类并想要使用它,否则您不需要设置新的标签栏。
我不知道为什么你会想要它在一个单独的布局中,但另一个选择是使用
tabLayoutBox.setSpacing(0)
这是小部件之间的间距以分隔它们。该间距适用于小部件。布局中有布局,因此setSpacing(0)可能不适用于布局上的间距。如果不是,您可能需要对QVBoxLayout进行子类化并创建自己的布局。
修改强>
我发现insertSpacing工作得更好。
mainHBox.insertSpacing(1, -25)