如何在QTabWidget中更改文本对齐方式?

时间:2010-08-31 09:26:04

标签: qt qt4 pyqt4 pyside qtabwidget

我找不到在QTabWidget中设置文本对齐方式。

在我创建了这个小部件的实例后,我将其 tabPosition 属性设置为West,但我希望它水平显示文本/标签。 我已经看了Qt的stylesheets,但正如您所看到的, text-align 属性只能在QPushButton和QProgressBar上设置。

我已在网上搜索过,但我刚发现bugreportnon-answered question,最后a user建议重新实施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 SIGNAL 。我也尝试在paintEvent中扩展每个tabRect的宽度,但它不起作用。我应该改变什么?

谢谢:)

BTW:你不能从QTabWidget继承,而是从QTabBar继承;)

编辑:

解决!刚刚更改 tabSizeHint 中的 sizeHint 方法,效果很好:)

2 个答案:

答案 0 :(得分:8)

我在GitHub上放了一个有用的例子,解决了这个问题:https://gist.github.com/LegoStormtroopr/5075267

代码也会被复制:

最小的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

答案 1 :(得分:1)

为了帮助您入门,您需要创建一个自定义类,它是QtGui / QTabWidget的子类并重新定义绘制方法:

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

以下是您重新实现的documentation for QWidget.paintEvent方法。

当然,您需要了解绘画的工作原理,请参阅QPainter的文档。

不幸的是,我目前没有方便的PyQt安装,所以我不能给你一个更具体的解决方案。