Как изменить выравнивание текста в QTabWidget?

Я не могу найти способ установить выравнивание текста в QTabWidget.

После того, как я создал экземпляр этого виджета, я установил для его свойства tabPosition значение West, но я хотел бы, чтобы текст/метка отображались горизонтально. Я рассмотрел таблицы стилей Qt, но, как вы Как видите, свойство text-align может быть установлено только для QPushButton и QProgressBar.

Я уже искал в Интернете, но только что нашел отчет об ошибке, вопрос без ответа и, наконец, пользователь, который предлагает повторно реализовать метод paint(). Возможно, я бы решил, но я использую Python (PyQt или PySide) и не знаю, как это сделать.

Можешь мне помочь?

РЕДАКТИРОВАТЬ: благодаря Teukamm я написал немного кода:

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

И, наконец, мой текст выровнен, как я и ожидал, но у меня есть небольшая (большая?) проблема: когда вы нажимаете на правую сторону каждой кнопки вкладки, он не отправляет currentChanged СИГНАЛ. Я также пытался увеличить ширину каждого tabRect в paintEvent, но это не сработало. Что мне следует изменить?

Спасибо :)

Кстати: вы не могли наследоваться от QTabWidget, но от QTabBar;)

РЕДАКТИРОВАТЬ:

Решено! Просто изменил метод sizeHint в tabSizeHint, и он работает хорошо :)


person Markon    schedule 31.08.2010    source источник
comment
вы не можете переопределить метод рисования в puQt?   -  person Naruto    schedule 31.08.2010
comment
Да, я хотел переопределить этот метод, но думал, что он не включен в реализацию Python (не знаю точно, почему я это предположил...) Спасибо за ваш комментарий :)   -  person Markon    schedule 01.09.2010


Ответы (2)


Для начала вам нужно создать собственный класс, являющийся подклассом QtGui/QTabWidget, и переопределить метод рисования:

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

Вот документация для метода QWidget.paintEvent который вы повторно реализуете.

Конечно, вам нужно знать, как работает рисование в целом, обратитесь к документации для QPainter.

К сожалению, в данный момент у меня нет под рукой установки PyQt, поэтому я не могу дать вам более конкретное решение.

person teukkam    schedule 31.08.2010
comment
Я забыл, что вам может понадобиться переопределить sizeHint(). - person teukkam; 31.08.2010
comment
Большое тебе спасибо! Однако я отредактировал вопрос. Возможно ты можешь помочь мне :) - person Markon; 31.08.2010

Я собрал рабочий пример на GitHub, который решает эту проблему здесь: https://gist.github.com/LegoStormtroopr/5075267

Код также копируется:

Минимальный пример.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
person Community    schedule 03.03.2013
comment
Нужно много улучшений, я добавил много вещей, но для первоначального сценария очень хорош и работает. Это более полный ответ не только для выравнивания, но и для «пальцевых вкладок». Спасибо! - person ioaniatr; 09.08.2018