by Anonymous » 10 Feb 2025, 17:41
Ich möchte ein QTABWIDGE mit horizontalen Laschen links erstellen, damit Sie die Breite der Registerkarte mit der Maus ändern können. Zu diesem Zweck habe ich das QTABWIDget auf das rechte Feld des QSplitters und die Tabbank dieses Widgets links platziert. Im Allgemeinen funktioniert alles. Aber! In Qtabwidget wird ein Ort für die Registerkartenleiste zugewiesen, die an anderer Stelle gezeichnet wird. Ich bitte um Hilfe, wie ich das Verhalten von QTABWIDget ändern kann, damit es keinen Platz für die Registerkartenleiste hat. Ich habe darüber nachgedacht, was ich in der matarischen Methode schreiben soll. Ich bin sogar in den QT -Quellcode eingestiegen, aber ich habe es nicht herausgefunden, ich habe gerade herausgefunden, dass QStackedWidget verwendet wird, um Widgets zu speichern, aber es kann nicht draußen extrahiert werden. < /P>
Code: Select all
import sys
from PySide2.QtWidgets import (
QApplication,
QMainWindow,
QSplitter,
QLabel,
QTabWidget,
QTabBar,
QStylePainter,
)
from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2.QtGui import QPainter, QPaintEvent
from PySide2.QtWidgets import QProxyStyle, QStyle
class TabBar(QTabBar):
def tabSizeHint(self, index):
s = QTabBar.tabSizeHint(self, index)
s.transpose()
return s
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
opt = QtWidgets.QStyleOptionTab()
for i in range(self.count()):
self.initStyleOption(opt, i)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
painter.save()
s = opt.rect.size()
s.transpose()
r = QtCore.QRect(QtCore.QPoint(), s)
r.moveCenter(opt.rect.center())
opt.rect = r
c = self.tabRect(i).center()
painter.translate(c)
painter.rotate(90)
painter.translate(-c)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)
painter.restore()
class TabWidget(QtWidgets.QTabWidget):
def __init__(self, *args, **kwargs):
QtWidgets.QTabWidget.__init__(self, *args, **kwargs)
self.setTabBar(TabBar(self))
self.setTabPosition(QtWidgets.QTabWidget.West)
if __name__ == "__main__":
app = QApplication()
mainwindow = QMainWindow()
splitter = QSplitter()
tab_widget = TabWidget()
tab_widget.addTab(QLabel("Tab one"), "Tab one")
tab_widget.addTab(QLabel("Tab two"), "Tab two tab two")
l_widget = QtWidgets.QWidget()
l_layaout = QtWidgets.QVBoxLayout()
l_widget.setLayout(l_layaout)
l_layaout.addWidget(tab_widget.tabBar())
splitter.addWidget(l_widget)
splitter.addWidget(tab_widget)
mainwindow.setCentralWidget(splitter)
mainwindow.showMaximized()
sys.exit(app.exec_())
Oder vielleicht gibt es eine andere Möglichkeit, einen Rand zu erstellen, der mit der Maus geändert werden kann.
Ich möchte ein QTABWIDGE mit horizontalen Laschen links erstellen, damit Sie die Breite der Registerkarte mit der Maus ändern können. Zu diesem Zweck habe ich das QTABWIDget auf das rechte Feld des QSplitters und die Tabbank dieses Widgets links platziert. Im Allgemeinen funktioniert alles. Aber! In Qtabwidget wird ein Ort für die Registerkartenleiste zugewiesen, die an anderer Stelle gezeichnet wird. Ich bitte um Hilfe, wie ich das Verhalten von QTABWIDget ändern kann, damit es keinen Platz für die Registerkartenleiste hat. Ich habe darüber nachgedacht, was ich in der matarischen Methode schreiben soll. Ich bin sogar in den QT -Quellcode eingestiegen, aber ich habe es nicht herausgefunden, ich habe gerade herausgefunden, dass QStackedWidget verwendet wird, um Widgets zu speichern, aber es kann nicht draußen extrahiert werden. < /P>
[code]import sys
from PySide2.QtWidgets import (
QApplication,
QMainWindow,
QSplitter,
QLabel,
QTabWidget,
QTabBar,
QStylePainter,
)
from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2.QtGui import QPainter, QPaintEvent
from PySide2.QtWidgets import QProxyStyle, QStyle
class TabBar(QTabBar):
def tabSizeHint(self, index):
s = QTabBar.tabSizeHint(self, index)
s.transpose()
return s
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
opt = QtWidgets.QStyleOptionTab()
for i in range(self.count()):
self.initStyleOption(opt, i)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
painter.save()
s = opt.rect.size()
s.transpose()
r = QtCore.QRect(QtCore.QPoint(), s)
r.moveCenter(opt.rect.center())
opt.rect = r
c = self.tabRect(i).center()
painter.translate(c)
painter.rotate(90)
painter.translate(-c)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)
painter.restore()
class TabWidget(QtWidgets.QTabWidget):
def __init__(self, *args, **kwargs):
QtWidgets.QTabWidget.__init__(self, *args, **kwargs)
self.setTabBar(TabBar(self))
self.setTabPosition(QtWidgets.QTabWidget.West)
if __name__ == "__main__":
app = QApplication()
mainwindow = QMainWindow()
splitter = QSplitter()
tab_widget = TabWidget()
tab_widget.addTab(QLabel("Tab one"), "Tab one")
tab_widget.addTab(QLabel("Tab two"), "Tab two tab two")
l_widget = QtWidgets.QWidget()
l_layaout = QtWidgets.QVBoxLayout()
l_widget.setLayout(l_layaout)
l_layaout.addWidget(tab_widget.tabBar())
splitter.addWidget(l_widget)
splitter.addWidget(tab_widget)
mainwindow.setCentralWidget(splitter)
mainwindow.showMaximized()
sys.exit(app.exec_())
[/code]
Oder vielleicht gibt es eine andere Möglichkeit, einen Rand zu erstellen, der mit der Maus geändert werden kann.