How to change text alignment in QTabWidget?

I cannot find a way to set text alignment in QTabWidget.

After I instantiated this widget, I set its tabPosition property to the West, but I would like it to display the text / label horizontally. I looked at Qt stylesheets , but as you can see, the text-align property can only be set on QPushButton and QProgressBar.

I already searched on the Internet, but I just found a bugreport , an unanswered question and finally a user who suggests reimplementing the paint () method, Maybe I would solve it, but I use Python (PyQt or PySide) and I donโ€™t know how to do it.

Can you help me?

EDIT: thanks to Teukamm, I wrote some code:

from PyQt4 import QtGui, QtCore class HorizontalTabWidget(QtGui.QTabBar): def paintEvent(self, event): for index in range(self.count()): painter = QtGui.QPainter() painter.begin(self) painter.setPen(QtCore.Qt.blue); painter.setFont(QtGui.QFont("Arial", 10)); tabRect = self.tabRect(index) painter.drawText(tabRect, QtCore.Qt.AlignVCenter | QtCore.Qt.TextDontClip, self.tabText(index)); painter.end() def sizeHint(self): return QtCore.QSize(60, 130) import sys app = QtGui.QApplication(sys.argv) tabs = QtGui.QTabWidget() tabs.setTabBar(HorizontalTabWidget()) widget1 = QtGui.QWidget() widget2 = QtGui.QWidget() tabs.addTab(widget1, "Widget1") tabs.addTab(widget2, "Widget2") tabs.setTabPosition(2) tabs.show() sys.exit(app.exec_()) 

And finally, my text is aligned as I expected, but I have a small (big?) Problem: when you click on the right side of each tab button, it does not send currentChanged SIGNAL . I also tried to expand the width of each tabRect in paintEvent, but it does not work. What should I change?

Thanks:)

By the way: you could not inherit from QTabWidget, but from QTabBar;)

EDIT:

Solved! Just changed the sizeHint method in tabSizeHint and it works well :)

+7
qt qt4 pyside pyqt4 qtabwidget
source share
2 answers

To get started, you need to create a custom class that is a subclass of QtGui / QTabWidget and override the drawing method:

 class HorizontalTabWidget(QtGui.QTabWidget): def paintEvent(self, event): QPainter p; p.begin(this); # your drawing code goes here p.end(); 

Here is the documentation for QWidget.paintEvent that you override.

Of course, you need to know how painting in general works, please refer to the documentation for QPainter .

Unfortunately, at the moment I do not have PyQt installed, so I cannot give you a more specific solution.

+1
source share

I put the processed example together on GitHub, which solves this here: https://gist.github.com/LegoStormtroopr/5075267

The code is also copied:

Minimum example.py:

 from PyQt4 import QtGui, QtCore from FingerTabs import FingerTabWidget import sys app = QtGui.QApplication(sys.argv) tabs = QtGui.QTabWidget() tabs.setTabBar(FingerTabWidget(width=100,height=25)) digits = ['Thumb','Pointer','Rude','Ring','Pinky'] for i,d in enumerate(digits): widget = QtGui.QLabel("Area #%s <br> %s Finger"% (i,d)) tabs.addTab(widget, d) tabs.setTabPosition(QtGui.QTabWidget.West) tabs.show() sys.exit(app.exec_()) 

FingerTabs.py:

 from PyQt4 import QtGui, QtCore class FingerTabWidget(QtGui.QTabBar): def __init__(self, *args, **kwargs): self.tabSize = QtCore.QSize(kwargs.pop('width'), kwargs.pop('height')) super(FingerTabWidget, self).__init__(*args, **kwargs) def paintEvent(self, event): painter = QtGui.QStylePainter(self) option = QtGui.QStyleOptionTab() for index in range(self.count()): self.initStyleOption(option, index) tabRect = self.tabRect(index) tabRect.moveLeft(10) painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option) painter.drawText(tabRect, QtCore.Qt.AlignVCenter |\ QtCore.Qt.TextDontClip, \ self.tabText(index)); def tabSizeHint(self,index): return self.tabSize 
+7
source share

All Articles