QT6 源(77):阅读与注释滚动条 QScrollBar 的源码,其是基类QAbstractSlider 的子类,
(1)本代码来自头文件 qscrollbar . h,,滚动条的代码并没有依据其父类再做出太大的扩展 :
#ifndef QSCROLLBAR_H
#define QSCROLLBAR_H#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qwidget.h>#include <QtWidgets/qabstractslider.h>QT_REQUIRE_CONFIG(scrollbar);QT_BEGIN_NAMESPACE //本类在 QT的全局命名控件class QScrollBarPrivate;
class QStyleOptionSlider;/*
The QScrollBar widget provides a vertical or horizontal scroll bar.滚动条是一个控件,它允许用户访问文档中比用于显示文档的小部件大的部分。
它提供了用户当前在文档中的位置和文档可见数量的可视化指示。
滚动条通常配备其他控件,以实现更精确的导航。Qt以适合每个平台的方式显示滚动条。如果您需要在另一个窗口小部件上提供滚动视图,
则使用 QScrollArea类可能更方便,因为它提供了视口窗口小部件和滚动条。如果您需要使用QAbstractScrollArea为专用小部件实现类似的功能,QScrollBar很有用;
例如,如果您决定继承 QAbstractltemView.对于使用 slider 控件获取给定范围内的值的大多数其他情况,Qslider类可能更适合您的需要。滚动条通常包括四个单独的控件:滑块、滚动箭头和页面控件。a.滑块提供了一种快速访问文档任何部分的方法,但不支持在大型文档中进行精确导航。b.卷轴箭头是按钮,可用于准确导航到文档中的特定位置。对于连接到文本编辑器的垂直滚动条,这些通常会将当前位置上下移动一“行”,并少量调整滑块的位置。在编辑器和列表框中行”可能指一行文本;在图像查看器中,“行"可能指20像素。c.页面控件是拖动滑块的区域(滚动条的背景)。单击此处可将滚动条向单击方向移动一个页面。该值通常与滑块的页面长度相同。QScrollBar 只提供整数范围。请注意,虽然 QScrollBar 可以处理非常大的数字,
但当前屏幕上的滚动条无法有效地表示超过约 100,000 像素的范围。
超过这个范围,用户就很难使用键盘或鼠标控制滑块,滚动箭头也将变得有限。ScrollBar从 QAbstractSlider继承了一组全面的信号:Value Changed()是在滚动条的值改变时发出的。The tracking() 确定在用户交互过程中是否会发射此信号。Range Changed()是在滚动条的值范围改变时发出的。当用户开始拖动滑块时,会发出sliderPressed()事件.当用户 拖动滑块时,会发出sliderMoved()事件。当用户 释放滑块时,会发出sliderReleased()当用户交互或通过triggerAction()函数更改滚动条时,会发出ActionTriggered()。A scroll bar can be controlled by the keyboard,
but it has a default focusPolicy() of Qt::NoFocus.
Use setFocusPolicy() to enable keyboard interaction with the scroll bar:Left/Right move a horizontal scroll bar by one single step.Up/Down move a vertical scroll bar by one single step.PageUp moves up one page.PageDown moves down one page.Home moves to the start (minimum).End moves to the end (maximum).The slider itself can be controlled by using the triggerAction() function to
simulate模拟 user interaction with the scroll bar controls.
This is useful if you have many different widgets that use a common range of values.
Most GUI styles use the pageStep() value to calculate the size of the slider.*/class Q_WIDGETS_EXPORT QScrollBar : public QAbstractSlider //滚动条
{Q_OBJECT //又插入了此宏private:friend class QAbstractScrollAreaPrivate;friend Q_WIDGETS_EXPORT //友元函数QStyleOptionSlider qt_qscrollbarStyleOption(QScrollBar *scrollBar);Q_DISABLE_COPY(QScrollBar)Q_DECLARE_PRIVATE(QScrollBar)#if QT_CONFIG(itemviews) //经测试,是有这个定义的。 #if 是成立的friend class QTableView;friend class QTreeViewPrivate;friend class QCommonListViewBase;friend class QListModeViewBase;friend class QAbstractItemView;
#endifpublic://Constructs a vertical scroll bar. //看来是默认构造垂直滚动条//The parent argument is sent to the QWidget constructor.//The minimum defaults to 0, the maximum to 99,//with a singleStep size of 1 and a pageStep size of 10,//and an initial value of 0.explicit QScrollBar(QWidget * parent = nullptr);explicit QScrollBar(Qt::Orientation, QWidget * parent = nullptr);//Constructs a scroll bar with the given orientation.~QScrollBar();QSize sizeHint() const override;bool event(QEvent * event) override;protected:void paintEvent(QPaintEvent * ) override;void mousePressEvent(QMouseEvent * ) override;void mouseReleaseEvent(QMouseEvent * ) override;void mouseMoveEvent(QMouseEvent * ) override;void hideEvent(QHideEvent * ) override;#ifndef QT_NO_CONTEXTMENUvoid contextMenuEvent(QContextMenuEvent * ) override;
#endif#if QT_CONFIG(wheelevent)void wheelEvent(QWheelEvent * ) override;
#endifvirtual void initStyleOption(QStyleOptionSlider * option) const;void sliderChange(SliderChange change) override;
/* //这是重写父类的普通成员函数
class QAbstractSlider : public QWidget
{enum SliderChange {SliderRangeChange ,SliderOrientationChange,SliderStepsChange ,SliderValueChange};
};
*/}; //完结 class QScrollBar : public QAbstractSliderQT_END_NAMESPACE#endif // QSCROLLBAR_H
(2)
嘘嘘