7

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

创建此小部件的实例后,我将其tabPosition属性设置为 West,但我希望它水平显示文本/标签。我已经查看了 Qt 的stylesheets,但是正如您所看到的,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 SIGNAL。我还尝试在paintEvent 中扩展每个tabRect 的宽度,但它不起作用。我应该改变什么?

谢谢 :)

顺便说一句:您不能从 QTabWidget 继承,而是从 QTabBar 继承;)

编辑:

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

4

2 回答 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
于 2013-03-03T09:54:20.777 回答
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 安装,所以我无法为您提供更具体的解决方案。

于 2010-08-31T12:35:48.447 回答