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

目录
  • 1.QPushButton响应鼠标点击消息
    • 1.1自身响应消息clicked
    • 1.2事件过滤器响应消息
    • 1.3mousePressEvent事件获取
  • 2.QLabel响应鼠标点击消息
    • 2.1事件过滤器响应消息
    • 2.2mousePressEvent事件获取

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

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

举例控件: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控件点击消息获取的资料请关注我们其它相关文章!

(0)

相关推荐

  • Qt实现电子时钟的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 添加新文件 4.2 digiclock.h头文件 4.3 digiclock.cpp源文件 4.4 main.cpp源文件 五.效果演示 一.项目介绍 利用Qt实现显示与桌面上并可以随意拖拽至桌面任意位置的电子时钟案例. 二.项目基本配置 新建一个Qt案例,项目名称为“Clock”,基类选择“QDialog”,取消创建UI界面复选框的选中状态. 三.UI界面设计 无UI界面 四.主程序实现 4.1 添加新文件 添加新

  • QT5实现电子时钟

    本文实例为大家分享了QT5实现电子时钟的具体代码,供大家参考,具体内容如下 一.电子时钟的显示 效果如下: 电子时钟显示 二.新建工程 Widgets Application项目名位clock,基础类位QDialog,取消创建UI界面的勾选框,项目名右击添加新文件 在弹出的对话框中选择“C++ Class”,Base class基础类名“QLCDNumber”,class name命名为digiclock,点击完成. 三.编辑digiclock.h文件 #ifndef DIGICLOCK_H #

  • 基于Qt实现简易GIF播放器的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 利用Qt设计一个简易GIF播放器,可以播放GIF动画.其基本功能有载入文件.播放.暂停.停止.快进和快退. 二.项目基本配置 新建一个Qt案例,项目名称为“GIFTest”,基类选择“QMainWindow”,创建UI界面复选框的选中状态,完成项目创建. 三.UI界面设计 UI界面如下: 界面中创建了8个控件,其名

  • Qt实现简易QQ聊天界面

    本文实例为大家分享了Qt实现简易QQ聊天界面的具体代码,供大家参考,具体内容如下 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QWidget> #include <QToolButton> #include <QVBoxLayout> #include <QHBoxLayout> #include <QList> class MyDialog : public

  • QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    目录 main.cpp mainwindow.h mainwindow.cpp ui界面设计 登录界面为例 总结 main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; return a.exec(); } mainwindow.h #ifndef MAINWIND

  • 详解Qt使用QImage类实现图像基本操作

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 利用QImage类实现对图像的基本操作,包括图像显示.图像缩放.图像旋转等. 二.项目基本配置 新建一个Qt案例,项目名称为“ImageTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建. 三.UI界面设计 UI界面布局如下: 界面中创建了5个控件,其名称和类型如下: 序号 名称 类型 属性 ① Ch

  • Qt实现电子时钟

    本文实例为大家分享了Qt实现电子时钟的具体代码,供大家参考,具体内容如下 进一步认识Qt中的属性,我们现在再做一个小练习,去实现一个简易版电子时钟的效果. 效果展示: 新建项目: 我们创建了lcdclock2类,其实是没有用到的,实际上是添加新一个C++文件来实现电子钟. 添加C++文件: 代码: clock.h #ifndef CLOCK_H #define CLOCK_H   #include <QDialog>   class clock : public QDialog {     Q

  • Qt实现拖动单个控件移动的示例代码

    目录 1.设置窗口拖拽属性 2.创建初始控件 3.选中控件进行拖动 3.1响应mousePressEvent事件 3.2判断控件拖动 3.3事件处理 3.4结束拖动 做惯了静态图,今天来搞一搞动态图吧,首先来个最基础的功能:如果让一个控件拖动起来. 展示效果: 按照以往简单的做法,使用mouseMoveEvent.mousePressEvent.mouseReleaseEvent也是可以实现的.这是最基础的移动做法. 今天,不使用那种简单的做法,采用Qt一种特有的拖动方法来实现! 使用QDrop

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

    目录 1.QPushButton响应鼠标点击消息 1.1自身响应消息clicked 1.2事件过滤器响应消息 1.3mousePressEvent事件获取 2.QLabel响应鼠标点击消息 2.1事件过滤器响应消息 2.2mousePressEvent事件获取 今日为大家分享一个小功能实现:如何获取控件点击响应. 在这里,我以两个最简单并且具有代表性的控件来进行功能讲解. 举例控件:QLabel.QPushButton 对于这两个控件大家应该都不会陌生了,做界面开发经常会用到的. 开发环境:VS

  • Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解

    本文实例讲述了Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法.分享给大家供大家参考,具体如下: 相关内容: tkinter的使用 1.模块的导入 2.使用 3.控件介绍 Tk Button Label Frame Toplevel Menu Menubutton Canvas Entry Message Text Listbox Checkbutton Radiobutton Scale Scrollbar 首发时间:2018-03-04 16:39 Python的GU

  • Android OnCreate()中获取控件高度与宽度两种方法详解

    Android OnCreate()中获取控件高度与宽度 试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.Me

  • Delphi控件ListView的属性及使用方法详解

    Delphi的ListView组件位于组件板的Win32页,可使用4种图形方式(大图标.小图标.列表.详细列表)来描述选项内容,类似于Windows操作系统中的"我的电脑",数据项图形保存在ImageList组件中. 1.ListView主要属性 (1)ViewStyle属性 ViewStyle属性用于选择数据项的4种显示方式,因此该属性有4个选项值:vsIcon大图标.vsSmallIcon小图标.vsList列表.vsReport详细列表. (2)Items属性 Items属性用于

  • VC List Control控件如何删除选中的记录实例详解

    VC List Control控件如何删除选中的记录实例详解 实例代码: OnButtonDelete() { POSITION pos = m_list.GetFirstSelectedItemPosition(); int idx = m_list.GetNextSelectedItem(pos); while (idx != -1){ LVITEM lvi; lvi.iItem = idx; lvi.iSubItem = 0; lvi.mask = LVIF_IMAGE; if (m_li

  • QT委托代理机制之Model View Delegate使用方法详解

    目录 本地数据加载(Data) 添加数据模型(Model) 添加代理模型(Proxy) 添加元素的代理(Delegate) 添加视图层(View) 使用效果 之前的一篇文章中介绍过QT的委托代理机制,那时候由于理解的比较浅就简单的给了一个例子.最近又做了一部分相关的工作,发现之前的理解有点问题.这里就详细的介绍一下QT的委托代理机制的用法,希望对大家有帮助. Model-View-Delegate机制可以简单的理解为将本地的一些数据以特定的UI形式呈现出来.常见的数据结构包括列表数据(list)

  • 在Android中使用WebSocket实现消息通信的方法详解

    前言 消息推送功能可以说移动APP不可缺少的功能之一,一般简单的推送我们可以使用第三方推送的SDK,比如极光推送.信鸽推送等,但是对于消息聊天这种及时性有要求的或者三方推送不满足业务需求的,我们就需要使用WebSocket实现消息推送功能. 基本流程 WebSocket是什么,这里就不做介绍了,我们这里使用的开源框架是https://github.com/TakahikoKawasaki/nv-websocket-client 基于开源协议我们封装实现WebSocket的连接.注册.心跳.消息分

  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    在加载DLL时,出现了如下的异常:未能加载文件或程序集"DMC3000, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"或它的某一个依赖项. 试图加载格式不正确的程序. 经上网查询后,其原因是x64和x86不兼容的问题.即DLL是x64的,但是VS默认生成的目标平台是x86的,因此,两者的不一致导致异常的出现. 其解决办法如下: 项目->属性->生成->目标平台->x64(与dll平台一致) 以上这篇

  • ASP.NET控件10个最有用的属性详解

    1.ClientIDMode 渲染ASP.NET控件时会自动生成一个ID,当我们在客户端脚本中引用它们时,却会制造不少麻烦,虽然它是命名容器和ID的简单串联,但仍然无法预测生成的ID范围. ASP.NET 4.0使用ClientIDMode属性解决了这个问题,它允许你控制生成这些ID的方法,ClientIDMode有四个可选择的值:AutoID,Static,Predictable和Inherit.下面是这四个值的含义解释: AutoID – 和4.0以前的版本保持一致,自动生成ID. Stat

  • PHP使用ActiveMQ实现消息队列的方法详解

    本文实例讲述了PHP使用ActiveMQ实现消息队列的方法.分享给大家供大家参考,具体如下: 前面我们已经学了如何部署ActiveMQ, 我们知道通过ActiveMQ的一个管理后台可以查看任务队列. 今天 用PHP来操作ActiveMQ,我们可以借助一个第三方扩展. 下载: composer require fusesource/stomp-php:2.0.* 然后新建test.php: <?php require __DIR__.'/vendor/autoload.php'; //引入自动加载

随机推荐