Question

Je ne peux pas trouver un moyen de définir l'alignement du texte dans un QTabWidget.

Après que j'ai créé une instance de ce widget, je l'ai mis son TabPosition bien à l'Ouest, mais je souhaite qu'il a montré texte / étiquette horizontalement. J'ai donné un coup d'oeil à ce Qt stylesheets, mais comme vous peut voir, text-align propriété ne peut être définie sur QPushButton et QProgressBar.

Je l'ai déjà cherché sur le web, mais je viens de trouver un bugreport, un question non-réponse , et enfin un utilisateur qui suggère à nouveau mettre en oeuvre le procédé de peinture () . Peut-être que je résous, mais je suis en utilisant Python (PyQt ou PySide) et je ne sais pas comment le faire.

Pouvez-vous me aider?

EDIT: grâce à Teukamm, je l'ai écrit un peu de 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_())

Et enfin, j'ai mon texte aligné comme je m'y attendais, mais j'ai un peu (grand?) Problème: lorsque vous cliquez sur le côté droit de chaque bouton onglet, il ne transmet pas le currentChanged SIGNAL . J'ai aussi essayé d'élargir la largeur de chaque tabRect, en paintEvent, mais il ne fonctionne pas. Que dois-je changer?

Merci:)

BTW: on ne pouvait pas hériter de QTabWidget, mais de QTabBar;)

EDIT:

Résolu! Il suffit de changer la méthode sizeHint tabSizeHint et il fonctionne bien:)

Était-ce utile?

La solution

Pour commencer, vous devez créer une classe personnalisée qui est une sous-classe de QtGui / QTabWidget et redéfinir la méthode de peinture:

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

Voici les pour QWidget.paintEvent méthode que vous réimplémenter.

Bien sûr, vous devez savoir comment les travaux de peinture en général, s'il vous plaît se référer à la documentation QPainter .

Malheureusement, je n'ai pas une installation de PyQt à portée de main pour le moment, donc je ne peux pas vous donner une solution plus spécifique.

Autres conseils

J'ai mis un exemple travaillé ensemble sur GitHub qui résout ce ici: https: // essentiel. github.com/LegoStormtroopr/5075267

Le code est copié à travers ainsi:

example.py minimale:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top