QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

这篇具有很好参考价值的文章主要介绍了QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示
问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来

ui图:
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

问题1:处理QSlider 滚轮事件的时候
这里有很大的问题,但是不知道原因,为什么会出现这样的原因,网上也没搜索到相关的内容

问题描述:我们在打印我们的滑动条的值的时候显示不正确
为了更加清楚显示值的变化,我加了值的显示(这个是测试需要,方便写笔记查看)

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::Wheel)
		{
			QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
			ui.lineEdit1->setText(QString::number(m_index1));
			ui.lineEdit2->setText(QString::number(ui.slider->value()));
			ui.lineEdit3->setText(QString::number(ui.slider->sliderPosition()));
		}
	}
	return QWidget::eventFilter(watched, event);
}

不知道各位有没有看出这个滑动条的值出现了什么错误:
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
错误1:当我在向右滑动的时候,滑到最右边的时候,我再向滑动时,滑动条的值是在第10条分割线,上面显示的值: 10 ,实际应该的值:9
错误2:当我继续在向左滑动时,滑动条对应的值 都 对应不上了,上面显示的值 都比原来减少了1
错误3:当我滑动到最左边的时候,我 操控滑动条 从右 再 向左 , 上面的 值竟然从1-》2-》1,实际应该为 2-》1-》0

我的解决办法是:因为刻度总共有11个,通过滑动条 向前 向后 来改变index 的值

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::Wheel)
		{
			//滚轮向前 
			if (wheelEvent->delta() > 0)
			{
				if (m_index1 >= 10)
				{
					m_index1 = 10;
				}
				else if (m_index1 < 10)
				{
					m_index1 += 1;
				}
			}
			else if (wheelEvent->delta() < 0)
			{
				if (m_index1 <= 0)
				{
					m_index1 = 0;
				}
				else if (m_index1 > 0)
				{
					m_index1 -= 1;
				}
			}
			
			//获取滑动条的值
			ui.lineEdit1->setText(QString::number(m_index1));
		}
	}
	return QWidget::eventFilter(watched, event);
}

结果如下:此时我获取的index 值时正确的,因为另外两个参数不是我需要的
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
问题2:处理QSlider 点击位置事件的时候
问题描述:我发现QSlider点击最后一个刻度的时候,非常的困难,基本上不可能到最后一个刻度(只通过点击的形式,不通过滑动条滚动的形式)

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::MouseButtonRelease)
		{
			//根据鼠标点击的位置 来设置滑动条的 位置
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
			if (mouseEvent->button() == Qt::LeftButton)
			{ 
				int curValue = ui.slider->maximum() - ui.slider->minimum();
				int curPos = ui.slider->minimum() + curValue * (static_cast<double>(mouseEvent->x()) / ui.slider->width());

				ui.slider->setValue(curPos);
			}
		}
	}
	return QWidget::eventFilter(watched, event);
}

效果如下:我们发现 点击最后一个确实非常的困难
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
解决办法:

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::MouseButtonRelease)
		{
			//根据鼠标点击的位置 来设置滑动条的 位置
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
			if (mouseEvent->button() == Qt::LeftButton)
			{ 
				int value = QStyle::sliderValueFromPosition(ui.slider->minimum(), ui.slider->maximum(), mouseEvent->pos().x(), ui.slider->width());
				ui.slider->setValue(value);
			}
		}
	}
	return QWidget::eventFilter(watched, event);
}

QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
问题3:因为我的需求是 两个按钮共享一个滑动条,但是 两个 滑动条 有自己对应的index,此时我们就需要设置点击到自己的按钮的时候,设置index值

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::Wheel)
		{
			//滚轮向前 
			if (wheelEvent->delta() > 0)
			{
				if (m_index1 >= 10)
				{
					m_index1 = 10;
				}
				else if (m_index1 < 10)
				{
					m_index1 += 1;
				}
			}
			else if (wheelEvent->delta() < 0)
			{
				if (m_index1 <= 0)
				{
					m_index1 = 0;
				}
				else if (m_index1 > 0)
				{
					m_index1 -= 1;
				}
			}
			
			//获取滑动条的值
			ui.lineEdit1->setText(QString::number(m_index1));
			qDebug() << "m_index:" << m_index1;
			//既然获取到了正确的m_index1 ,那么我们直接设置值应该没有问题吧(下面两种形式都不行,滑动条滑动的时候 会错乱,导致我们的index 错乱)	
			ui.slider->setValue((int)m_index1);
			//ui.slider->setSliderPosition(m_index);
		}
	}
	return QWidget::eventFilter(watched, event);
}

