正规的网站制作平台,河北网站建设,网易企业邮箱密码格式,百度线上推广QAbstractSlider 类、 QSCrollBar 类、 QSlider 类 一、 基本原理 1、 QAbstractSlider 继承自 QWidget#xff0c;该类主要用于提供一个范围内的整数值#xff0c; 2、 QAbstractSlider 类是 QScrollBar 类(滚动条)、 QSlider 类(滑块)、 QDial 类(表盘)的父类#xff0c;因…
QAbstractSlider 类、 QSCrollBar 类、 QSlider 类 一、 基本原理 1、 QAbstractSlider 继承自 QWidget该类主要用于提供一个范围内的整数值 2、 QAbstractSlider 类是 QScrollBar 类(滚动条)、 QSlider 类(滑块)、 QDial 类(表盘)的父类因 此该类的属性和函数对这 3 个类都是可行的。 3、对于滚动条和滑块主要就是对其相关的一些值的设置对于其外观样式比较单一所以滚 动条和滑块的主要功能集中在 QAbstractSlider 类中这个类提供了滚动条和滑块的共同作 用主要是对其值作了描述对于他们的外形分别由 QScrollBar 类和 QSlider 决定。 所 以单独使用 QAbstractSlider 类什么也干不了通常需要使用他的子类若使用 sho()显示 该类的对象他就是一个空的什么也没有的窗口。 4、注意滚动条默认是不接受键盘焦点的要使滚动条接受键盘焦点需使用 QWidget::setFocusPolicy()函数设置焦点策略。 5、滚动条、滑块、表盘的外观样式见下表
二、 最大/最小值和步长 1、 最大/最小值 步长 滚动范围滚动条的滑块大小 文档长度 1)、 单个步长是指按一下滚动条(垂直方向)的向上/下箭头或按下键盘的上/下键时滑块 移动的距离。水平方向类似 2)、 页面步长通常是指在滚动条上按下 page up 和 page down 键时移动的距离。 默认值 通常为 10。 3)、 最大和最小值是个逻辑意义上的值它们不会改变滑块或滚动条的长度详见后文。 4)、滚动范围是指滚动条滑块可移动的距离。滚动范围始终是最大值减去最小值。 具体见下面的图示。 2、 滑块像素大小(即实际大小) 1)、 像素大小就是指滑块本身的大小(即使用 resize()函数设置的大小)这个大小是以像素 为单位的以上讲解的最大/最小值、滚动范围、页面步长、文档长度都是逻辑长度 是没有单位的。 2)、滑块像素大小受到页面步长的影响 3)、本小节会把按下 page up 或 page down 时滚动到另一端的次数简称为滚动次数 4)、在不影响滑块像素大小的最小大小和最大大小时可按如下公式计算(可参阅上一点 的图示)
滚动次数(最大值 - 最小值) 除以 (页面步长) 滑块像素大小 (文档长度的像素大小) 除以 (滚动次数 1)。
滚动范围 最大值 - 最小值、 文档逻辑长度最大值 - 最小值 页面步长 滚动范围 页面步长 滑块逻辑大小 页面步长 滚动一次的像素距离 (文档像素大小 - 滑块像素大小) 除以 滚动次数 比如假设文档像素大小为 40滚动次数为 1则滑块像素大小为 20 像素若滚 动次数为 2则滑块像素大小为 40/313.333 像素。由此可见滚动次数越多滑块 像素大小就越小滚动次数越少滑块像素大小就越大。 5)、当按以上公式计算出来的滑块像素大小小于滑块的最小像素大小时滑块的像素大小 始终为最小像素大小保持不变。此时滚动次数、最小/最大值、滚动范围都不会改变 但是文档逻辑长度和滑块逻辑大小不能再按以上公式进行计算。但滚动一次的像素距 离比较好计算其公式为 滚动一次的像素距离 (文档像素大小 - 滑块像素最小大小) 除以 滚动次数
三、 跟踪(Tracking)与当前值(Value)、 当前位置(Position) 1、 跟踪若启用跟踪则在拖动滑块或滚动条时会发送 valueChanged()信号若禁用了跟踪 则只在用户释放滑块或滚动条时才会发送 valueChanged()信号 2、 当启用了跟踪时当前值与当前位置是相同的 3、 若未启用跟踪则当前值与当前位置是不同的 原理见下图 四、 QAbstractSlider 类中的属性和函数 1、 orientation : Qt::Orientation 访问函数 Qt::Orientation orientation() const; void setOrientation(Qt::Orientation); //槽 设置滚动条或滑块的方向只能是 Qt::Vertical(默认)或 Qt::Horizontal 2、 sliderDown : bool 访问函数 bool isSliderDown() const; void setSliderDown(bool); 描述滑块是否被按下设置此属性后在外观上可能会没有变化但会发送 sliderPressed() 信号 3、 maximum : int 访问函数 int maximum() const; void setMaximum (int); 4、 minimum : int 访问函数 int minimum() const; void setMinimum (int); 设置最大和最小值。 6、 pageStep : int 访问函数 int pageStep () const; void setPageStep(int);页面步长 7、 singleStep : int 访问函数 int singleStep() const; void setSingleStep (int);单个步长 8、 sliderPosition : int 访问函数 int sliderPosition() const; void setSliderPosition (int); 信号 void sliderMoved(int value); 滑块的当前位置若启用了跟踪则此值与 value 属性的值相同。 9、 tracking : bool 访问函数 bool hasTracking () const; void setTracking (bool); 是否启用跟踪若启用跟踪则在拖动滑块或滚动条时会发送 valueChanged()信号若禁 用了跟踪则只在用户释放滑块或滚动条时才会发送 valueChanged()信号。 10、 value : int 访问函数 int value()const; void setValue(int); //槽 信号 void valueChanged(int value); 滑块的当前值该值被强制在最大值和最小值的范围内。 11、 invertedAppearance bool 访问函数 bool invertedAppearance() const; void setInvertedAppearance (bool); 最大值和最小值是否出现在相反的位置若为 flase(默认)则不反转若为 true 则反转。 该属性对滑块和表盘(dial)更有意义对于滚动条则取决于样式大多数样式会忽略滚动 条的此属性。 具体原理见下图 12、 invertedControls : bool 访问函数 bool invertedControls() const; void setInvertedControls (bool);是否反转鼠标滚轮和键盘事件若为 false则鼠标滚轮向上滚或使用向上键将使值向最 小值调整。 注意该属性是使用滚轮或键盘上的方向键移动滑块的方向为最大/最小值方 向且影响的是键盘和鼠标滚轮事件也就是说该属性不会影响滚动条上的箭头。 具体原 理见下图 13、 QAbstractSlider(QWidget *parent Q_NULLPTR); //构造函数 14、 void setRange(int min, int max); //槽 设置滑块的最大/最小值与 maximum 和 mimimum 属性相同只不过使用该函数更方便 15、 void triggerAction(SliderAction action) 触发滑块 SliderAction 枚举见下表此函数可以用来以编程的方式调整滑块的位置比 如 triggerAction(QAbstractSlider::SliderPageStepAdd)表示把滑块向最大值方长移动一个页面步长。
QAbstractSlider::SliderAction 枚举(无标志) 作用描述触发滑块动作的方式成员值说明QAbstractSlider::SliderNoAction0无动作QAbstractSlider::SliderSingleStepAdd1向最大值方向移动一个单个步长的距离QAbstractSlider::SliderSingleStepSub2向最小值方向移动一个单个步长的距离QAbstractSlider::SliderPageStepAdd3向最大值方向移动一个页面步长的距离QAbstractSlider::SliderPageStepSub4向最小值方向移动一个页面步长的距离QAbstractSlider::SliderToMinimum5把滑块移至最小值(home 键)QAbstractSlider::SliderToMaximum6把滑块移至最大值(end 键)QAbstractSlider::SliderMove7移动滑块
五、 QAbstractSlider 类中的信号 1、 void rangeChanged(int min, int max) 当最大/最小值改变时发送此信号。 2、 void sliderMoved(int value) 当 sliderDown 属性为 true且滑块移动时发送此信号即使关闭跟踪(tracking 属性) 也会发送此信号。通常表示用户使用鼠标拖动滑块时注意使用键盘方向键或 page up、 page down 或按下滚动条上的向上/下箭头都不会触发该信号使用鼠标时需要按住滑块再 拖动滑块才会发送此信号。 3、 void sliderPressed() 4、 void sliderReleased() 当用户用鼠标按下或释放滑块时发送以上信号可使用 setSliderDown()函数以编程的方式 发送以上信号。 注意以上信号是鼠标信号也就是说对键盘可能会无效。 5、 void valueChanged(int value) 当滑块的值改变时发送此信号 tracking 属性对此信号有影响。 6、 void actionTriggered(int action) 触发滑块时发送 action 表示触发滑块时的动作 见 triggerAction()函数。 比如若滑快以 是单个步长增长则 action 为 1(即 QAbstractSlider::SliderSingleStepAdd) 单击 end 可触发 QAbstractSlider::SliderToMaximum此时 action 为 6同理单击 home 可触发 QAbstractSlider::SliderToMinimum使用其他方式不会触发最大/最小值。 六、 QScrollBar 类
1、 QScrollBar 类就只有两个构造函数 其默认为取值为垂直最小值为 0最大值为 100 单个步长为 1页面步长为 10初始位置为 0。 原型如下 QScrollBar(QWidget *parent Q_NULLPTR); QScrollBar(Qt::Qrientation orientation, QWidget *parent Q_NULLPTR); 七、 QSlider 类 1、 QSlider 类除了从父类继承来的特性就仅有刻度线的绘制了详见下文。 2、 QSlider (QWidget * parent Q_NULLPTR); //构造函数默认为垂直。 QSlider (Qt :: Orientation orientation QWidget * parent Q_NULLPTR) 3、 tickInterval int 访问函数 int tickInterval() const; void setTickInterval(int);刻度线之间的间隔(见右图)间隔值是一个逻辑值而不是像素值 若为 0(默认)将在单个步长和页面步长之间选择。 4、 tickPosition TickPosition 访问函数 TickPosition tickPosition() const; void setTickPosition(TickPosition); 描述刻度线的位置默认为 QSlider::NoTicks(无刻度线)枚举 TickPosition 见下表
QSlider::TickPosition 枚举(无标志) 作用描述刻度线的位置成员值说明QSlider::NoTicks0无刻度线QSlider::TicksBothSides3在两侧绘制刻度线QSlider::TicksAbove1在(水平)滑块上方绘制刻度线QSlider::TicksBelow2在(水平)滑块下方绘制刻度线QSlider::TicksLeftTicksAbove在(垂直)滑块左侧绘制刻度线QSlider::TicksRightTicksBelow在(垂直)滑块右侧绘制刻度线
八、 QDial 类 1、表盘的原理见下图 2、 QDial 类中的属性
1)、 QDial(QWidget *parent Q_NULLPTR); //构造函数 2)、 notchesVisible : bool 访问函数 bool notchesVisible () const;
void setNotchesVisible (bool);
是否显示凹槽(即刻度线)默认为 false(不显示)
3)、 notchSize : const int 访问函数 int notchSize () const; 返回凹槽的大小凹槽的大小的原理见上图示例默认为 1。
4)、 notchTarget : qreal 访问函数 qreal notchTarget() const; void setNotchTarget (double); 设置凹槽的像素数默认为 3.7 像素为了便于计算可设置为 1。
5)、 wrapping : bool 访问函数 bool wrapping () const; void setWrapping (bool);是否开启循环默认为 false(未开启)
int nMin 0;
int nMax 200;
int nSingleStep 20;
// 微调框
QSpinBox *pSpinBox new QSpinBox(this);
pSpinBox-move(100, 50);
pSpinBox-setMinimum(nMin); // 最小值
pSpinBox-setMaximum(nMax); // 最大值
pSpinBox-setSingleStep(nSingleStep); // 步长
// 滑动条
QSlider *pSlider new QSlider(this);
pSlider-move(150, 50);
pSlider-setOrientation(Qt::Horizontal); // 水平方向
pSlider-setMinimum(nMin); // 最小值
pSlider-setMaximum(nMax); // 最大值
pSlider-setSingleStep(nSingleStep); // 步长
// 连接信号槽相互改变
connect(pSpinBox, SIGNAL(valueChanged(int)), pSlider, SLOT(setValue(int)));
connect(pSlider, SIGNAL(valueChanged(int)), pSpinBox, SLOT(setValue(int)));
pSpinBox-setValue(10); QSlider *pSlider new QSlider(this);
pSlider-move(150, 50);
pSlider-setOrientation(Qt::Horizontal); // 水平方向
pSlider-setMinimum(nMin); // 最小值
pSlider-setMaximum(nMax); // 最大值
pSlider-setSingleStep(nSingleStep); // 步长
// pSlider-setTickInterval(40); // 设置刻度间隔
//描述刻度线的位置
pSlider-setTickPosition(QSlider::TicksAbove); //QSlider::TicksAbove 刻度在上方