Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 跟踪QScrollBar的中心_Qt_Pyqt_Pyqt4_Pyside - Fatal编程技术网

Qt 跟踪QScrollBar的中心

Qt 跟踪QScrollBar的中心,qt,pyqt,pyqt4,pyside,Qt,Pyqt,Pyqt4,Pyside,我很难找到QScrollBar滑块的正确中心(我需要在其上粘贴一个文本小部件来显示滑块的位置)。我尝试将滑块的位置正常化,方法是将其除以文档宽度,然后按其宽度()进行缩放。但这并不准确,因为滚动条的装饰和按钮没有被考虑在内。因此,标签在拖动时会漂移,不会粘在中心。 下面是我当前的代码,它需要考虑QScrollBar的按钮、帧等,以找到滚动区域的正确开始和结束位置。 有人能帮忙吗 import sys from PySide.QtGui import * from PySide.QtCore im

我很难找到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_())

正如您所发现的,要正确地映射滑块部分的像素范围,同时考虑平台之间的各种样式差异,是非常困难的。因素太多(左侧和右侧的额外按钮、滑块大小本身等)

这是非常模糊的,需要进行一些搜索才能找到它,但实际上您需要查询QScrollBar的子控件。您可以得到的是滚动手柄的QRect:

def resizeEvent(self,event):
超级(页面滚动器,自我)。调整事件大小(事件)
self.updateSlider()文件
def updateSlider(self,val=None):
opt=QStyleOptionSlider()
self.initStyleOption(opt)
style=self.style()
handle=style.subcrolrect(style.CC_滚动条,选项,
style.SC_滚动条(滑块)
sliderPos=handle.center()
sliderPos.setY(-self.pageIndicator.height())
self.pageIndicator.move(self.mapToParent(滑块))
  • 您首先必须创建一个空页面,并用页面滚动条的当前状态填充它
  • 然后,您必须从页面滚动器中获取样式,并使用来查询类型的子控件,以获取该类型。它使用选项返回滑块的一个值
  • 然后,您可以正常映射并移动页面指示器

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

    谢谢。我不得不在style.subcrolrect()中添加'None'作为第四个参数,因为有些样式似乎希望小部件作为第四个控件(不太清楚为什么)。现在使用不同的样式跟踪效果更好,尽管偏移量略有不同(有时在中间,有时稍微偏侧)。但我可以接受。谢谢