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