Qt 跟踪QScrollBar的中心
我很难找到QScrollBar滑块的正确中心(我需要在其上粘贴一个文本小部件来显示滑块的位置)。我尝试将滑块的位置正常化,方法是将其除以文档宽度,然后按其宽度()进行缩放。但这并不准确,因为滚动条的装饰和按钮没有被考虑在内。因此,标签在拖动时会漂移,不会粘在中心。 下面是我当前的代码,它需要考虑QScrollBar的按钮、帧等,以找到滚动区域的正确开始和结束位置。 有人能帮忙吗Qt 跟踪QScrollBar的中心,qt,pyqt,pyqt4,pyside,Qt,Pyqt,Pyqt4,Pyside,我很难找到QScrollBar滑块的正确中心(我需要在其上粘贴一个文本小部件来显示滑块的位置)。我尝试将滑块的位置正常化,方法是将其除以文档宽度,然后按其宽度()进行缩放。但这并不准确,因为滚动条的装饰和按钮没有被考虑在内。因此,标签在拖动时会漂移,不会粘在中心。 下面是我当前的代码,它需要考虑QScrollBar的按钮、帧等,以找到滚动区域的正确开始和结束位置。 有人能帮忙吗 import sys from PySide.QtGui import * from PySide.QtCore im
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'作为第四个参数,因为有些样式似乎希望小部件作为第四个控件(不太清楚为什么)。现在使用不同的样式跟踪效果更好,尽管偏移量略有不同(有时在中间,有时稍微偏侧)。但我可以接受。谢谢