将标签扩展到全窗口大小?

时间:2018-11-16 14:40:23

标签: python pyside2 qtabwidget qtabbar

几天来我一直在努力解决与标签相关的问题。我正在尝试使其在应用程序中具有的选项卡栏延伸到整个窗口尺寸的整个宽度。我正在同时使用MacOS和Ubuntu,虽然两者的最终结果都不同,但这两个都不起作用。

到目前为止,我已经尝试了一些方法。首先,我创建了QtWidgets.QTabBar的子类,并将其用作选项卡栏。我尝试将expand设置为true(self.setExpand(True)),但是从我听到的所有信息来看,这不能让您覆盖操作系统默认设置。

下一个想法是重写tabSizeHint,这似乎是正确的方法,但是我无法弄清楚实现。到目前为止,这就是我目前正在做的事情,看来应该可以使用:

import sys
from PySide2 import QtCore, QtWidgets, QtGui

class TabBar(QtWidgets.QTabBar):
    def __init__(self, parent=None):
        super(TabBar, self).__init__(parent)
        self.setExpanding(True)

    def tabSizeHint(self, index):
        size = QtWidgets.QTabBar.tabSizeHint(self, index)
        width = self.parent().size().width()
        size.setWidth( width / self.count() )
        return size

class TabWindow(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super(TabWindow, self).__init__(parent)
        self.bar = TabBar()
        self.setTabBar(self.bar)
        self.initTabs()

    def initTabs(self):
        self.test1 = self.addTab(QtWidgets.QWidget(), "Test 1")
        self.test2 = self.addTab(QtWidgets.QWidget(),"Test 2")
        self.test3 = self.addTab(QtWidgets.QWidget(),"Test 3")
        self.test4 = self.addTab(QtWidgets.QWidget(),"Test 4")

class MainApplication(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainApplication, self).__init__(parent)
        self.mainWidget = TabWindow()
        self.setCentralWidget(self.mainWidget)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_app = MainApplication()
    main_app.show()
    sys.exit(app.exec_())

这在我最初启动程序时有效,但是如果我扩展窗口,则不会扩展选项卡的大小。似乎没有调用tabSizeHint。我采用的另一种(失败的)方法是:

class TabBar(QtWidgets.QTabBar):
    def __init__(self, parent=None):
        super(TabBar, self).__init__(parent)

class TabWindow(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super(TabWindow, self).__init__(parent)
        self.bar = TabBar()
        self.setTabBar(self.bar)
        self.initTabs()
        layout = QtWidgets.QHBoxLayout()
        layout.addWidget(self.bar)
        self.setLayout(layout)

    def initTabs(self):
        self.test1 = self.addTab(QtWidgets.QWidget(), "Test 1")
        self.test2 = self.addTab(QtWidgets.QWidget(),"Test 2")
        self.test3 = self.addTab(QtWidgets.QWidget(),"Test 3")
        self.test4 = self.addTab(QtWidgets.QWidget(),"Test 4")

class MainApplication(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainApplication, self).__init__(parent)
        self.mainWidget = TabWindow()
        self.setCentralWidget(self.mainWidget)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_app = MainApplication()
    main_app.show()
    sys.exit(app.exec_())

对此,每当我单击选项卡时,它将短暂显示4个选项卡,占据整个宽度(如我所愿),但在窗口的中间而不是顶部。此后不久,它将消失并恢复到窗口顶部的默认大小的标签,就好像它被其他内容覆盖一样。

1 个答案:

答案 0 :(得分:1)

QTabWidget计算何时需要更改QTabBar的大小,因此解决方案是强制使其具有等于QTabWidget的新宽度。

from PySide2 import QtCore, QtGui, QtWidgets 

class TabWindow(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super(TabWindow, self).__init__(parent)
        self.initTabs()

    def initTabs(self):
        self.test1 = self.addTab(QtWidgets.QWidget(), "Test 1")
        self.test2 = self.addTab(QtWidgets.QWidget(),"Test 2")
        self.test3 = self.addTab(QtWidgets.QWidget(),"Test 3")
        self.test4 = self.addTab(QtWidgets.QWidget(),"Test 4")

    def resizeEvent(self, event):
        self.tabBar().setFixedWidth(self.width())
        super(TabWindow, self).resizeEvent(event)

class MainApplication(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainApplication, self).__init__(parent)
        self.mainWidget = TabWindow()
        self.setCentralWidget(self.mainWidget)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main_app = MainApplication()
    main_app.resize(640, 480)
    main_app.show()
    sys.exit(app.exec_())

在以前的实现中,如果宽度很小,则会出现按钮(在Linux中,我尚未在Mac OS中进行测试),一种避免这种情况的方法是实现tabSizeHint()方法:

from PySide2 import QtCore, QtGui, QtWidgets 

class TabBar(QtWidgets.QTabBar):
    def __init__(self, parent=None):
        super(TabBar, self).__init__(parent)
        self.setExpanding(True)

    def tabSizeHint(self, index):
        if self.count() > 0:
            size = QtWidgets.QTabBar.tabSizeHint(self, index)
            width = self.parent().size().width()/self.count()
            return QtCore.QSize(width, size.height())
        return super(TabBar, self).tabSizeHint(index)

class TabWindow(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super(TabWindow, self).__init__(parent)
        self.bar = TabBar()
        self.setTabBar(self.bar)
        self.initTabs()

    def initTabs(self):
        self.test1 = self.addTab(QtWidgets.QWidget(), "Test 1")
        self.test2 = self.addTab(QtWidgets.QWidget(),"Test 2")
        self.test3 = self.addTab(QtWidgets.QWidget(),"Test 3")
        self.test4 = self.addTab(QtWidgets.QWidget(),"Test 4")

    def resizeEvent(self, event):
        self.tabBar().setFixedWidth(self.width())
        super(TabWindow, self).resizeEvent(event)

class MainApplication(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainApplication, self).__init__(parent)
        self.mainWidget = TabWindow()
        self.setCentralWidget(self.mainWidget)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main_app = MainApplication()
    main_app.resize(640, 480)
    main_app.show()
    sys.exit(app.exec_())