3

几天来,我一直在为与标签相关的事情苦苦挣扎。我正在尝试使我的应用程序中的标签栏延伸到窗口大小的整个宽度。我正在使用 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 个选项卡占据整个宽度(如我所愿),但在窗口中间而不是顶部。不久之后,它将消失并恢复到窗口顶部的默认大小的选项卡,就好像它被其他东西覆盖了一样。

4

1 回答 1

2

计算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_())
于 2018-11-16T18:19:11.053 回答