Как изменить выравнивание текста в QTabWidget?
-
25-09-2019 - |
Вопрос
Я не могу найти способ установить выравнивание текста в QTabWidget.
После того как я создал экземпляр этого виджета, я установил его вкладкаПозиция свойство на Запад, но мне бы хотелось, чтобы текст/метка отображались горизонтально.Я взглянул на Qt таблицы стилей, но, как видите, выравнивание текста Свойство можно установить только для 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_())
И, наконец, мой текст выровнен, как я и ожидал, но у меня возникла небольшая (большая?) проблема:когда вы нажимаете на правую сторону каждой кнопки вкладки, она не отправляет текущийИзменено СИГНАЛ.Я также пытался увеличить ширину каждого tabRect в PaintEvent, но это не сработало.Что мне следует изменить?
Спасибо :)
КСТАТИ:вы не можете наследовать от QTabWidget, а от QTabBar;)
РЕДАКТИРОВАТЬ:
Решено!Просто изменил метод РазмерПодсказка в tabSizeHint и это работает хорошо :)
Решение
Для начала вам нужно создать собственный класс, который является подклассом 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, поэтому я не могу дать вам более конкретное решение.
Другие советы
Я собрал на 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