7

QTabWidget でテキストの配置を設定する方法が見つかりません。

このウィジェットのインスタンスを作成した後、そのtabPositionプロパティを West に設定しましたが、テキスト/ラベルを水平に表示したいと思います。Qt のstylesheetsを確認しましたが、ご覧のとおり、text-alignプロパティは QPushButton と QProgressBar でのみ設定できます。

私はすでに Web で検索しましたが、バグレポート未回答の質問、そして最後に 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

コードもコピーされます。

最小限の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
于 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 に答える