我很难找到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_())发布于 2012-07-19 04:30:57
就像你已经发现的那样,要正确地映射滑块部分的像素范围,同时考虑到不同平台之间的各种样式差异,这将是非常困难的。太多的因素(左侧和右侧的额外按钮,滑块本身的大小,...)
这真的很难理解,要找到它需要一些时间,但实际上您需要查询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))ComplexControl ScrollBar类型的子控件,以获取SubControl ScrollBarSlider类型。它使用opts向您返回滑块我添加了一个resizeEvent,以便在第一次显示时正确放置指示器,并在调整小部件大小时正确放置指示器。
https://stackoverflow.com/questions/11531817
复制相似问题