【问题标题】:How to change text alignment in QTabWidget?如何更改 QTabWidget 中的文本对齐方式?
【发布时间】:2011-04-06 04:22:04
【问题描述】:

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

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

我已经在网上搜索过了,但我只找到了一个bugreport、一个non-answered question,最后是一个建议重新实现paint() 方法的a user。 也许我会解决,但我使用的是 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 并且效果很好:)

【问题讨论】:

  • 你不能覆盖puQt中的paint方法?
  • 是的,我想重写那个方法,但我认为它没有包含在 Python 实现中(不知道我为什么这么认为......)谢谢你的评论 :)

标签: qt qt4 pyqt4 pyside qtabwidget


【解决方案1】:

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

【讨论】:

  • 需要很多改进,我已经添加了很多东西,但是对于初始脚本来说非常好并且它可以工作。这是更完整的答案,不仅适用于对齐,而且适用于“手指标签”。谢谢!
【解决方案2】:

首先,您需要创建一个自定义类,它是 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 安装,所以我无法为您提供更具体的解决方案。

【讨论】:

  • 我忘了你可能还需要重新实现 sizeHint()。
  • 非常感谢!但是,我已经编辑了这个问题。也许你可以帮助我:)
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2023-03-12
  • 2020-05-18
相关资源
最近更新 更多