1. 程式人生 > 實用技巧 >Qt—QSlider 使用總結

Qt—QSlider 使用總結

轉載自[一去、二三裡]的Qt 之 QSlider

簡述

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 在(垂直)滑塊右側繪製刻度線

基本使用

下面我們來看一個示例。

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 處結束)。


擴充套件:各種樣式表設定

樣式表1


/* 首先是設定主體 */
QSlider{
border-color: #bcbcbc;
}
QSlider::groove:horizontal {                                
border: 1px solid #999999;                             
height: 1px;                                           
margin: 0px 0;                                         
left: 5px; right: 5px; 
}
/* 設定中間的那個滑動的鍵 */
QSlider::handle:horizontal {                               
border: 0px ;                           
border-image:  url(:/NiceTalk/Images/Setting/volume_nor.png);
width: 15px;                                           
margin: -7px -7px -7px -7px;                  
} 
/* 還沒有滑上去的地方 */
QSlider::add-page:horizontal{
background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 #bcbcbc, 	stop:0.25 #bcbcbc, stop:0.5 #bcbcbc, stop:1 #bcbcbc); 
}
/* 已經劃過的從地方 */
QSlider::sub-page:horizontal{                               
background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 #439cf3, 	stop:0.25 #439cf3, stop:0.5 #439cf3, stop:1 #439cf3);                     
}

樣式表2

其實,豎直的和水平的一模一樣,只是變了名稱而已。


QSlider{
border-color: #cbcbcb;
}
QSlider::groove:vertical {  
background: #cbcbcb;  
width: 6px;  
border-radius: 1px;  
padding-left:-1px;  
padding-right:-1px;  
padding-top:-1px;  
padding-bottom:-1px;  
} 
QSlider::sub-page:vertical {  
background: #cbcbcb;  
border-radius: 2px;  
} 
QSlider::add-page:vertical {  
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,   
    stop:0 #439cf4, stop:1 #439cf4);  
background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,  
    stop: 0 #439cf4, stop: 1 #439cf4);  
width: 10px;  
border-radius: 2px;  
}
QSlider::handle:vertical   
{     
border-image: url(:/NiceTalk/Images/Setting/volume_nor.png);
margin: -2px -7px -2px -7px; 
height: 17px;
}  

樣式表3


QSlider::groove:horizontal {
border: 0px solid #bbb;
}
QSlider::sub-page:horizontal {
background: rgb(235,97,0);
border-radius: 0px;
margin-top:8px;
margin-bottom:8px;
}
QSlider::add-page:horizontal {
background: rgb(255,255, 255);
border: 0px solid #777;
border-radius: 2px;
margin-top:8px;
margin-bottom:8px;
}
QSlider::handle:horizontal {
background: rgb(255,153,102);
border: 1px solid rgb(255,153,102);
width: 14px;
height:10px;
border-radius: 7px;
margin-top:2px;
margin-bottom:2px;
}
QSlider::handle:horizontal:hover {
background: rgb(255,128,6);
border: 1px solid rgba(102,102,102,102);
border-radius: 7px;
}
QSlider::sub-page:horizontal:disabled {
background: #bbb;
border-color: #999;
}
QSlider::add-page:horizontal:disabled {
background: #eee;
border-color: #999;
}
QSlider::handle:horizontal:disabled {
background: #eee;
border: 1px solid #aaa;
border-radius: 4px;
}

樣式表4


/* 以下是槽 */
QSlider::groove:horizontal{
    background:#aaaaaa;
    height:24px;
    border-radius:10px;
}
/* 設定中間的那個滑動的鍵 */
QSlider::handle:horizontal{
    width: 42px;
    margin-top: -9px;
    margin-bottom:-9px;
    border-radius: 18px;
    background: #f8f8f8;
}
/* 已經劃過的從地方 */
QSlider::sub-page:horizontal{
    border-radius:10px;
    background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #5599FF, stop:1 #498ff8);
}

擴充套件:滑鼠點選進行滑動條滑塊定位

方法一:使用事件過濾器。

// 滑鼠點選進行滑動條滑塊定位
bool Device::eventFilter(QObject *obj, QEvent *event)
{
    if(obj==pSlider_l)
    {
        if (event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton)
            {
               int dur = pSlider_l->maximum() - pSlider_l->minimum();
               int pos = pSlider_l->minimum() + dur * ((double)mouseEvent->x() / pSlider_l->width());
               if(pos < (pSlider_l->sliderPosition())||pos > (pSlider_l->sliderPosition()))
                {
                  pSlider_l->setValue(pos);
                }
            }
        }
    }
 
    return QObject::eventFilter(obj,event);
}

方法二:自定義滑鼠點選事件。

// 方法是滑鼠點選事件
void XSlider::mousePressEvent(QMouseEvent *e)
{
	// 向上父控制元件傳遞滑鼠事件;否則,滑鼠其他事件會失靈
	QSlider::mousePressEvent(e);
	// 百分比
	double p = (double)e->pos().x() / (double)width();
	int val = p*(maximum()-minimum())+minimum();
	this->setValue(val);
}

參考:

Qt中QSlider的樣式表設定

【Qt】QSlider點選定位的提高使用度的實現

qt中QScrollBar/QSlider滑鼠點選滑條不能到達所點選的位置,只移動step距離修改