我有一个应用程序,我希望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 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; }来模仿我想要的行为,但这实际上不允许我单击选项卡。由于某些原因,选项卡下面(即右边)有一个空格,我不知道如何消除它。

    第二次更新:我已经确定了我认为的主要问题。我的代码使用
            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将空间移到右侧,但这并不能解决实际上摆脱它的问题。

    最佳答案

    我无法弄清楚如何隐藏空白空间,所以我只使用了一个非常容易实现的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)
    

    关于python - 从QLayout中的QTabBar删除填充/边距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30049375/

    10-13 06:50