Come cambiare l'allineamento del testo in QTabWidget?
-
25-09-2019 - |
Domanda
non riesco a trovare un modo per impostare l'allineamento del testo in una QTabWidget.
Dopo ho creato un'istanza di questo widget, ho impostato la sua tabPosition di proprietà a West, ma vorrei che ha mostrato il testo / etichetta in senso orizzontale. Ho dato uno sguardo a quello del fogli di stile Qt, ma come si può vedere, il text-align proprietà può essere impostata solo su QPushButton e QProgressBar.
I già cercato sul web, ma ho appena trovato un bugreport , un non risposto alla domanda , e, infine, un utente che suggerisce di re-implementare la vernice () . Forse mi piacerebbe risolvere, ma sto usando Python (PyQt o PySide) e non so come fare.
Mi potete aiutare?
EDIT: grazie a Teukamm, ho scritto un po 'di codice:
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 ho il mio testo allineato come mi aspettavo, ma ho un piccolo problema (grande?): Quando si fa clic sul lato destro di ogni tasto tab, non invia il CurrentChanged SIGNAL . Ho cercato anche di ampliare la larghezza di ogni tabRect, in paintEvent, ma non funziona. Cosa devo cambiare?
Grazie:)
A proposito: non si poteva ereditare da QTabWidget, ma da QTabBar;)
EDIT:
risolto! Appena cambiato il metodo di sizehint in tabSizeHint e funziona bene:)
Soluzione
Per iniziare, è necessario creare una classe personalizzata che è una sottoclasse di QtGui / QTabWidget e ridefinire il metodo di pittura:
class HorizontalTabWidget(QtGui.QTabWidget):
def paintEvent(self, event):
QPainter p;
p.begin(this);
# your drawing code goes here
p.end();
Ecco il documentazione per QWidget.paintEvent metodo che si sta reimplementare.
Naturalmente è necessario sapere come dipingere opere in generale, si prega di fare riferimento alla documentazione per QPainter .
Purtroppo non ho un impianto PyQt a portata di mano in questo momento, quindi non posso dare una soluzione più specifica.
Altri suggerimenti
Ho messo un esempio lavorato insieme su GitHub che risolve questo qui: https: // Gist. github.com/LegoStormtroopr/5075267
Il codice viene copiato tutto così:
example.py Minimal:
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