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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec