我有一个应用程序,我想让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 顶部对齐。有趣的是,每当窗口调整大小时,选项卡似乎会快速在顶部之间切换。
我查看了以下内容:
- Qt 在不同的 QLayout 中使用 QTabBar
- http://doc.qt.io/qt-5/stylesheet-examples.html
- https://wiki.qt.io/Adjust_Spacing_and_Margins_between_Widgets_in_Layout
更新: 我可以通过将 QTabBar 的 minimumSizeHint() 设置为 (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的顶部留下一个空白空间。我可以在setShape之前使用setTabPosition将该空间移至右侧,但这并没有解决真正消除它的问题。