【问题标题】:remove padding/margin from QTabBar in QLayout从 QLayout 中的 QTabBar 中删除填充/边距
【发布时间】:2015-07-14 23:23:40
【问题描述】:

我有一个应用程序,我希望 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 所在的顶部留下一个空白区域。我可以在setShape 之前使用setTabPosition 将该空间向右移动,但这并不能解决实际摆脱它的问题。

【问题讨论】:

    标签: python qt pyqt4 pyqt5 qtstylesheets


    【解决方案1】:

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

    【讨论】:

    • 这将是我在没有得到任何其他答案后接受的答案,但我不能再选择它作为我的答案 16 小时,它说。我也可以删除这个问题,因为这只是我自言自语,但我认为其他人也可以从中得到一些东西。
    • 您能否编辑此内容以详细说明解决方法。
    • 这可能是最灵活的方法,并且肯定是该问题的有效答案。不过,它确实需要更多解释(或者可能只是一些简单的示例代码)。
    【解决方案2】:

    您的问题是您通过将标签栏添加到布局来覆盖标签栏的位置。

    当您使用线条时,标签栏不再位于标签小部件中。

    tabLayoutBox = QtGui.QVboxLayout()
    tabLayoutBox.addWidget(self.tabBar)
    

    这些行重新设置标签栏。看起来您只想使用 setTabPosition() 而不是创建自己的标签栏。除非您创建自定义标签栏类并希望使用它,否则无需设置新标签栏。

    我不知道你为什么希望它在一个单独的布局中,但另一个选项是使用

    tabLayoutBox.setSpacing(0)
    

    这是小部件之间用于分隔它们的间距。该间距适用于小部件。您在布局中有一个布局,因此 setSpacing(0) 可能不适用于布局上的间距。如果不是,您可能必须继承 QVBoxLayout 并创建自己的布局。

    编辑

    我发现 insertSpacing 效果更好。

    mainHBox.insertSpacing(1, -25)
    

    【讨论】:

    • 这只是将标签栏进一步向左推,并为我切断了它们的顶部。我希望标签在一个单独的布局中,这样我就可以利用它们下面的空间来例如在那里放一个滚动条。
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多