void SliderWidget::on_btn1_clicked()
{
	ui.slider->setValue(m_index1);
}

看一下下面的动图,很明显的就发现了问题
QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
错误1:此时打乱了 我们原本正确的对应滑动条 的index 值,现在获取也不正确了
错误2:我们发现向前滑动一次 然后 向后 滑动一次 ,或者相反;滑动条的值 竟然跳了 2 个间隔,但是我在ui设置的时候只有1个间隔,这是肯定错误的,获取的值肯定是不正确的

解决办法:我就尝试不在事件过滤器里做操作,我在滑动条的ValueChanged事件中做操作

	connect(ui.slider, &QSlider::valueChanged, this, [=](int value) {
		ui.slider->setValue(value);
	
		if (ui.btn1->isChecked())
		{
			m_index1 = ui.slider->value();
			ui.lineEdit1->setText(QString::number(m_index1));
			qDebug() << "m_index1:" << m_index1;
		}
		else if (ui.btn2->isChecked())
		{
			m_index2 = ui.slider->value();
			ui.lineEdit1->setText(QString::number(m_index2));
			qDebug() << "m_index2:" << m_index2;
		}
		
	});

QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
完整代码:
.h文件

#pragma once

#include <QWidget>
#include "ui_SliderWidget.h"
#include <QWheelEvent>
#include <QDebug>
#include <QPoint>
#include <QStyle>
#include <QSlider>

class SliderWidget : public QWidget
{
	Q_OBJECT

public:
	SliderWidget(QWidget* parent = Q_NULLPTR);
	~SliderWidget();

private:
	bool eventFilter(QObject* watched, QEvent* event);

public slots:
	void on_btn1_clicked();
	void on_btn2_clicked();

private:
	Ui::SliderWidgetClass ui;
	quint8 m_index1 = 5;
	quint8 m_index2 = 5;
};

.cpp文件

#include "SliderWidget.h"

SliderWidget::SliderWidget(QWidget* parent)
	: QWidget(parent)
{
	ui.setupUi(this);

	ui.slider->installEventFilter(this);
	connect(ui.slider, &QSlider::valueChanged, this, [=](int value) {
		ui.slider->setValue(value);
	
		if (ui.btn1->isChecked())
		{
			m_index1 = ui.slider->value();
			ui.lineEdit1->setText(QString::number(m_index1));
		}
		else if (ui.btn2->isChecked())
		{
			m_index2 = ui.slider->value();
			ui.lineEdit1->setText(QString::number(m_index2));
		}
		
	});
}

SliderWidget::~SliderWidget()
{
}

