расширение вкладок до полного размера окна? - PullRequest
0 голосов
/ 16 ноября 2018

Я боролся с чем-то связанным с вкладками в течение нескольких дней.Я пытаюсь сделать так, чтобы панель вкладок, которую я имею в моем приложении, расширялась по всей ширине окна.Я работаю как с MacOS, так и с Ubuntu, и хотя конечный результат обоих отличается, ни один из них не работает.

До сих пор я пробовал несколько вещей.Сначала я создал подкласс QtWidgets.QTabBar и использовал его в качестве панели вкладок.Я попытался установить для расширения значение 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 голосов
/ 16 ноября 2018

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_())
...