1. 程式人生 > >Qt之QSlider的使用方法

Qt之QSlider的使用方法

參考:http://blog.csdn.net/liang19890820/article/details/52299600

QSlider部件提供了一個垂直或水平滑動條。滑塊是一個用於控制有界值的典型部件。它允許使用者沿水平或垂直方向移動滑塊,並將滑塊所在的位置轉換成一個合法範圍內的值。

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 移動至結束位置(最大值)

刻度位置

列舉 QSlider::TickPosition,這個列舉指定刻度線相對於滑塊和使用者操作的位置。

常量 描述
QSlider::NoTicks 0 不繪製任何刻度線
QSlider::TicksBothSides 3 在滑塊的兩側繪製刻度線
QSlider::TicksAbove 1 在(水平)滑塊上方繪製刻度線
QSlider::TicksBelow 2 在(水平)滑塊下方繪製刻度線
QSlider::TicksLeft TicksAbove 在(垂直)滑塊左側繪製刻度線
QSlider::TicksRight TicksBelow 在(垂直)滑塊右側繪製刻度線
下面我們來看一個示例,結合QSlider與上節分享的QSpinBox(微調框),來讓他們彼此之間相互更新。

效果

這裡寫圖片描述

原始碼

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);
通過setMinimum()與setMaximum()函式,我們將取固定到一個合適的範圍(0 - 200),連線訊號槽後,當QSpinBox的值發生改變時,QSlider的值也會發生相應變化;反之亦然。最後,我們使用setValue()將QSpinBox的值設定為10,由於訊號槽已經連線,所以這時QSlider的值也會發生改變。

QSS樣式一併奉上:
QSlider::groove:horizontal {
        height: 6px;
        background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(124, 124, 124), stop: 1.0 rgb(72, 71, 71));
}
QSlider::handle:horizontal {
        width: 1px;
        background: rgb(0, 160, 230);
        margin: -6px 0px -6px 0px;
        border-radius: 9px;
}
刻度位置及間隔:為了演示效果,這裡我們不再採用QSS樣式控制。
效果
這裡寫圖片描述

原始碼

QSlider *pSlider = new QSlider(this);
pSlider->setOrientation(Qt::Horizontal);  // 水平方向
pSlider->setMinimum(nMin);  // 最小值
pSlider->setMaximum(nMax);  // 最大值
pSlider->setSingleStep(nSingleStep); // 步長
// pSlider->setTickInterval(40);  // 設定刻度間隔
pSlider->setTickPosition(QSlider::TicksAbove);  //刻度在上方
由於我們的取值範圍是:0 - 200,步長為10。所以,在繪製刻度的時候,一共有21個刻度點(從0開始,每隔步長10繪製一個點,到200處結束)。當我們使用setTickInterval(40)設定刻度間隔後,在繪製刻度的時候,就會有6個刻度點(從0開始,每隔步長40繪製一個點,到200處結束)。
如下所示:
這裡寫圖片描述

也就是說,刻度點的個數 = 最大值 / 刻度間隔 + 1。