bool SliderWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (ui.slider == watched)
	{
		if (event->type() == QEvent::MouseButtonRelease)
		{
			//根据鼠标点击的位置 来设置滑动条的 位置
			QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
			if (mouseEvent->button() == Qt::LeftButton)
			{ 
				//int nDur = ui.slider->maximum() - ui.slider->minimum();
				//int nPos = ui.slider->minimum() + nDur * (static_cast<double>(mouseEvent->x()) / ui.slider->width());
				int value = QStyle::sliderValueFromPosition(ui.slider->minimum(), ui.slider->maximum(), mouseEvent->pos().x(), ui.slider->width());
				ui.slider->setValue(value);

				//m_index1 = value;
				//qDebug() << "m_index:" << m_index1;
				//qDebug() << "value:" << ui.slider->value();
				//qDebug() << "nPos:" << nPos;

				//m_index = value + 1;
				设定滑动条位置
				ui.slider->setValue(value);

				qDebug()<< "position:" << ui.slider->sliderPosition();
				qDebug() << "value:" << ui.slider->value();
				m_index = ui.slider->value();
				//ui.slider->setSliderPosition(value);
				//qDebug() << "m_index:" << m_index;
				//qDebug() << "positition:" << ui.slider->sliderPosition();
				//qDebug() << "value:" << ui.slider->value();

				//获取当前点击位置,得到的这个鼠标坐标是相对于当前QSlider的坐标
				//int currentX = mouseEvent->pos().x();
				//
				//qDebug() <<"currentX:" << currentX;
				获取当前点击的位置占整个Slider的百分比
				//double per = currentX * 1.0 / ui.slider->width();
				//qDebug() <<"width:" << ui.slider->width();
				利用算得的百分比得到具体数字
				//int value = per * (ui.slider->maximum() - ui.slider->minimum()) + ui.slider->minimum();
				//
				//if (value <= 0)
				//{
				// value = 0;
				//}
				//else if (value >= 10)
				//{
				// value = 10;
				//}
				//qDebug() << value;
				//m_index = value;
				//ui.slider->setValue(value);

			}
		}
		else if (event->type() == QEvent::Wheel)
		{
			QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
			//static int index = 5;
			//滚轮向前 
			if (wheelEvent->delta() > 0)
			{
				if (ui.btn1->isChecked())
				{
					if (m_index1 >= 10)
					{
						m_index1 = 10;
					}
					else if (m_index1 < 10)
					{
						m_index1 += 1;
					}
				}
				else if (ui.btn2->isChecked())
				{
					if (m_index2 >= 10)
					{
						m_index2 = 10;
					}
					else if (m_index2 < 10)
					{
						m_index2 += 1;
					}
				}

			}
			else if (wheelEvent->delta() < 0)
			{
				if (ui.btn1->isChecked())
				{
					if (m_index1 <= 0)
					{
						m_index1 = 0;
					}
					else if (m_index1 > 0)
					{
						m_index1 -= 1;
					}
				}
				else if (ui.btn2->isChecked())
				{
					if (m_index2 <= 0)
					{
						m_index2 = 0;
					}
					else if (m_index2 > 0)
					{
						m_index2 -= 1;
					}
				}

			}
			if (ui.btn1->isChecked())
			{
				ui.lineEdit1->setText(QString::number(m_index1));
			}
			else if (ui.btn2->isChecked())
			{
				ui.lineEdit1->setText(QString::number(m_index2));
			}

			//m_index1 = ui.slider->sliderPosition();
			//ui.lineEdit2->setText(QString::number(ui.slider->value()));
			//ui.lineEdit3->setText(QString::number(ui.slider->sliderPosition()));
			//qDebug() << "m_index:" << m_index1;
			//qDebug() << "value:" << ui.slider->value();
			//qDebug() << "position:" << ui.slider->sliderPosition();
			
			//ui.slider->setValue((int)m_index1);
			//qDebug() << "value:" << ui.slider->value();
			//qDebug() << "value:" << ui.slider->value();
			//ui.slider->setSliderPosition(m_index);
			//qDebug() << ui.slider->sliderPosition();

		}
	}

	return QWidget::eventFilter(watched, event);
}

void SliderWidget::on_btn1_clicked()
{
	ui.slider->setValue(m_index1);
}

void SliderWidget::on_btn2_clicked()
{
	ui.slider->setValue(m_index2);
}

参考博客:
QSlider设置滚动块定位到鼠标点击的地方
Qt之QSlider介绍(属性设置、信号、实现滑块移动到鼠标点击位置)
Qt滑动条解决点击和拖动问题文章来源地址https://www.toymoban.com/news/detail-428700.html

