代码之家  ›  专栏  ›  技术社区  ›  sdaau

在pyqt5中获取滚动条拇指的大小/宽度?

  •  1
  • sdaau  · 技术社区  · 6 年前

    比如,你有一个Pyqt5滚动条:

    pyqt5scrollbar

    我想以编程方式查找滚动条“Thumb”的宽度(编辑:在中称为“Slider”)。 http://pyqt.sourceforge.net/Docs/PyQt4/qscrollbar.html ,以及它的位置;我想像素首先是这个的“自然”单位。

    从上面的图片,我猜 start 总是0-但是我能,如果可以,如何获取 left , right , width (不过,如果我们有 左边 正确的 , 宽度 平凡地 right-left ;及 end 以像素为单位?

    我知道存在 QScrollBar .value() , pageStep() singleStep() 但是我不能确定它们是否与上面的像素尺寸有关。

    (如果滚动条需要Pyqt5示例,请参见 Have tabs keep focus on mousewheel over them in a PyQt5 scrollarea? )

    1 回复  |  直到 6 年前
        1
  •  3
  •   eyllanesc Yonghwan Shin    6 年前

    在这种情况下,必须使用qStyle()的SubControlRect()方法来获取矩形,从中可以获得所需的信息。

    在下面的示例中,我创建了一个自定义的qscrollbar类,每当滑块的位置更改或改变qscrollbar的大小时,它都通过信号发出该信息。

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Scrollbar(QtWidgets.QScrollBar):
        geometryChanged = QtCore.pyqtSignal(int, int, int, int, int)
    
        def __init__(self, parent=None):
            super(Scrollbar, self).__init__(parent)
            self.sliderMoved.connect(self.calculate_geometry)
    
        def resizeEvent(self, event):
            self.calculate_geometry()
            super(Scrollbar, self).resizeEvent(event)
    
        def calculate_geometry(self):
            opt = QtWidgets.QStyleOptionSlider()
            self.initStyleOption(opt)
            gr = self.style().subControlRect(QtWidgets.QStyle.CC_ScrollBar, opt,
                QtWidgets.QStyle.SC_ScrollBarGroove, self)
            sr = self.style().subControlRect(QtWidgets.QStyle.CC_ScrollBar, opt,
                QtWidgets.QStyle.SC_ScrollBarSlider, self)
    
            start = gr.left() if self.orientation() == QtCore.Qt.Horizontal else gr.top()
            left = sr.left() if self.orientation() == QtCore.Qt.Horizontal else sr.top()
            right = sr.right() if self.orientation() == QtCore.Qt.Horizontal else sr.bottom()
            width = sr.width() if self.orientation() == QtCore.Qt.Horizontal else sr.height()
            end = gr.right() if self.orientation() == QtCore.Qt.Horizontal else gr.bottom()
            self.geometryChanged.emit(start, left, width, right, end)
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
    
            hlayv = QtWidgets.QHBoxLayout()
            hlayv.addWidget(QtWidgets.QLabel("start: "))
            self._start_label_v = QtWidgets.QLabel()
            hlayv.addWidget(self._start_label_v)
            hlayv.addWidget(QtWidgets.QLabel("left: "))
            self._left_label_v = QtWidgets.QLabel()
            hlayv.addWidget(self._left_label_v)
            hlayv.addWidget(QtWidgets.QLabel("width: "))
            self._width_label_v = QtWidgets.QLabel()
            hlayv.addWidget(self._width_label_v)
            hlayv.addWidget(QtWidgets.QLabel("right: "))
            self._right_label_v = QtWidgets.QLabel()
            hlayv.addWidget(self._right_label_v)
            hlayv.addWidget(QtWidgets.QLabel("end: "))
            self._end_label_v = QtWidgets.QLabel()
            hlayv.addWidget(self._end_label_v)
    
            hlayh = QtWidgets.QHBoxLayout()
            hlayh.addWidget(QtWidgets.QLabel("start: "))
            self._start_label_h = QtWidgets.QLabel()
            hlayh.addWidget(self._start_label_h)
            hlayh.addWidget(QtWidgets.QLabel("left: "))
            self._left_label_h = QtWidgets.QLabel()
            hlayh.addWidget(self._left_label_h)
            hlayh.addWidget(QtWidgets.QLabel("width: "))
            self._width_label_h = QtWidgets.QLabel()
            hlayh.addWidget(self._width_label_h)
            hlayh.addWidget(QtWidgets.QLabel("right: "))
            self._right_label_h = QtWidgets.QLabel()
            hlayh.addWidget(self._right_label_h)
            hlayh.addWidget(QtWidgets.QLabel("end: "))
            self._end_label_h = QtWidgets.QLabel()
            hlayh.addWidget(self._end_label_h)
    
            self.scrollarea = QtWidgets.QScrollArea()
            content_widget = QtWidgets.QLabel()
            content_widget.setStyleSheet('''background-color : red;''')
            content_widget.setFixedSize(1000, 1000)
            self.scrollarea.setWidget(content_widget)
            hscrollbar = Scrollbar()
            hscrollbar.geometryChanged.connect(self.on_vertical_geometryChanged)
            self.scrollarea.setHorizontalScrollBar(hscrollbar)
            self.scrollarea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    
            vscrollbar =Scrollbar()
            self.scrollarea.setVerticalScrollBar(vscrollbar)
            vscrollbar.geometryChanged.connect(self.on_horizontal_geometryChanged)
            self.scrollarea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    
            vlay = QtWidgets.QVBoxLayout(self)
            vlay.addWidget(QtWidgets.QLabel("<b>Vertical: </b>"))
            vlay.addLayout(hlayv)
            vlay.addWidget(QtWidgets.QLabel("<b>Horizontal: </b>"))
            vlay.addLayout(hlayh)
            vlay.addWidget(self.scrollarea)
    
        @QtCore.pyqtSlot(int, int, int, int, int)
        def on_vertical_geometryChanged(self, start, left, width, right, end):
            self._start_label_v.setNum(start)
            self._left_label_v.setNum(left)
            self._width_label_v.setNum(width)
            self._right_label_v.setNum(right)
            self._end_label_v.setNum(end)
    
        QtCore.pyqtSlot(int, int, int, int, int)
        def on_horizontal_geometryChanged(self, start, left, width, right, end):
            self._start_label_h.setNum(start)
            self._left_label_h.setNum(left)
            self._width_label_h.setNum(width)
            self._right_label_h.setNum(right)
            self._end_label_h.setNum(end)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    
    推荐文章