首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跟踪QScrollBar的中心

跟踪QScrollBar的中心
EN

Stack Overflow用户
提问于 2012-07-18 06:35:08
回答 1查看 662关注 0票数 0

我很难找到QScrollBar的滑块的正确中心(我需要在它上面粘贴一个文本小部件来显示滑块的位置)。我尝试通过将滑块的位置除以文档宽度,然后按宽度对其进行缩放()来对滑块的位置进行标准化。但这并不准确,因为滚动条的装饰和按钮没有考虑在内。因此,当您拖动时,标签会漂移,并且不会粘在中心。下面是我目前的代码,不知何故需要考虑QScrollBar的按钮,框架等,以找到滚动区域的正确开始和结束位置。有人能帮帮忙吗?

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 04:30:57

就像你已经发现的那样,要正确地映射滑块部分的像素范围,同时考虑到不同平台之间的各种样式差异,这将是非常困难的。太多的因素(左侧和右侧的额外按钮,滑块本身的大小,...)

这真的很难理解,要找到它需要一些时间,但实际上您需要查询QScrollBar的SubControl。您可以返回的是滚动句柄的QRect:

代码语言:javascript
复制
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向您返回滑块
  3. QRect,然后您可以像正常一样绘制地图并移动滑块

我添加了一个resizeEvent,以便在第一次显示时正确放置指示器,并在调整小部件大小时正确放置指示器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11531817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档