到了这里,关于QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt 禁止点击 屏蔽鼠标事件

    我开了一个线程上传文件夹,用一个进度条显示进度 测试 就在界面随便点击 ,也没有出泵任何控件,没有引发槽函数,直接就崩了! 不知道为什么崩了,所以直接禁止点击,蔽鼠标事件! 主界面 进度条 Qt::WidgetAttribute::WA_TransparentForMouseEvents 该属性的含义是“透明掉鼠标事

    2024年02月15日
    浏览(41)
  • Qt鼠标点击事件处理:按Escape键退出程序

    Qt 入门实战教程(目录) 首先,创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 :Qt Creator 创建 Qt 默认窗口程序 打开Qt Creator 编辑 项目 Headers mainwindow.h 右键 class MainWindow Refactor Insert Virtual Function of Base Classes 如下图所示: 选择 QWidget keyPressEvent Insertion options: Insert defini

    2024年02月09日
    浏览(38)
  • Qt获取鼠标移动事件,窗口内任意位置按下鼠标左键拖动窗口

    重写窗口的两个事件函数mousePressEvent和mouseMoveEvent即可: 在mousePressEvent 中,按下鼠标左键时,记录窗口坐标,其中窗口坐标的计算是由鼠标事件获取到鼠标在整个屏幕中的坐标(ev-globalpos()),然后再使用pos()获取到鼠标在窗口内的相对位置,两者之差就是窗口在整个屏幕上

    2024年02月12日
    浏览(60)
  • Qt窗口设置无边框不能移动,鼠标穿透后不能响应点击事件

      最近在做一个迷你小工具,准备干点不可描述的事情,想要短小强悍,始终在最顶层显示,同时不要自带的关闭按钮和边框,百度一下,发现是需要设置如下两个属性:   那么问题来了,这样的话一运行窗体就在正中间,而且无法拖动,就像这样   哪怕对于我这种

    2024年02月10日
    浏览(61)
  • QT基础:event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式功能演示

    这里演示的是QT基础,主要包含: event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式等功能演示, 适合初学者食用 。 演示功能:点击鼠标左键、右键、中键、左右键同时点击,输出鼠标当前坐标;按下鼠标中键,鼠标样式被替换,按下鼠标左

    2024年02月09日
    浏览(48)
  • QT学习笔记(三)——vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放

    之前写了一个博客讲怎么显示一张影像,那个是基于Qpainter的 今天使用QLabel来显示影像,并且用鼠标滚轮控制缩放。 关于图像的打开和显示,主要参考这个博客 关于如何使图片自适应窗口与铺满窗口,可以参考这个博客。 这两个博客出自同一作者,都很详细。 其中按照第二

    2024年02月09日
    浏览(44)
  • Qt 重写QSlider简单实现滑动解锁控件(指定百分比回弹效果)

    组件效果图: 应用场景:  用于滑动解锁相关场景,Qt的控件鼠标监听机制对于嵌入式设备GUI可触摸屏依旧可用。 实现方式: 主要是通过继承QSlider以及搭配使用QStyleOptionSlider来实现效果。 注意细则: QStyleOptionSlider是用于定制空白区域是否可移动滑块,根据需求可舍弃。 组

    2024年02月07日
    浏览(40)
  • VSCode设置鼠标滚轮滑动设置字体大小

    1:打开\\\"文件-首选项-设置 2 :打开settings.json文件 英文版这里有个坑 一般点击我下图右上角那个{ } 就可以打开了 在 设置的json 文件中加入如下 “editor.mouseWheelZoom”: true { “editor.mouseWheelZoom”: true, “json.schemas”: [ }

    2024年02月13日
    浏览(55)
  • JavaScript鼠标滚轮事件

    一 、首先,获取需要绑定事件的元素,可以是整个网页文档,也可以是某个特定的元素。例如,使用以下代码获取整个文档对象: 二、使用addEventListener函数为该元素添加mousewheel或DOMMouseScroll事件的监听器。这两个事件分别在不同的浏览器中使用,使用以下代码监听这两个事

    2024年02月15日
    浏览(42)
  • js监听鼠标滚轮事件

    通过原生js监听鼠标滚轮事件 通过jquery实现鼠标滚轮事件,若ie8无法实现,降低jquery版本

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包