Qt控件点击消息获取的方法详解

 更新时间:2022年06月22日 09:59:22   作者:中国好公民st  
本文将利用Qt中的QLabel、QPushButton这两个控件,为大家详细介绍一下Qt控件点击消息获取的方法,文中的示例代码讲解详细,感兴趣的可以了解一下

今日为大家分享一个小功能实现:如何获取控件点击响应。

在这里,我以两个最简单并且具有代表性的控件来进行功能讲解。

举例控件:QLabel、QPushButton

对于这两个控件大家应该都不会陌生了,做界面开发经常会用到的。

开发环境:VS2017 + Qt5.14.2

首先来讲如何获取点击控件响应,QPushButton自身就带有了clicked消息,直接实现响应消息就可以了。

除此之外,还有其他方式可以响应该控件吗?对此,我将QPushButton响应鼠标按下的消息做一个整理。

1.QPushButton响应鼠标点击消息

1.1自身响应消息clicked

最简单的莫过于QPushButton自身的clicked消息。

创建响应槽函数

connect(ui.btn1, QPushButton::clicked, this, &QMyWidget::OnBnClicked1);

实现按钮响应消息

void QMyWidget::OnBnClicekd1()
{
    //响应控件,做具体的响应消息处理
}

1.2事件过滤器响应消息

在Qbject中有这么一个函数:eventFilter建立事件过滤器。

virtual bool eventFilter(QObject * watched, QEvent * event)override;

想要获取哪个控件的消息只需要监视该控件就可以了。

控件监视:ui.btn1->installEventFilter(this);

对该控件实施监视后,该如何处理呢?

首先,需要判断操作对象是否为QPushButton控件?除此之外全部过滤掉

if(watched == ui.btn1)
{
    //是QPushButton过滤事件
}
else
{
    //不是QPushButton事件,忽略处理
}

其次,截获出鼠标按下消息

if(event->type() == QEvent::MouseButtonPress)
{
    //鼠标按下消息
}

到这里,为了验证正确性,可以用输出日志的方式。发现,果然可以响应按钮控件响应。

但是,还有一些小瑕疵,测试发现,无论是左键点击鼠标、右键点击鼠标或者是双击鼠标,都会触发该消息,这就需要我们做进一步优化了。

最后,筛选左键响应消息

接收到鼠标按下消息后,此刻可以将事件转化成鼠标事件,更进一步判断。

QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() & Qt::LeftButton)
{
	QPoint pt = mouseEvent->pos();
	qDebug() << QStringLiteral("<eventFilter>事件中,点击鼠标左键的位置 = ") << pt;
}

写到这里,在尝试下发现鼠标右键点击消息不会触发了。

但是,还存在一个小问题,当鼠标左键双击按钮时,依旧响应该消息。这里,就需要对QPushButton做一下特殊处理了,我们后续再进行详细讲解。

到这里,使用事件过滤器eventFilter处理按钮响应就算完成了。

1.3mousePressEvent事件获取

使用mousePressEvent事件可以获取到按钮的响应消息吗?

答案是不可以的。

如果想要验证真理的小伙伴可以在mousePressEvent中输出日志,会发现,当点击按钮控件时,是不会触发该消息的,只有在控件之外或者是静态控件上才会响应。

所以,使用mousePressEvent方法获取是不可取的。

综上所述,想要获取具有响应消息的控件(例如:QPushButton)点击事件方法只有前两种方式是可取的。

2.QLabel响应鼠标点击消息

QLabel控件也可以说是静态显示控件,查看底层类可以发现,该类不具备鼠标响应事件,那么对于这种控件该如何获取点击事件呢?

2.1事件过滤器响应消息

与按钮响应事件获取方法一致,通过监视控件,截获消息的方式实现,这里就不再过多说明了。

2.2mousePressEvent事件获取

QPushButton控件使用鼠标按下响应无法获取消息,但是QLabel是可以的。

那么该如何获取呢?

核心:获取mousePressEvent中点的位置,将其转换成控件位置,是否存在有效控件指针

QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (child)
{
   //鼠标点击在QLabel控件上
}
else
{
    //鼠标未点击在控件上,忽略处理
}

到此,两种具有代表性的控件响应消息获取方式已经讲解完成了,是不是很简单?

以上就是Qt控件点击消息获取的方法详解的详细内容,更多关于Qt控件点击消息获取的资料请关注脚本之家其它相关文章!

相关文章

  • C语言实现绘制LoveBeat爱心曲线的示例代码

    C语言实现绘制LoveBeat爱心曲线的示例代码

    这篇文章主要为大家详细介绍了如何溧阳C语言实现绘制LoveBeat爱心曲线,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 详解C/C++ 的*和&用法

    详解C/C++ 的*和&用法

    这篇文章主要介绍了C/C++ 的*和&的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 纯c实现异常捕获try-catch组件教程示例

    纯c实现异常捕获try-catch组件教程示例

    这篇文章主要为大家介绍了纯c实现异常捕获try-catch组件教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • c++连接mysql入门案例

    c++连接mysql入门案例

    这篇文章主要介绍了c++连接mysql入门案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言数据结构详细解析二叉树的操作

    C语言数据结构详细解析二叉树的操作

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-04-04
  • 解析C++中的字符串处理函数和指针

    解析C++中的字符串处理函数和指针

    这篇文章主要介绍了解析C++中的字符串处理函数和指针,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 带你从编码角度分析C++重载原理

    带你从编码角度分析C++重载原理

    这篇文章主要为大家介绍了从编码角度分析C++重载原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言中查询进程信号是否被遮罩或搁置的简单方法

    C语言中查询进程信号是否被遮罩或搁置的简单方法

    这篇文章主要介绍了C语言中查询进程信号是否被遮罩或搁置的简单方法,包括sigprocmask函数和sigpending函数的简介,需要的朋友可以参考下
    2015-09-09
  • C语言中快速排序和插入排序优化的实现

    C语言中快速排序和插入排序优化的实现

    这篇文章主要介绍了C语言中快速排序和插入排序优化的实现,包括双向划分快速排序方法的介绍,需要的朋友可以参考下
    2015-11-11
  • VC实现五子棋游戏的一个算法示例

    VC实现五子棋游戏的一个算法示例

    这篇文章主要介绍了VC实现五子棋游戏的一个算法示例,对于学习数据结构与算法的朋友有一定的借鉴价值,需要的朋友可以参考下
    2014-08-08

最新评论