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

news2024/11/27 8:19:01

😁博客主页😁:🚀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.coloradmin.cn/o/2134792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做外贸为什么要做谷歌seo?

跟国内不同&#xff0c;购物有多个大平台可供选择&#xff0c;在海外是有很多人会在谷歌搜索上寻找自己想要的产品或者服务的&#xff0c;海外谷歌那是真正的老大哥&#xff0c;你想要的都能搜到&#xff0c;而谷歌的流量以及准确性&#xff0c;都不是国内以及购物平台可以比拟…

Vue组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…

H3C CAS系列开篇之CAS初认识

一、前言 基于信创需要,某项目中的VMware软件存求替代方案,尤其在Virtual Desktop Infrastructure(VDI)方面,寻求使用紫光集团旗下H3C的CAS云计算管理平台,又称CAS虚拟化解决方案/管理系统,H3C CAS是H3C公司面向数据中心自主研发的企业级虚拟化软件。CAS提供了强大的虚拟…

nz-select 数据回显失败,大模型救了我一命。

文章目录 前言问题现象问题解决经过数据类型的问题&#xff1f;求助大模型问题解决 小小的疑问 前言 最近老苦逼了。原本计划推进的《软件开发人员从0到1实现物联网项目》项目因为种种原因停滞了将近一个月&#xff0c;进展缓慢。其中一个原因就和本文有关。 继《时隔5年重拾…

MySQL迁移达梦,部分数据写入失败,VARCHAR字段长度不足

迁移时&#xff0c;字符长度选择“4”即可。如果是GBK可选择“2”。

八道指针笔试题

文章目录 笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8 笔试题1 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } //程序的结果是什么&#xff1f;首先定义了一个数组…

数据结构————双链表

目录 一、单链表的定义及其特点 定义&#xff1a; 特点&#xff1a; 双链表的优缺点 双链表的关键特性 二、双链表的实现 准备工作&#xff1a; 自定义数据元素类型&#xff1a; 1.双链表的创建 1.1头插法介绍 1.2尾插法介绍 2.双链表的初始化 3.双链表的求表长 4.…

TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准

随着时序数据库&#xff08;Time Series Database&#xff09;的日益普及&#xff0c;越来越多的工业自动化控制&#xff08;工控&#xff09;人员开始认识到其强大能力。然而&#xff0c;时序数据库在传统实时数据库应用领域&#xff0c;特别是在过程监控层的推广仍面临挑战&a…

cmd命令

常用命令 查看电脑名称&#xff1a; hostname 查看网卡信息&#xff1a; ipconfig 快速打开网络设置界面&#xff1a; control.exe netconnections 或 rundll32.exe shell32.dll,Control_RunDLL ncpa.cpld 打开防火墙设置&#xff1a; wf.msc 指定网卡设置IP地址&#…

linux_L1_linux重启服务器

使用putty登录到linux服务器切换到管理员账号 sudo -s重启命令 reboot

Unity全面取消Runtime费用 安装游戏不再收版费

Unity宣布他们已经废除了争议性的Runtime费用&#xff0c;该费用于2023年9月引入&#xff0c;定于1月1日开始收取。Runtime费用起初是打算根据使用Unity引擎安装游戏的次数收取版权费。2023年9月晚些时候&#xff0c;该公司部分收回了计划&#xff0c;称Runtime费用只适用于订阅…

ROS1录包偶现一次崩溃问题定位

现象&#xff1a;崩到了mogo_reporter里面 堆栈&#xff1a;crash里面同时存在两个主线程的堆栈 代码 #include "boost/program_options.hpp" #include <signal.h> #include <string> #include <sstream> #include <iostream> #include <…

【PSINS】ZUPT代码解析(PSINS_SINS_ZUPT)|MATLAB

这篇文章写关于PSINS_SINS_ZUPT的相关解析。【值得注意的是】:例程里面给的这个m文件的代码,并没有使用ZUPT的相关技术,只是一个速度观测的EKF 简述程序作用 主要作用是进行基于零速更新(ZUPT)的惯性导航系统(INS)仿真和滤波 什么是ZUPT ZUPT是Zero Velocity Update(…

828华为云征文 | 使用华为云Flexus云服务器X安装搭建crmeb多门店商城教程

&#x1f680;【商城小程序&#xff0c;加速启航&#xff01;华为云Flexus X服务器助力您的业务腾飞】&#x1f680; 1、点击链接进入华为云官网&#xff0c;页面如下&#xff1a; 华为云Flexus云服务器X选购页面 https://www.huaweicloud.com/product/flexus-x.html 2、进…

Uniapp + Vue3 + Vite +Uview + Pinia 实现提交订单以及支付功能(最新附源码保姆级)

Uniapp Vue3 Vite Uview Pinia 实现提交订单以及支付功能&#xff08;最新附源码保姆级&#xff09; 1 效果展示2 提交订单2.1 cart.js2.2 submit-order.vue 3、支付页面order-pay.vue 1 效果展示 2 提交订单 2.1 cart.js // src/pages/store/cart/cart.js import {defineS…

【最新华为OD机试E卷】报文响应时间(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

mybatis获取参数的5种情况

Mybatis获取参数值的两种方式 mybatis获取参数值的方式有两种: ${} 和 #{} ${} 这个的本质就是字符串拼接 这个无法避免sql注入攻击 #{} 这个的本质就是占位符(尽量使用 #{} 的方式) 可以避免sql注入 mybatis获取参数值的情况 1.mapper接口方法的参数为单个字面量类型…

solidity-20-sendeth

发送ETH 这章的标题让我觉得奇怪&#xff0c;因为先前我也发送ETH&#xff0c;如上一篇提到的recieve和fallback函数。 重现了教程中的代码 // SPDX-License-Identifier: MIT pragma solidity ^0.8.21;contract sendeth{// 这个事件是为了打log,记录收到的eth和剩余的gas fee…

echarts中tooptips提示框超出了怎么解决

我们在制作echarts表格时&#xff0c;有时候会遇到提示框内容较多&#xff0c;会让提示框超出&#xff0c;展示不全数据&#xff0c;如下&#xff1a; 这种情况下需要在tooltips下增加一些属性&#xff1a; 1.confine: true&#xff1a;这个配置的作用是让提示框&#xff08;t…

Docker笔记-容器数据卷

Docker笔记-容器数据卷 docker的理念将运行的环境打包形成容器运行&#xff0c;运行可以伴随容器&#xff0c;但是我们对数据的要求是希望持久化&#xff0c;容器 之间可以共享数据&#xff0c;Docker容器产生的数据&#xff0c;如果不通过docker commit生成新的镜像&#xf…