2010-08-31 15 views
7

No puedo encontrar la manera de establecer la alineación del texto en un QTabWidget.¿Cómo cambiar la alineación de texto en QTabWidget?

Después de crear una instancia de este widget, configuré su propiedad tabPosition en Oeste, pero me gustaría que mostrara texto/etiqueta horizontalmente. He echado un vistazo al Qt's stylesheets, pero como puede ver, la propiedad text-align solo se puede configurar en QPushButton y QProgressBar.

Ya he buscado en la web, pero acabo de encontrar un bugreport, un non-answered question, y finalmente a user que sugiere volver a implementar el método paint(). Tal vez lo resolvería, pero estoy usando Python (PyQt o PySide) y no sé cómo hacerlo.

¿Me puede ayudar?

EDIT: gracias a Teukamm, escribí un poco 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_()) 

Y finalmente he mi texto alineado como esperaba, pero tengo un poco (grande?) Problema: cuando hace clic en el lado derecho de cada botón de pestaña, no envía el currentChanged SIGNAL. También traté de ampliar el ancho de cada tabRect, en paintEvent, pero no funciona. ¿Qué debería cambiar?

Gracias :)

Por cierto: no se podía heredar de QTabWidget, pero a partir de QTabBar;)

EDIT:

resuelto! Acaba de cambiar el método sizeHint en tabSizeHint y funciona bien :)

+0

¿no puede anular el método de pintura en puQt? – Naruto

+0

Sí, quería anular ese método, pero pensé que no estaba incluido en la implementación de Python (no sé exactamente por qué supuse esto ...) Gracias por su comentario :) – Markon

Respuesta

1

Para empezar, es necesario crear una clase personalizada que es una subclase de QtGui/QTabWidget y redefinir el método de pintura:

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

Aquí está el método documentation for QWidget.paintEvent que está volviendo a implementar.

Por supuesto, necesita saber cómo funciona la pintura en general, consulte la documentación para QPainter.

Lamentablemente, no tengo una instalación de PyQt a la mano en este momento, por lo que no puedo darle una solución más específica.

+0

Se me olvidó que puede necesitar volver a aplicar sizeHint() también. – teukkam

+0

¡Muchas gracias! Sin embargo, he editado la pregunta. Quizás podrías ayudarme :) – Markon

7

He puesto un ejemplo práctico juntos en GitHub que resuelve esta aquí: https://gist.github.com/LegoStormtroopr/5075267

El código es copiado a través de así:

example.py Mínimo:

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 
Cuestiones relacionadas