QSlider 介绍与使用

news2024/9/24 11:30:56

1. 简单介绍一下QSlider

当使用 Qt 编写程序时,QSlider 是一个常用的控件,用于实现滑块功能。以下是 QSlider 的主要接口函数和信号:

接口函数:

  1. setMinimum(int min) / setMaximum(int max)

    • 设置滑块的最小值和最大值。
  2. setValue(int value)

    • 设置滑块的当前值。
  3. value() -> int

    • 返回滑块的当前值。
  4. setOrientation(Qt::Orientation orientation)

    • 设置滑块的方向,可以是水平方向(Qt::Horizontal)或垂直方向(Qt::Vertical)。
  5. setTickInterval(int ti)

    • 设置刻度间隔,即两个刻度之间的距离。
  6. setTickPosition(QSlider::TickPosition position)

    • 设置刻度的位置,可以是无刻度(NoTicks)、刻度在滑块下方(TicksBelow)、刻度在滑块上方(TicksAbove)或两侧都有刻度(TicksBothSides)。
  7. setSingleStep(int step)

    • 设置单步增量,即通过键盘或鼠标拖动滑块时增加或减少的值。
  8. setPageStep(int step)

    • 设置页面步长,即通过点击滑块周围的区域来增加或减少的值。
  9. setTracking(bool enable)

    • 设置滑块的跟踪模式,如果启用跟踪(enable=true),则每次滑块的值变化都会发出 valueChanged 信号;如果禁用跟踪(enable=false),则只有在滑块释放时才会发出 valueChanged 信号。

信号:

  1. valueChanged(int value)

    • 当滑块的值发生变化时发出的信号,参数 value 是当前的滑块值。
  2. sliderPressed()

    • 当用户按下滑块时发出的信号。
  3. sliderMoved(int value)

    • 当用户拖动滑块并且滑块的值发生变化时发出的信号,参数 value 是当前的滑块值。
  4. sliderReleased()

    • 当用户释放滑块时发出的信号。

这些接口函数和信号提供了丰富的功能和交互性,可以根据实际需求来使用和处理。

2.接下来我们来简单使用一下Slider

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QDebug>

class SliderExample : public QWidget {
public:
    SliderExample(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        label = new QLabel("0");
        layout->addWidget(label);

        slider = new QSlider(Qt::Horizontal);
        slider->setMinimum(0);
        slider->setMaximum(100);
        slider->setValue(0);

        // 绑定信号和槽
        connect(slider, &QSlider::valueChanged, this, &SliderExample::sliderMoved);
        connect(slider, &QSlider::sliderReleased, this, &SliderExample::sliderReleased);

        layout->addWidget(slider);

        setLayout(layout);

        setWindowTitle("Slider Example");
    }

private slots:
    void sliderMoved() {
        // 当滑块值变化时更新标签
        int value = slider->value();
        label->setText(QString::number(value));
    }

    void sliderReleased() {
        // 滑块释放时的操作
        qDebug() << "Slider released";
    }

private:
    QLabel *label;
    QSlider *slider;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    SliderExample window;
    window.show();

    return app.exec();
}

在这个例子中,QSlider 控件用于创建一个水平滑块。我们设置了最小值、最大值和初始值。然后,我们绑定了两个信号到槽函数上:

  • valueChanged 信号连接到 sliderMoved 槽函数上,用于在滑块值变化时更新标签。
  • sliderReleased 信号连接到 sliderReleased 槽函数上,用于在滑块释放时执行特定的操作。

您还可以通过设置样式表来自定义滑块的外观。例如,您可以更改滑块的颜色、背景、边框等。以下是一个设置样式表的示例:

// 在 initUI 函数中添加以下代码,设置样式表
slider->setStyleSheet("
    QSlider::groove:horizontal {
        border: 1px solid #999999;
        height: 10px;
        background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);
        margin: 2px 0;
    }

    QSlider::handle:horizontal {
        background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b3b3b3, stop:1 #787878);
        border: 1px solid #5c5c5c;
        width: 18px;
        margin: -2px 0;
        border-radius: 3px;
    }
