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

7

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

在创建了该小部件的实例后,我将其 tabPosition 属性设置为西,但我希望它以水平方式显示文本/标签。 我查看了 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_())

最后,我的文本对齐方式与我预期的一样,但是我有一个小问题(大问题?):当您单击每个选项卡按钮的右侧时,它不会发送{{link1:currentChanged SIGNAL}}。我还尝试在paintEvent中扩展每个tabRect的宽度,但它不起作用。我应该改变什么?
谢谢 :)
顺便说一下:您可能无法从QTabWidget继承,而应该从QTabBar继承;)
编辑:
解决了!只需更改< strong> tabSizeHint 中的< strong> sizeHint 方法即可正常工作 :)

你不能在PuQt中覆盖paint方法吗? - Naruto
是的,我想覆盖那个方法,但我认为它没有包含在Python实现中(不知道为什么我会这样认为...) 谢谢您的评论 :) - Markon
2个回答

8
我在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

需要大量的改进,我已经添加了很多东西,但对于初始脚本来说非常不错,它可以正常工作。这是一个更全面的答案,不仅涉及到对齐,也包括“指向标签”。谢谢! - ioaniatr

1

为了让您开始,您需要创建一个自定义类,它是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 安装,因此无法给您提供更具体的解决方案。


我忘了你可能也需要重新实现 sizeHint()。 - teukkam
非常感谢!不过,我已经编辑了问题。也许你可以帮助我 :) - Markon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接