Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除QLayout中QTabBar的填充/边距_Python_Qt_Pyqt4_Pyqt5_Qtstylesheets - Fatal编程技术网

Python 删除QLayout中QTabBar的填充/边距

Python 删除QLayout中QTabBar的填充/边距,python,qt,pyqt4,pyqt5,qtstylesheets,Python,Qt,Pyqt4,Pyqt5,Qtstylesheets,我有一个应用程序,我希望QTabBar与QTabWidget区域位于一个单独的VBoxLayout中。它使用下面的代码工作,但我有一些样式问题。在我将QTabBar从QTabWidget中分离出来之前,我没有遇到任何问题,但是现在我不知道如何按照我想要的方式来设计它 #!/usr/bin/env python2 from PyQt4 import QtGui, QtCore from peaks import * class mainWindow(QtGui.QWidget): d

我有一个应用程序,我希望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 miminumizehint()设置为(15,15)并设置
QTabBar::tab{margin right:-15px;}
来模拟我想要的行为,但这不允许我实际单击选项卡。由于某种原因,标签下面(即右边)有一个空格,我不知道如何去掉它

第二次更新:我已经确定了我认为的主要问题。我的代码使用

        self.tabWidget.setTabPosition(QtGui.QTabWidget.West)
将选项卡移到左侧,但QTabWidget假定那里有一个选项卡栏,因此有额外的空间。如果我这样做

        self.tabWidget.setTabPosition(QtGui.QTabWidget.East)
右边是空白处。因此,我可以直接在选项卡栏上设置选项卡形状:

self.tabBar.setShape(QtGui.QTabBar.RoundedWest)

但是,这会在QTabWidget期望QTabBar的顶部留下空白。我可以在
setShape
之前使用
setTabPosition
将该空间向右移动,但这并不能解决实际去除它的问题。

我无法找出如何隐藏空白空间,因此我只使用了一个qtabar+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()而不是创建自己的选项卡栏。您不需要设置新的选项卡栏,除非您创建了自定义选项卡栏类并希望使用它

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

tabLayoutBox.setSpacing(0)
这是小部件之间用来分隔它们的间距。这个间距是用于小部件的。布局中有布局,因此设置间距(0)可能不适用于布局上的间距。如果没有,您可能需要将QVBoxLayout子类并创建自己的布局

编辑

我发现insertSpacing工作得更好

mainHBox.insertSpacing(1, -25)

它说:“在没有得到任何其他答案后,这将是我接受的答案,但在接下来的16个小时内,我不允许选择它作为我的答案。”。我也可以删除这个问题,因为我只是在和自己说话,但我认为其他人也可以从中得到一些东西。请您编辑此内容以详细说明解决方案。这可能是最灵活的方法,肯定是对问题的有效回答。不过,它确实需要更多的解释(或者可能只是一些简单的示例代码),这只是将选项卡栏进一步推向左侧,并为我切掉它们的顶部。我希望选项卡有一个单独的布局,这样我就可以利用它们下面的空间,例如在那里放一个滚动条。