Pregunta

No se puede encontrar una manera de establecer la alineación de texto en un QTabWidget.

Después de que he creado una instancia de este widget, lo he instalado su tabPosition propiedad a Occidente, pero me gustaría que mostró texto / etiqueta horizontalmente. Me he dado un vistazo a la hojas de estilo el Qt, pero a medida que se puede ver, el text-align propiedad sólo se puede establecer en QPushButton y QProgressBar.

Ya realizaron búsquedas en la web, pero me acaba de encontrar un informe de error , una no respondido a la pregunta , y finalmente usuario que sugiere volver a poner en práctica el método de pintura "http://www.qtcentre.org/threads/25905-QTabWidget-West?p=123636#post123636" rel "noreferrer nofollow"> () . Tal vez me resuelvo, 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 tengo mi texto alineado como esperaba, pero tengo un pequeño problema (grande?): Cuando se hace clic en el lado derecho de cada botón de pestaña, que no envía el CurrentChanged SEÑAL . También he intentado ampliar el ancho de cada tabRect, en paintEvent, pero no funciona. ¿Qué debería cambiar?

Gracias:)

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

EDIT:

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

¿Fue útil?

Solución

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á la de QWidget.paintEvent método que usted está reimplementar.

Por supuesto que necesita saber cómo pintar obras en general, por favor refiérase a la documentación de QPainter .

Por desgracia no tengo una instalación PyQt a mano en el momento, así que no puedo dar una solución más específica.

Otros consejos

He puesto un ejemplo práctico juntos en GitHub que resuelve este 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top