Qt QSlider滑块详解

一、设计器设置

在这里插入图片描述

QSlider很少有自己的函数,大部分功能在QAbstractSlider中。

最有用的函数是setValue(),用来设置滑块的当前值;

triggerAction()来模拟点击的效果(对快捷键有用);

setSingleStep()、setPageStep()用来设置步长;

setMinimum()和setMaximum()用于定义滚动条的范围。

QSlider提供了一些方法来控制刻度标记:

可以使用setTickPosition()来表示刻度标记的位置,

使用setTickInterval()来指定刻度的间隔;

当前设置的刻度位置和间隔可以分别使用tickPosition()和tickInterval()函数来查询。

二、常用信号

  • void valueChanged(int value);当滑块的值发生了改变,发射此信号。tracking()确定在用户交互时,是否发出此信号。
  • void sliderPressed();当用户按下滑块,发射此信号。
  • void sliderMoved(int position);当用户拖动滑块,发射此信号。
  • void sliderReleased();当用户释放滑块,发射此信号。
  • void rangeChanged(int min, int max);
  • void actionTriggered(int action);

QSlider只提供整数范围。

注意:尽管QSlider可以处理非常大的数字,但是对于用户来说,难以准确使用很大范围的滑块。

三、键盘接口

滑块接受Tab键的焦点,并同时提供了一个鼠标滚轮和键盘接口。键盘接口如下:

  • Left/Right 移动水平滑块一个步长。
  • Up/Down 移动垂直滑块一个步长。
  • PageUp 上移一页。
  • PageDown 下移一页。
  • Home 移动至起始位置(最小值)。
  • End 移动至结束位置(最大值)

四、刻度位置

枚举 QSlider::TickPosition

这个枚举指定刻度线相对于滑块和用户操作的位置。

常量描述
QSlider::NoTicks0不绘制任何刻度线
QSlider::TicksBothSides3在滑块的两侧绘制刻度线
QSlider::TicksAbove1在(水平)滑块上方绘制刻度线
QSlider::TicksBelow2在(水平)滑块下方绘制刻度线
QSlider::TicksLeftTicksAbove在(垂直)滑块左侧绘制刻度线
QSlider::TicksRightTicksBelow在(垂直)滑块右侧绘制刻度线

基本使用
下面我们来看一个示例,结合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);12345678910111213141516171819202122

通过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;
}12345678910

刻度位置及间隔
为了演示效果,这里我们不再采用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);  //刻度在上方1234567

由于我们的取值范围是:0 - 200,步长为10。所以,在绘制刻度的时候,一共有21个刻度点(从0开始,每隔步长10绘制一个点,到200处结束)。

当我们使用setTickInterval(40)设置刻度间隔后,在绘制刻度的时候,就会有6个刻度点(从0开始,每隔步长40绘制一个点,到200处结束)。

如下所示:
在这里插入图片描述
也就是说,刻度点的个数 = 最大值 / 刻度间隔 + 1。
QSlider的点击与拖动


class 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

//重写鼠标点击事件
void XSlider::mousePressEvent(QMouseEvent *ev) 
{
	//qDebug() << ev->pos().x() << endl;
	QSlider::mousePressEvent(ev);
	//百分比
	double p = static_cast<double>(ev->pos().x()) / static_cast<double>(width());
	int val = p*(maximum() - minimum()) + minimum();	//要判断最小值是否为0
	setValue(val);
}

方法二: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点哪里就到哪里

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt中使用QSlider时,可以通过一些简单的步骤来实现在滑块的上方显示当前值。 首先,我们需要在Qt设计师中将一个QSlider控件放置在窗口中。确保将QSlider的名称设为slider,并根据需要设置最小值、最大值和初始值。 接下来,我们需要在代码中使用一个QLabel控件来显示滑块的当前值。在类的构造函数中创建一个QLabel实例,并将其名称设为label。然后,我们可以使用QSlider的valueChanged信号来更新label的文本。 具体代码如下所示: ``` #include <QtWidgets> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { // 创建一个垂直布局管理器 QVBoxLayout *layout = new QVBoxLayout(this); // 创建一个QSlider控件并设置最小值、最大值和初始值 slider = new QSlider(Qt::Horizontal, this); slider->setMinimum(0); slider->setMaximum(100); slider->setValue(50); // 创建一个QLabel控件用于显示滑块的当前值 label = new QLabel(QString::number(slider->value()), this); // 将滑块和标签控件添加到布局中 layout->addWidget(slider); layout->addWidget(label); // 连接滑块的valueChanged信号到更新标签文本的槽函数 connect(slider, &QSlider::valueChanged, this, &MyWidget::updateLabel); } private slots: void updateLabel(int value) { // 根据滑块的当前值更新标签的文本 label->setText(QString::number(value)); } private: QSlider *slider; QLabel *label; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget widget; widget.show(); return a.exec(); } ``` 通过以上步骤,我们就可以在滑块的上方显示当前值。每当滑块的值发生改变时,标签的文本也会相应地更新。 ### 回答2: 在Qt中,使用QSlider控件来创建滑块是非常常见的。如果需要在滑块上方显示当前值,我们可以通过以下步骤实现: 1. 创建QSlider控件,并设置好滑块的范围和初始值。 ```cpp QSlider *slider = new QSlider(Qt::Horizontal); slider->setMinimum(0); slider->setMaximum(100); slider->setValue(50); ``` 2. 创建一个QLabel控件,用来显示当前值。 ```cpp QLabel *valueLabel = new QLabel(QString::number(slider->value())); ``` 3. 使用布局管理器将滑块和值标签放在一起。 ```cpp QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(slider); layout->addWidget(valueLabel); ``` 4. 创建一个槽函数,当滑块的值改变时,更新值标签的显示。 ```cpp QObject::connect(slider, &QSlider::valueChanged, [=](int value){ valueLabel->setText(QString::number(value)); }); ``` 通过以上步骤,我们可以实现在滑块上方显示当前值的效果。当滑块的值发生改变时,值标签会自动更新显示当前的值。可以根据需要对控件的样式和布局进行调整,以满足具体的界面需求。 ### 回答3: Qt的QSlider类是一个滑块控件,可以用于在一定范围内调节值。默认情况下,滑块只会显示一个滑块头,并没有显示当前的值。如果希望在滑块上方显示当前的值,我们可以使用以下方法: 首先,我们可以使用QSlider的valueChanged信号来捕捉滑块值的变化。例如,我们可以在窗口的构造函数中连接该信号到一个自定义的槽函数,代码如下: ``` connect(ui->slider,SIGNAL(valueChanged(int)),this,SLOT(onSliderValueChanged(int))); ``` 然后,我们在槽函数中可以更新一个QLabel控件来显示当前的值。例如,我们可以在窗口类中添加一个QLabel控件,并在槽函数中更新其显示的文本,代码如下: ``` void MainWindow::onSliderValueChanged(int value) { ui->label->setText(QString("当前值:%1").arg(value)); } ``` 最后,我们将该QLabel控件放置在滑块上方的位置,并设置合适的样式和布局。例如,我们可以使用QVBoxLayout来将QSlider和QLabel添加到同一个垂直布局中,以保证它们能够正确显示在一起。 通过以上步骤,我们就可以在滑块上方显示当前的值了。每当滑块的值发生变化时,QLabel控件的文本就会更新为最新的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值