Qt基础学习---滑动条之QSlider

Qt滑动条基本用法:
//mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
class QLineEdit;
class QSlider;
class MyDialog : public QDialog
{
  Q_OBJECT
public:
  explicit MyDialog(QWidget *parent = 0);
signals:
public slots:
  void setLineEditValue(int value);
private:
  QLineEdit *lineEdit;
  QSlider *slider;
};
#endif // MYDIALOG_H

//mydialog.cpp
#include "mydialog.h"
#include <QtGui/QLineEdit>
#include <QtGui/QSlider>
#include <QtGui/QHBoxLayout>
MyDialog::MyDialog(QWidget *parent) :
  QDialog(parent)
{
  lineEdit = new QLineEdit("50");

  //新建一个水平方向的滑动条QSlider控件
  slider = new QSlider(Qt::Horizontal);
  //设置滑动条控件的最小值
  slider->setMinimum(0);
  //设置滑动条控件的最大值
  slider->setMaximum(100);
  //设置滑动条控件的值
  slider->setValue(50);

  //信号和槽 当滑动条的值发生改变时,即产生一个valueChanged(int)信号 设置QLineEdit控件的显示文本
  connect(slider, SIGNAL(valueChanged(int)), this, SLOT(setLineEditValue(int)));

  QHBoxLayout *layout = new QHBoxLayout();
  layout->addWidget(lineEdit);
  layout->addWidget(slider);

  this->setLayout(layout);
  this->resize(200, 50);
  this->setWindowTitle("QSliderDemo");
}

void MyDialog::setLineEditValue(int value)
{
  int pos = slider->value();
  QString str = QString("%1").arg(pos);
  lineEdit->setText(str);
}

//main.cpp
#include <QtGui/QApplication>
#include "mydialog.h"
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MyDialog dialog;
  dialog.show();
  return a.exec();
}

程序运行结果:

具体介绍:

QSlider很少有自己的函数,大部分功能在QAbstractSlider中。

最有用的函数是setValue(),用来设置滑块的当前值;

triggerAction()来模拟点击的效果(对快捷键有用);

setSingleStep()、setPageStep()用来设置步长;

setMinimum()和setMaximum()用于定义滚动条的范围。

QSlider提供了一些方法来控制刻度标记:

可以使用setTickPosition()来表示刻度标记的位置,

使用setTickInterval()来指定刻度的间隔;

当前设置的刻度位置和间隔可以分别使用tickPosition()和tickInterval()函数来查询。

QSlider继承了一组全面的信号

valueChanged()----- 当滑块的值发生了改变,发射此信号。
tracking()-----确定在用户交互时,是否发出此信号。
sliderPressed()----- 当用户按下滑块,发射此信号。
sliderMoved()-----当用户拖动滑块,发射此信号。
sliderReleased()----- 当用户释放滑块,发射此信号。

QSlider只提供整数范围

注意:尽管QSlider可以处理非常大的数字,但是对于用户来说,难以准确使用很大范围的滑块。

滑块接受Tab键的焦点,并同时提供了一个鼠标滚轮和键盘接口。键盘接口如下:

Left/Right 移动水平滑块一个步长。

Up/Down 移动垂直滑块一个步长。

PageUp 上移一页。

PageDown 下移一页。

Home 移动至起始位置(最小值)。

End 移动至结束位置(最大值)

代码

int nMin = 0;
int nMax = 200;
int nSingleStep = 10;
​
// 微调框
QSpinBox *pSpinBox = new QSpinBox(this);
pSpinBox->setMinimum(nMin);  // 最小值
pSpinBox->setMaximum(nMax);  // 最大值
pSpinBox->setSingleStep(nSingleStep);  // 步长
​
// 滑动条
QSlider *pSlider = new QSlider(this);
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);12345678910111213141516171819202122

通过setMinimum()与setMaximum()函数,我们将取固定到一个合适的范围(0 - 200),连接信号槽后,当QSpinBox的值发生改变时,QSlider的值也会发生相应变化;反之亦然。最后,我们使用setValue()将QSpinBox的值设置为10,由于信号槽已经连接,所以这时QSlider的值也会发生改变。

QSlider的点击与拖动
lass SliderClick : public QSlider  
{  
public:  
    SliderClick(QWidget *parent = 0) : QSlider(parent)  
    {  
    }  
protected:  
    void mousePressEvent(QMouseEvent *ev)  
    {  
        //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况  
        QSlider::mousePressEvent(ev);  
        //获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)  
        double pos = ev->pos().x() / (double)width();  
        setValue(pos * (maximum() - minimum()) + minimum());  
        //向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理  
        QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));  
        QCoreApplication::sendEvent(parentWidget(), &evEvent);  
    }  
};  
QSlider点击不到该位置

方法一:可以继承重写一个QSlider

方法二:1.instaneventfiliter(this);slider安装一个事件过滤器

2.在eventfilter(QObject,QEvent)中拦截它,很简单吧

slider=new QSlider(this); 
slider->installEventFilter(this);
​
bool trayIconMenu::eventFilter(QObject *obj, QEvent *event)
{
    if(obj==slider)
    {
        if (event->type()==QEvent::MouseButtonPress)           //判断类型
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton) //判断左键
            {
               int dur = slider->maximum() - slider->minimum();
               int pos = slider->minimum() + dur * ((double)mouseEvent->x() / slider->width());
               if(pos != slider->sliderPosition())
                {
                  slider->setValue(pos);
                }
            }
        }
    }
    return QObject::eventFilter(obj,event);
}
okay!即可以实现slider点哪里就到哪里

[更多参考]:

posted @ 2019-03-26 13:48  Z--Y  阅读(9706)  评论(1编辑  收藏  举报