Qt5 解决QSlider的valueChanged槽函数中setValue导致一直回调的问题

2023-11-22 19:18

本文主要是介绍Qt5 解决QSlider的valueChanged槽函数中setValue导致一直回调的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt5 解决QSlider的valueChanged槽函数中setValue导致一直回调的问题

 

问题描述

       公司一款基于Qt开发的程序,想实现slider设置亮度失败后恢复之前的位置,设置亮度失败会弹窗提醒,结果出现了频繁点击一直弹窗的问题。用blockSignals、QTimer::singleshot、开线程对slider进行setValue都还是同样问题,翻了stackoverflow和Qt官方论坛,都只说到要用blockSignals,所以我只能认为是官方的bug了。

 

解决思路

1.用上面提到的 blockSignals、QTimer::singleshot、开线程,结果不行

2.开始怀疑是 valueChanged 的问题,换了 sliderReleased,各种暴力测试,没有发生槽函数一直响应的问题,但是鼠标点击slider最最右边的位置槽函数没回调,只能放弃 sliderReleased

3.重写QSlider中的 mouseReleaseEvent ,再测试结果可以了

 

上代码

#ifndef QHORSLIDER_H
#define QHORSLIDER_H#include <QObject>
#include <QSlider>class QHorSlider : public QSlider
{Q_OBJECTpublic:QHorSlider(QWidget *parent = nullptr);~QHorSlider();signals:void ValueChanged();protected:virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *event);bool            m_bLButtonDown;};#endif // QHORSLIDER_H
#include "QHorSlider.h"
#include <QSlider>
#include <QDebug>
#include <QMouseEvent>QHorSlider::QHorSlider(QWidget* parent): QSlider(parent)
{}QHorSlider::~QHorSlider()
{}void QHorSlider::mousePressEvent(QMouseEvent *event)
{//获取当前点击位置,得到的这个鼠标坐标是相对于当前QSlider的坐标int currentX = event->pos().x();//获取当前点击的位置占整个Slider的百分比double per = currentX *1.0 /this->width();//利用算得的百分比得到具体数字int value = per*(this->maximum() - this->minimum()) + this->minimum();//设定滑动条位置this->setValue(value);//滑动条移动事件等事件也用到了mousePressEvent,加这句话是为了不对其产生影响,是的Slider能正常相应其他鼠标事件QSlider::mousePressEvent(event);
}void QHorSlider::mouseReleaseEvent(QMouseEvent *event)
{QSlider::mouseReleaseEvent(event);emit ValueChanged();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void OnSliderValueChanged();private:Ui::MainWindow *ui;int             m_nLast;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>
#include <QTimer>
#include "QHorSlider.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),m_nLast(0)
{ui->setupUi(this);ui->horizontalSlider->setRange(0, 100);ui->horizontalSlider->setSingleStep(1);ui->horizontalSlider->setPageStep(1);ui->horizontalSlider->setTracking(false);ui->horizontalSlider->setCursor(QCursor(Qt::PointingHandCursor));connect(ui->horizontalSlider, &QHorSlider::ValueChanged, this, &MainWindow::OnSliderValueChanged);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{ui->horizontalSlider->blockSignals(true);ui->horizontalSlider->setValue(m_nLast);ui->horizontalSlider->blockSignals(false);
}void MainWindow::OnSliderValueChanged()
{qDebug() << ui->horizontalSlider->value();QMessageBox::information(this, "tip", "ok");ui->horizontalSlider->blockSignals(true);ui->horizontalSlider->setValue(m_nLast);ui->horizontalSlider->blockSignals(false);
}

 

这篇关于Qt5 解决QSlider的valueChanged槽函数中setValue导致一直回调的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412325

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三