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點哪里就到哪里

[更多參考]:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM