【Qt | QLineEdit】Qt 中使 QLineEdit 响应 鼠标单击、双击事件 的两个方法

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰: 2024-09-14 15:04:41

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、方法一:重写 eventFilter
    • ✨2.1 Qt 文档对 QObject::eventFilte 的介绍
    • ✨2.2 重写 QObject::eventFilte 的步骤及代码
  • 🎄三、方法二:自定义控件实现 QLineEdit 单击、双击
    • ✨3.1 自定义 CUiLineEdit 控件类
    • ✨3.2 使用 CUiLineEdit 控件类获取单击、双击消息
  • 🎄四、总结


在这里插入图片描述
在这里插入图片描述

🎄一、概述

开发环境介绍:
系统:Vmware虚拟机运行的Ubuntu 18.04
Qt开发环境:Qt5.12.12

在Qt中,QLineEdit 是没有鼠标单击或双击的相关信号的,如果想要在单击或双击界面中的 QLineEdit 控件时,收到相关消息,就需要另外写代码来实现。

本文介绍两种方法,使鼠标单击或双击界面中的 QLineEdit 控件时,可以收到消息并打印:

  • 1、重写 QObject::eventFilter 函数;
  • 2、自定义一个 CUiLineEdit 去继承 QLineEdit ,然后重写 QWindow::mousePressEventQWindow::mouseDoubleClickEvent

在这里插入图片描述

🎄二、方法一:重写 eventFilter

在 QLineEdit 所在界面重写 eventFilter 来使 QLineEdit 控件能够接收到鼠标单击、双击事件消息的方法比较简单,下面先看看Qt文档的相关介绍,然后再自己写一个重写 eventFilter 的例子,并给出实现代码。

✨2.1 Qt 文档对 QObject::eventFilte 的介绍

函数原型:

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

函数解释:
如果已将此对象安装为所监视对象的事件过滤器,则过滤事件。
在你重新实现这个函数时,如果你想过滤掉事件,即停止它被进一步处理,返回true;否则返回false

Qt文档例子:

 class MainWindow : public QMainWindow
 {
 public:
     MainWindow();

 protected:
     bool eventFilter(QObject *obj, QEvent *ev) override;

 private:
     QTextEdit *textEdit;
 };

 MainWindow::MainWindow()
 {
     textEdit = new QTextEdit;
     setCentralWidget(textEdit);

     textEdit->installEventFilter(this);
 }

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
     if (obj == textEdit) {
         if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             return true;
         } else {
             return false;
         }
     } else {
         // pass the event on to the parent class
         return QMainWindow::eventFilter(obj, event);
     }
 }

✨2.2 重写 QObject::eventFilte 的步骤及代码

这个小节手把手写一份代码,让 QLineEdit 控件可以获取到鼠标单击、双击的事件消息,并左侧响应。

重写 QObject::eventFilte 的步骤:

  • 1、在 QLineEdit 所在界面的构造函数,为 QLineEdit 对象安装事件过滤器:
    editEventFilter->installEventFilter(this);// 给 editEventFilter 控件添加事件过滤器
    
  • 2、重写 QObject::eventFilte ,并对单击、双击事件消息做处理:
    bool lineEditEventFilter::eventFilter(QObject *obj, QEvent *event)
    {
        if(this->editEventFilter == obj && event->type() == QEvent::MouseButtonPress)
        {
            qDebug("editEventFilter MouseButtonPress");
            this->editEventFilter->setText("MouseButtonPress");
        }
        if(this->editEventFilter == obj && event->type() == QEvent::MouseButtonDblClick)
        {
            qDebug("editEventFilter MouseButtonDblClick");
            this->editEventFilter->setText("MouseButtonDblClick");
        }
        return QWidget::eventFilter(obj,event);
    }
    

🌰例子代码:

1、lineediteventfilter.h

#ifndef LINEEDITEVENTFILTER_H
#define LINEEDITEVENTFILTER_H

#include <QWidget>
#include <QLineEdit>

class lineEditEventFilter : public QWidget
{
    Q_OBJECT

public:
    lineEditEventFilter(QWidget *parent = nullptr);
    ~lineEditEventFilter();

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

private:
     QLineEdit *editEventFilter;
};
#endif // LINEEDITEVENTFILTER_H

2、lineediteventfilter.cpp

#include "lineediteventfilter.h"
#include <QEvent>

lineEditEventFilter::lineEditEventFilter(QWidget *parent)
    : QWidget(parent)
{
    this->resize(300, 200);
    editEventFilter = new QLineEdit(this);
    editEventFilter->setObjectName(QString::fromUtf8("editEventFilter"));
    editEventFilter->setGeometry(QRect(50, 100, 200, 25));

    editEventFilter->installEventFilter(this);// 给 editEventFilter 控件添加事件过滤器
}

lineEditEventFilter::~lineEditEventFilter()
{
}

bool lineEditEventFilter::eventFilter(QObject *obj, QEvent *event)
{
    if(this->editEventFilter == obj && event->type() == QEvent::MouseButtonPress)
    {
        qDebug("editEventFilter MouseButtonPress");
        this->editEventFilter->setText("MouseButtonPress");
    }
    if(this->editEventFilter == obj && event->type() == QEvent::MouseButtonDblClick)
    {
        qDebug("editEventFilter MouseButtonDblClick");
        this->editEventFilter->setText("MouseButtonDblClick");
    }
    return QWidget::eventFilter(obj,event);
}

3、main.cpp

#include "lineediteventfilter.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    lineEditEventFilter w;
    w.show();
    return a.exec();
}

例子演示效果:
在这里插入图片描述


在这里插入图片描述

🎄三、方法二:自定义控件实现 QLineEdit 单击、双击

自定义控件的步骤比较繁琐一点,不过也是很容易理解的,QLineEdit 没有鼠标单击、双击的信号,说明它没有处理,那我们定义一个 CUiLineEdit 的控件类去继承 QLineEdit ,然后处理鼠标单击、双击对应的事件函数就行了。

✨3.1 自定义 CUiLineEdit 控件类

这个小节介绍自定义 CUiLineEdit 的控件类,这个类有下面几个要求:

  • 继承自QLineEdit ;
  • 自定义两个信号 clicked() 、doubleClicked(),在鼠标单击、双击时发送对应信号,这两个函数名可以根据自己喜好来定。
  • 重写 mousePressEvent 函数,在里面发送自定义信号 clicked();
  • 重写 mouseDoubleClickEvent 函数,在里面发送自定义信号 doubleClicked();

下面是我的实现代码,由于代码很小,就把实现也写在 .h 中了:
uiLineEdit.h

#ifndef UILINEEDIT_H
#define UILINEEDIT_H
#include <QLineEdit>

class CUiLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    CUiLineEdit(QWidget *parent = nullptr):QLineEdit(parent)
    {}
signals:
    void clicked();
    void doubleClicked();     // 鼠标双击 2024.09.13
protected:
    // 重写 mousePressEvent 发送 clicked
    virtual void mousePressEvent(QMouseEvent*)
    {
        qDebug("CUiLineEdit emit clicked();");
        emit clicked();
    }
    // 重写 mouseDoubleClickEvent, 发送 doubleClicked
    virtual void mouseDoubleClickEvent(QMouseEvent*)
    {
        qDebug("CUiLineEdit emit doubleClicked();");
        emit doubleClicked();
    }
};
#endif // UILINEEDIT_H

✨3.2 使用 CUiLineEdit 控件类获取单击、双击消息

  • 在代码中使用 CUiLineEdit:
    CUiLineEdit 类定义好后,你就可以像使用 QLineEdit 一样去使用它了,区别是,它比 QLineEdit 多了两个信号:clickeddoubleClicked,可以用 connect 将这两个信号连接到其他Qt对象。

  • 在 QtDesigner 使用 CUiLineEdit:
    在代码中使用CUiLineEdit会比较简单,就把他当成 QLineEdit 去使用就行了。
    QtDesigner 中怎么使用呢?下面演示的方法是在 QtDesigner 中使用 CUiLineEdit 类,主要有两个方法:提升法、插件法,这两个放在在《C++ GUI Qt4 编程 第二版》的 5.3 小节有详细介绍。本文介绍的是提升法,步骤如下:

    • 1、从 QtDesigner 的窗口部件工具盒中拖动一个 QLineEdit 到窗体中, 由此创建一个 QLineEdit ;
    • 2、右键单击这个QLineEdit 控件,并且从上下文菜单中选择提升为...(Promote to Custom Widget);
      在这里插入图片描述
    • 3、在弹出的对话框中, 填入“CUiLineEdit” 作为类的名字, 填入“control_curtom/uiLineEdit.h”作为头文件的名字。
      注意头文件需要给出完整路径名,这是相对于.pro文件的相对路径。
      在这里插入图片描述

    经过前面三个步骤,就将 QLineEdit 提升为 CUiLineEdit 了。

知道了怎样使用 CUiLineEdit 后,剩下的就是定义界面的槽函数,再 connect 信号和槽了,具体看下面代码:

🌰例子代码:
1、mylineedittest.h

#ifndef MYLINEEDITTEST_H
#define MYLINEEDITTEST_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class myLineEditTest; }
QT_END_NAMESPACE

class myLineEditTest : public QWidget
{
    Q_OBJECT

public:
    myLineEditTest(QWidget *parent = nullptr);
    ~myLineEditTest();

private slots:
    void dealClicked();
    void dealDbClicked();

private:
    Ui::myLineEditTest *ui;
};
#endif // MYLINEEDITTEST_H

2、mylineedittest.cpp

#include "mylineedittest.h"
#include "ui_mylineedittest.h"

myLineEditTest::myLineEditTest(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myLineEditTest)
{
    ui->setupUi(this);
    connect(ui->lineEdit, &CUiLineEdit::clicked, this, &myLineEditTest::dealClicked);
    connect(ui->lineEdit, &CUiLineEdit::doubleClicked, this, &myLineEditTest::dealDbClicked);
}

myLineEditTest::~myLineEditTest()
{
    delete ui;
}

void myLineEditTest::dealClicked()
{
    qDebug("dealClicked");
    ui->lineEdit->setText("dealClicked");
}

void myLineEditTest::dealDbClicked()
{
    qDebug("dealDbClicked");
    ui->lineEdit->setText("dealDbClicked");
}

3、main.cpp

#include "mylineedittest.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    myLineEditTest w;
    w.show();
    return a.exec();
}

演示结果:
在这里插入图片描述


在这里插入图片描述

🎄四、总结

👉本文介绍了在 Qt 中实现 QLineEdit 响应 鼠标单击、双击事件 的两个方法,并给出完整例子代码。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
《C++ GUI Qt4 编程 第二版》
Qt5 QLineEdit实现点击调用软键盘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter-底部选择弹窗(showModalBottomSheet)

前言 现在有个需求&#xff0c;需要用底部弹窗来添加定时的重复。在这里使用原生的showModalBottomSheet来实现 showModalBottomSheet的Props 名称 描述 isScrollControlled全屏还是半屏isDismissible外部是否可以点击&#xff0c;false不可以点击&#xff0c;true可以点击&a…

STM32 移植FATFS时遇到ff_oem2uni函数未定义问题

STM32 移植FATFS时遇到ff_oem2uni/ff_uni2oem/ff_wtoupper函数未定义问题 在移植STM32 FATFS文件系统代码时&#xff0c;完成后编译遇到如下错误&#xff1a; 经过排查分析&#xff0c;是文件没有添加完全导致的&#xff1a; 把ffunicode.c文件添加进工程就可以了&#xff…

01-Mac OS系统如何下载安装Python解释器

目录 Mac安装Python的教程 mac下载并安装python解释器 如何下载和安装最新的python解释器 访问python.org&#xff08;受国内网速的影响&#xff0c;访问速度会比较慢&#xff0c;不过也可以去我博客的资源下载&#xff09; 打开历史发布版本页面 进入下载页 鼠标拖到页面…

MongoDB解说

MongoDB 是一个流行的开源 NoSQL 数据库&#xff0c;它使用了一种被称为文档存储的数据库模型。 与传统的关系型数据库管理系统&#xff08;RDBMS&#xff09;不同&#xff0c;MongoDB 不使用表格来存储数据&#xff0c;而是使用了一种更为灵活的格式——JSON 样式的文档。 这…

论文阅读笔记:Sapiens: Foundation for Human Vision Models

Sapiens: Foundation for Human Vision Models 1 背景1.1 问题1.2 目标 2 方法3 创新点4 模块4.1 Humans-300M数据集4.2 预训练4.3 2D位姿估计4.4 身体部位分割4.5 深度估计4.6 表面法线估计 5 实验5.1 实现细节5.2 2D位姿估计5.3 身体部位分割5.4 深度估计5.5 表面法线估计5.6…

SVN笔记-SVN安装

SVN笔记-SVN安装 1、在windows下安装 SVN 1、准备svn的安装文件 下载地址&#xff1a;https://sourceforge.net/projects/win32svn/ 2、下载完成后&#xff0c;在相应的盘符中会有一个Setup-Subversion-1.8.17.msi的文件&#xff0c;目前最新的版本是1.8.17&#xff0c; 这里…

UGit:腾讯自研的Git客户端新宠

UGit 是一款专门针对腾讯内部研发环境特点量身定制的 Git 客户端&#xff0c;其目标在于大幅提升开发效率以及确保团队协作的高度流畅性。UGit 能够良好地支持 macOS 10.11 及以上版本、Apple Silicon 以及 Win64 位系统。 可以下载体验一把。 https://ugit.qq.com/zh/index.…

【CSS Tricks】如何做一个粒子效果的logo

效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果Logo</title>…

【图像匹配】基于Harris算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于Harris算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 …

echarts 散点图tooltip显示一个点对应多个y值

tooltip&#xff1a;显示 tooltip: {trigger: "axis",extraCssText: max-width:50px; white-space:pre-wrap,formatter: function (params) {let arr []params.forEach(v > {arr.push(v.data[1])});return params[0].data[0]":<br>["arr.toStr…

Android 签名、空包签名 、jarsigner、apksigner

jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/apksigner.bat jarsigner&#xff1a; jarsigner签名空包执行的命令&#xff1a; jar…

解决Hive乱码问题

在插入数据后&#xff0c;发现hive乱码 原因&#xff1a;Hive默认将存储表结构的元数据列编码设置为latin1&#xff0c;不支持中文 解决方法&#xff1a;在MySQL中修改对应Hive元数据列的编码 先查看mysql的所有字符集编码 1、先修改my.cnf 代码如下&#xff1a; vim /etc/…

weblogic CVE-2017-3506 靶场攻略

漏洞描述 Weblogic的WLS Security组件对外提供了webserver服务&#xff0c;其中使⽤了XMLDecoder来解析⽤户输⼊的XML数据&#xff0c;在解析过程中出现反序列化漏洞&#xff0c;可导致任意命令执⾏。 影响版本 受影响版本&#xff1a;WebLogic 10.3.6.0, 12.1.3.0, 12.2.1.…

YOLOv8改进 | 自定义数据集训练 | AirNet助力YOLOv8检测

目录 一、本文介绍 二、AirNet原理介绍 2.1 对比基降解编码器&#xff08;CBDE&#xff09; 2.2 降解引导修复网络&#xff08;DGRN&#xff09; 三、yolov8与AirNet结合修改教程 3.1 核心代码文件的创建与添加 3.1.1 AirNet.py文件添加 3.1.2 __init__.py文件添加 3…

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代&#xff01;AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC&#xff0c;也就是人工智能生成内容&#xff0c;它就像是一股汹涌的浪潮&#xff0c;席卷了整个科技世界。它的出现&#xff0c;让我们看到了人工智能的无限潜力&#xff0c;也…

微服务架构中的负载均衡与服务注册中心(Nacos)

1. 负载均衡&#xff1a;解决实际业务问题 1.1 业务场景思考 想象一个电子商务平台的微服务架构。我们有一个订单服务和多个用户服务实例。当订单服务需要调用用户服务时&#xff0c;它如何选择具体调用哪一台用户服务器&#xff1f;这就是负载均衡要解决的核心问题。 1.2 常…

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…

Hazel 2024

不喜欢游戏的人也可以做引擎&#xff0c;比如 cherno 引擎的作用主要是有两点&#xff1a; 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件&#xff0c;称之为资产 assets 不做窗口类的应用栈&#xff0c;可能要花一年才能做一个能实际使用的应用&#xff0c;只需…