0

QScrollBar のスライダーの正しい中心を見つけるのに問題があります (スライダーの位置を表示するには、テキスト ウィジェットを貼り付ける必要があります)。スライダーの位置をドキュメントの幅で割って正規化し、次に width() でスケーリングしてみました。しかし、スクロール バーの装飾とボタンが考慮されていないため、これは正確ではありません。そのため、ドラッグするとラベルがはずれ、中心にくっつきません。以下は、スクロール領域の正しい開始位置と終了位置を見つけるために QScrollBar のボタン、フレームなどを何らかの形で考慮する必要がある現在のコードです。誰か助けてくれませんか?

import sys
from PySide.QtGui import *
from PySide.QtCore import *

class PageScroller(QScrollBar):
    '''Set the total number of pages.'''
    def __init__(self, parent=None):
        super(PageScroller, self).__init__(parent)

        self.pageIndicator = QLabel('|', parent)
        self.valueChanged.connect(self.updateSlider)
        self.setOrientation(Qt.Orientation.Horizontal)
        self.setPageStep(1)

    def updateSlider(self, event):
        scrollAreaWidth = self.maximum() - self.minimum() + self.pageStep()
        sliderPos = (self.sliderPosition() + self.pageStep()/2.0) / float(scrollAreaWidth) * self.width()
        indicatorPos = QPoint(sliderPos - self.pageIndicator.width()/2, -self.pageIndicator.height())
        self.pageIndicator.move(self.mapToParent(indicatorPos))

        self.update()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    #app.setStyle('plastique') # tyhis makes the sliding more obvious
    mainWindow = QWidget()
    layout = QVBoxLayout(mainWindow)
    s = PageScroller(mainWindow)
    layout.addWidget(s)
    mainWindow.resize(400, 100)
    mainWindow.show()


    sys.exit(app.exec_())
4

1 に答える 1

1

プラットフォーム間のさまざまなスタイルの違いを考慮しながら、スライダー部分のピクセル範囲を適切にマッピングすることは、あなたが発見したように、本当に難しいでしょう。要因が多すぎます(左右の余分なボタン、スライダーのサイズ自体、...)

これは本当にあいまいで、見つけるのに少し時間がかかりますが、実際にはQScrollBarのSubControlを照会する必要があります。取り戻すことができるのは、スクロールハンドルのQRectです。

def resizeEvent(self, event):
    super(PageScroller, self).resizeEvent(event)
    self.updateSlider()

def updateSlider(self, val=None):
    opt = QStyleOptionSlider()
    self.initStyleOption(opt)
    style = self.style()
    handle = style.subControlRect(style.CC_ScrollBar, opt, 
                                    style.SC_ScrollBarSlider)
    sliderPos = handle.center()
    sliderPos.setY(-self.pageIndicator.height())
    self.pageIndicator.move(self.mapToParent(sliderPos))
  1. 最初に空のQStyleOptionSliderを作成し、PageScrollerの現在の状態を入力する必要があります。
  2. 次に、PageScrollerからスタイルを取得し、subControlRectを使用ComplexControl ScrollBarて、タイプのサブコントロールにタイプを照会する必要がありますSubControl ScrollBarSlider。optsを使用してスライダーのQRectを返します
  3. 次に、通常どおりにマップして、pageIndicatorを移動できます

resizeEvent最初の表示時、およびウィジェットのサイズ変更中にインジケーターを適切に配置するために、を追加しました。

于 2012-07-18T20:30:57.117 に答える