2012-07-17 87 views
0

我很難找到QScrollBar的滑塊的正確中心(我需要粘貼一個文本小部件來顯示滑塊的位置)。我試着通過將滑動條的位置除以文檔寬度來標準化滑塊的位置,然後通過它的width()來縮放它。但這並不準確,因爲滾動條的裝飾和按鈕沒有被考慮在內。所以當你拖動標籤時,標籤就會徘徊,不會堅持到中心。 下面是我目前的代碼,它需要考慮QScrollBar的按鈕,框架等來找到滾動區域的正確開始和結束位置。 有人可以幫忙嗎?跟蹤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_()) 

回答

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類型的子控件。它使用選擇使您返回滑塊的QRect
  3. 然後你就可以對應爲正常移動pageIndicator

我添加了一個resizeEvent也恰當地放置在首秀的指標,在​​對任何尺寸調整小部件。

+0

謝謝。我必須添加'None'作爲style.subControlRect()的第四個參數,因爲一些樣式似乎期望一個widget作爲第四個控件(不太確定原因)。儘管偏移量有點不同(有時它位於中心,有時略偏離邊),但現在這種方式跟不同樣式的軌跡要好得多。但我可以忍受這一點。謝謝! – 2012-07-18 23:10:42