")

3.重新实现一下QSlider的点击事件使其可以直接移动到鼠标点击的位置

要实现 QSlider 的点击事件,使其可以直接移动到鼠标点击的位置,您可以通过重写鼠标事件来实现。具体步骤如下:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QMouseEvent>
#include <QStyle>

class ClickableSlider : public QSlider {
public:
    ClickableSlider(Qt::Orientation orientation, QWidget *parent = nullptr) : QSlider(orientation, parent) {}

protected:
    void mousePressEvent(QMouseEvent *event) override {
        if (orientation() == Qt::Horizontal) {
            int value = QStyle::sliderValueFromPosition(minimum(), maximum(), event->x(), width());
            setValue(value);
        } else {
            int value = QStyle::sliderValueFromPosition(minimum(), maximum(), event->y(), height());
            setValue(value);
        }
        // event->accept();
        QSlider::mousePressEvent(event);
    }
};

class SliderExample : public QWidget {
public:
    SliderExample(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        label = new QLabel("0");
        layout->addWidget(label);

        slider = new ClickableSlider(Qt::Horizontal);
        slider->setMinimum(0);
        slider->setMaximum(100);
        slider->setValue(0);

        // 绑定信号和槽
        connect(slider, &QSlider::valueChanged, this, &SliderExample::sliderMoved);
        connect(slider, &ClickableSlider::sliderReleased, this, &SliderExample::sliderReleased);

        layout->addWidget(slider);

        setLayout(layout);

        setWindowTitle("Slider Example");
    }

private slots:
    void sliderMoved() {
        // 当滑块值变化时更新标签
        int value = slider->value();
        label->setText(QString::number(value));
    }

    void sliderReleased() {
        // 滑块释放时的操作
        qDebug() << "Slider released";
    }

private:
    QLabel *label;
    ClickableSlider *slider;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    SliderExample window;
    window.show();

    return app.exec();
}

在这个示例中,我们继承了 QSlider 类并重写了 mousePressEvent 函数。在该函数中,我们判断滑块的方向,并根据点击的位置重新计算值,并将其设置为滑块的当前值。这样,当用户点击滑块时,滑块就会直接移动到鼠标点击的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Trie树(1.字符串统计____2.最大异或对求解)

Trie树 文章目录 Trie树Trie字符串统计正解 最大异或对1.暴力 &#xff08;可以过6/10个测试点)2. Trie树模拟 用法&#xff1a;高效地存储和查找字符串集合的数据结构 存储形式&#xff1a; 将n个单词各个字符进行枚举&#xff0c;若是&#xff08;根节点所指向包含字符c&…

第九讲-I/0 Interface

1. I/O接口 2. 程序查询I/O方式 3. 中断与中断l/O方式

即插即用篇 | YOLOv8 引入 DoubleAttention 注意力机制 | 《A2-Nets: Double Attention Networks》

论文名称:《A2-Nets: Double Attention Networks》 论文地址:https://arxiv.org/pdf/1810.11579.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yamlyolov8-C2

2024国际元宇宙博览会:阿里元境以元宇宙数字内容助力文旅数字化发展

2月26日&#xff0c;MES2024国际元宇宙博览会在深圳会展中心正式开幕&#xff0c;大会以“向3D出发&#xff0c;元宇宙来袭&#xff0c;电竞娱乐正当时”为主题&#xff0c;聚焦元宇宙产业链&#xff0c;以“汇聚企业创新&#xff0c;助力产业重构&#xff0c;推动行业发展”为…

【数学建模获奖经验】2023第八届数维杯数学建模:华中科技大学本科组创新奖获奖分享

2024年第九届数维杯大学生数学建模挑战赛将于&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;近期同学们都开始陆续进入了备赛阶段&#xff0c;今天我们就一起来看看上一届优秀的创新奖选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说点赞的大佬…

