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

2024-06-02 07:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

比如说,你有一个PyQt5滚动条:

pyqt5scrollbar

我想通过编程找到滚动条“thumb”的宽度(edit:在http://pyqt.sourceforge.net/Docs/PyQt4/qscrollbar.html中称为“slider”)以及它的位置;我想像素是一开始的“自然”单位。在

从上面的图片中,我猜start总是0-但是我能,如果是这样的话,我能得到leftrightwidth(虽然,如果我们有left和{},width通常是{});和end的像素值?在

我知道存在QScrollBar.value()pageStep()和{},但我无法确定它们是否与上述像素维度有关。在

(如果滚动条需要PyQt5示例,请参阅我在Have tabs keep focus on mousewheel over them in a PyQt5 scrollarea?中发布的代码)


Tags: httpdocsnet宽度编程像素widthleft
1条回答
网友
1楼 · 发布于 2024-06-02 07:26:51

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

在下面的示例中,我创建了一个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_())

相关问题 更多 >