2010-08-31 29 views
7

Ich kann keine Möglichkeit finden, die Textausrichtung in einem QTabWidget festzulegen.Wie ändere ich die Textausrichtung in QTabWidget?

Nachdem ich eine Instanz dieses Widgets erstellt habe, habe ich seine TabPosition Eigenschaft auf West, aber ich wünschte, es zeigte Text/Label horizontal. Ich habe einen Blick auf die Qt's stylesheets, aber wie Sie sehen können, kann die text-align -Eigenschaft nur auf QPushButton und QProgressBar gesetzt werden.

Ich suchte bereits im Internet, aber ich fand gerade eine bugreport, eine non-answered question und schließlich a user, die vorschlägt, die paint() Methode zu re-implementieren. Vielleicht würde ich lösen, aber ich benutze Python (PyQt oder PySide) und ich weiß nicht, wie es geht.

Können Sie mir helfen?

EDIT: dank Teukamm, ich ein Stück Code geschrieben:

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

Und schließlich habe ich meinen Text ausgerichtet, wie ich erwartet hatte, aber ich habe ein wenig (groß?) Problem: Wenn Sie klicken auf die rechte Seite jedes Tabs, es sendet nicht die currentChanged SIGNAL. Ich habe auch versucht, die Breite jedes TabRect in paintEvent zu erweitern, aber es funktioniert nicht. Was soll ich ändern?

Danke

BTW :): Sie nicht aus QTabWidget, sondern von QTabBar erben könnte;)

EDIT:

gelöst! Nur änderte die Methode sizeHint in tabSizeHint und es funktioniert gut :)

+0

Sie können die Paint-Methode in puQt nicht überschreiben? – Naruto

+0

Ja, ich wollte diese Methode überschreiben, aber ich dachte, dass sie nicht in der Python-Implementierung enthalten war (weiß nicht genau, warum ich das vermutete ...)) Vielen Dank für Ihren Kommentar :) – Markon

Antwort

1

Um Ihnen den Einstieg, müssen Sie eine benutzerdefinierte Klasse erstellen, die eine Unterklasse von QtGui/QTabWidget ist und definieren die Malweise:

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

Hier ist die documentation for QWidget.paintEvent Methode, die Sie neu implementieren.

Natürlich müssen Sie wissen, wie die Lackierung im Allgemeinen funktioniert, bitte beachten Sie die Dokumentation für QPainter.

Leider habe ich im Moment keine PyQt-Installation zur Hand, daher kann ich Ihnen keine spezifischere Lösung geben.

+0

Ich habe vergessen, Sie müssen sizeHint() auch neu zu implementieren. – teukkam

+0

Vielen Dank! Allerdings habe ich die Frage bearbeitet. Vielleicht kannst du mir helfen :) – Markon

7

Ich habe ein ausgearbeitetes Beispiel zusammen auf GitHub setzen, dass dies hier löst: kopiert über und wird https://gist.github.com/LegoStormtroopr/5075267

Der Code:

Minimal 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