zoukankan      html  css  js  c++  java
  • 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点哪里就到哪里
    

    [更多参考]:

  • 相关阅读:
    C#中的Singleton模式
    C#中的TemplateMethod模式
    从汉堡加料说起——浅谈C#中的Decorator模式
    轻松实现记录与撤销——C#中的Command模式
    分布式系统一致性问题与Raft算法(上)
    Scala函数式编程(五) 函数式的错误处理
    Spark RPC框架源码分析(三)Spark心跳机制分析
    AnalyticDB实现和特点浅析
    java并发编程 --并发问题的根源及主要解决方法
    数据的存储结构浅析LSM-Tree和B-tree
  • 原文地址:https://www.cnblogs.com/ZY-Dream/p/10599673.html
Copyright © 2011-2022 走看看