数据库题专题训练(包含专题讲解+一整套题) 复试+升本比较适合

【拯救者】数据库题专题训练(包含专题讲解一整套题) 复试专升本期末 更新中 1️⃣ 先讲对应的专题 2️⃣ 最后来一整套模拟考题 &#x1f357;提供文档下载 【拯救者】Ep1_ER图专题(上) ​ ⭐️ 画ER图: 关注三个点 1. 找实体 2.找实体的属性 3.找实…

yolo目标检测实战

该博客主要介绍了&#xff1a; 1. 如何制作yolo目标检测数据集 2.如何在自己的数据集上训练yolo 3.训练好后的模型如何进行推理 1.数据标注 关于数据如何标注&#xff0c;请查看这篇博文 2.数据集目录结构 重点关注红框内部的结构 images: 图片目录 images/train: 训练集…

mysql根据指定顺序返回数据--order by field

在查询数据的时候&#xff0c;在in查询的时候&#xff0c;想返回的数据根据 in里的数据顺序返回&#xff0c;可以直接在orderby中通过 FIELD(字段名称逗号分隔的值的顺序) 进行指定&#xff1b;示例没有加 order by field添加 order by field效果

边缘智能网关:让环境监测更智能

在环境监测领域&#xff0c;边缘智能网关可用于区域环境的实时监测、分析和预警&#xff0c;例如河湖水位监测、雨雪监测、风沙/风速监测&#xff0c;通过实时采集并分析环境变化数据&#xff0c;能够有助于对于突发、急发的各种自然灾害进行快速预警和应对。 一、边缘智能网关…

JeecgBoot3.6.1 中打印功能实现

JeecgBoot3.6.1中实现打印功能 前言 在项目开发中我们可能会遇到打印得需求&#xff0c;基于JeecgBoot框架做了如下案例 一、前端 1、vue页面代码&#xff1a;List.vue <template><BasicTable register"registerTable" :rowSelection"rowSelectio…

【RT-Thread基础教程】邮箱的使用

文章目录 前言一、邮箱的特性二、邮箱操作函数2.1 创建邮箱创建动态邮箱创建静态邮箱 2.2 删除邮箱2.3 发邮件2.4 取邮件 三、示例代码总结 前言 RT-Thread是一个开源的实时嵌入式操作系统&#xff0c;广泛应用于各种嵌入式系统和物联网设备。在RT-Thread中&#xff0c;邮箱是…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolo项目|含源码

一、前言 部署yolo项目&#xff0c;是我这几个月以来做的事情&#xff0c;最近打算把这几个月试过的方法&#xff0c;踩过的坑&#xff0c;以博客的形式&#xff0c;分享一下。关于下面动态中讲到的如何用opencv部署&#xff0c;我在上一篇博客中已经详细讲到了&#xff1a;【…

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件&#xff0c;以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式&#xff0c;如飞行模式、步行模式、车辆模式等&#xff0c;可以根据不同的需求选择合适的模式。同时&#xff0c;unity导…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&#xff0c;谷歌也…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

2024年领取腾讯云优惠券的方法有哪些?程序员爆肝整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

如何自动化获取谷歌学术上学者的全部论文信息

如何自动化获取谷歌学术上学者的全部论文信息 在学术研究领域&#xff0c;追踪和分析学者的研究工作是非常重要的。本文介绍了如何使用Python自动化地收集指定学者的谷歌学术主页上的所有论文信息。 示例&#xff1a;施一公院士的谷歌学术主页 以施一公院士的谷歌学术主页为…

redis7.2.2|Dict

文章目录 StructredisDBdictdictTypedictEntry 宏定义散列函数散列冲突dictEntry pointer bit tricks[指针位技巧]API implementation_dictReset_dictInitdictCreatedictGetHashdictSetKeydictSetValdictSetNextdictGetNextdictGetValdictGetKey_dictCleardictEmptydictRelease…