Pergunta

Não consigo encontrar uma maneira de definir o alinhamento de texto em um QTabWidget.

Depois de criar uma instância deste widget, eu defini seu TabPosition Propriedade para o oeste, mas eu gostaria que ele mostrasse texto/etiqueta horizontalmente. Eu dei uma olhada no QT folhas de estilo, mas como você pode ver, o alinhamento de texto A propriedade só pode ser definida no QPUSHButton e QProgressBar.

Eu já procurei na web, mas acabei de encontrar um relatório de erro, uma pergunta não respondida, e finalmente um usuário Isso sugere reimplementar o método tint (). Talvez eu resolva, mas estou usando o Python (Pyqt ou Pyside) e não sei como fazê -lo.

Pode me ajudar?

EDIT: Graças a Teukamm, escrevi um pouco de código:

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

E, finalmente CurrentChanged SINAL. Eu também tentei expandir a largura de cada tabreto, em Paintevent, mas não funciona. O que devo mudar?

Obrigada :)

BTW: Você não poderia herdar de Qtabwidget, mas de Qtabbar;)

EDITAR:

Resolvido! Acabei de mudar o método sizehint dentro tabsizehint E funciona bem :)

Foi útil?

Solução

Para começar, você precisa criar uma classe personalizada que seja uma subclasse de Qtgui/Qtabwidget e redefinir o método de pintura:

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

Aqui está o Documentação para Qwidget.paintevent método que você está reimplementando.

Claro que você precisa saber como a pintura funciona em geral, consulte a documentação para QPainter.

Infelizmente, não tenho uma instalação PYQT à mão no momento, por isso não posso lhe dar uma solução mais específica.

Outras dicas

Eu juntei um exemplo trabalhado no Github que resolve isso aqui: https://gist.github.com/legustormtroopr/5075267

O código também é copiado:

Exemplo mínimo.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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top