Я боролся с чем-то связанным с вкладками в течение нескольких дней.Я пытаюсь сделать так, чтобы панель вкладок, которую я имею в моем приложении, расширялась по всей ширине окна.Я работаю как с 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 вкладки, занимающие всю ширину (как я хочу), но в середине окна, а не сверху.Вскоре после этого он исчезнет и вернется к размеру вкладок по умолчанию в верхней части окна, как если бы он был перезаписан чем-то другим.