Qt系列文章之 mousePressEvent

2023-11-19

上一篇文章介绍QTabWidget的使用技巧。本文开始介绍Qt最常用的事件之一QMouseEvent。

鼠标事件 mousePressEvent

鼠标事件是Qt中十分重要的人机交互形式。鼠标事件包括很多内容,此处先介绍最基本的mousePressEvent事件函数。如前期文章所示,Qt中的大部分事件函数都已经提供了函数接口,我们只需要在具体项目类中对这些事件函数进行具体实现即可。
打开Qt的widget帮助文档,可以找到mousePressEvent的函数定义如下所示:
在这里插入图片描述

mousePressEvent是一个虚函数,通过在子类之中对其进行实现来关联具体的鼠标动作。第一步需要在mainWindow中定义一个mousePressEvent(QMouseEvent *event),注意虚函数的形参类型不能修改,只能是QMouseEvent *,函数定义时后面加上override表示对虚函数进行重新实现。
Cpp之中对mousePressEvent进行实现。

void mainWindow::mousePressEvent(QMouseEvent *event)
{
    return QMainWindow::mousePressEvent(event); //将事件操作权返回给父类
}

在事件之中添加一个简单的打印输出,event事件对象,此处输出鼠标在界面的位置pos(),pos函数给出的是窗口坐标系下的位置而不是桌面坐标下的位置,此函数是比较重要的鼠标事件函数,用于定位鼠标位置:

qDebug()<<"mouse clicked "<<event->pos();

编译运行代码,在界面随便点击鼠标,不论是点击左中右键都会输出一条信息:
在这里插入图片描述
如果我们只希望捕获鼠标左键点击事件,那么在事件处理函数中使用如下的代码过滤掉其他鼠标键输入。button()函数输出鼠标点击的键值。此时再点击鼠标右键或者中键不会有反应。

    if(event->button()==Qt::LeftButton)
    {
        qDebug()<<"mouse clicked "<<event->pos();
    }

下面给鼠标动作加一些复杂的动作,我们先在ui的tab_2添加一个居中的tableWidget,命名为mouseControlTable:
在这里插入图片描述
此时table是一个空的表格,我们先给表格添加两列:
在这里插入图片描述
下面通过数表动作来动态为表格修改行数,假设点击鼠标左键我们为表格增加一行,点击鼠标右键为表格删除一行。

void mainWindow::mousePressEvent(QMouseEvent *event)
{
    int tableRowCount = ui->mouseControlTable->rowCount();
    if(event->button()==Qt::LeftButton)
    {
        ui->mouseControlTable->insertRow(tableRowCount);
    }
    if(event->button()==Qt::RightButton)
    {
        if(tableRowCount) ui->mouseControlTable->setRowCount(tableRowCount-1);
    }
    return QMainWindow::mousePressEvent(event); //将时间操作权返回给主函数
}

此时在界面上如果点击左键,表格会动态增加一行,如果点击右键,表格会动态减少一行。

不过有心的您会发现,当您点击表格区域时,什么动作都不会发生。 那是因为QTableWidget本身就有自己的mouseEvent虚函数,我们并没有对其进行定义。为了实现在表格上点击鼠标操作(如复制粘贴等动作),我们需要对表格类QTableWidget进行继承开发新类,并书写mouseEvent方法,然后将ui中拉入QTableWidget控件提升为自己开发的新类型。 这些将在下一篇帖子进行介绍。


欢迎同好沟通交流,批评指正,欢迎关注我的公号:不如起而行之

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt系列文章之 mousePressEvent 的相关文章

随机推荐

  • C#笔记7——发送电子邮件C#笔记8——多功能电子邮件发送程序实例

    C 笔记7 发送电子邮件 最近用C 测试了一下发邮件功能 用QQ邮件服务器发送邮件 亲测代码如下 for send mail using System Net Mail using System Net using System Threa
  • 使用Vue3自定义指令,让你的应用更具交互性

    个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 1 认识自定义指令 在Vue的模板语法中我们学习过各种各样的指令 v show v for v model等等 除了使用这些指令之外 Vue 也允许我们
  • 永磁同步电机矢量控制(二)——控制原理与坐标变换推导

    2 永磁同步电机控制原理 2 1 从PMSM电机的数学模型出发 dq 轴 电压方程 dq 轴 轴磁链方程 dq 轴 转矩方程 dq 轴 运动方程 分析上述方程 如果我们能够控制 id 0 那么电压方程就可简化为 转矩方程为 运动方程为 以上
  • string (std::string)转换为QString的用法(含中文)

    string s 123 QString str QString fromStdString s 含中文时的转换 std string str 你好世界 QString Name QString fromLocal8Bit str c st
  • redis配置认证密码

    redis配置密码 1 通过配置文件进行配置 yum方式安装的redis配置文件通常在 etc redis conf中 打开配置文件找到 requirepass foobared去掉行前的注释 并修改密码为所需的密码 保存文件 requir
  • 2-数据结构-线性表之顺序表的动态分配

    说明 由于原来顺序表的静态分配 浪费空间 且存在溢出现象 因此采取动态分配的方式 创建顺序表中的数组 跟C语言正常动态分配一样 需要直到扩充的大小 和数组指针即可 代码如下 看着多 其实原理差不多 主要知道哪些操作即可 无需了解具体代码 i
  • 基于深度学习的文本分类系统(完整代码+数据)bert+rnn textcnn fastcnn bert

    程序说明 硬件 GPU Tesla V100 32GB显存 内存 32GB
  • OpenFace库(Tadas Baltrusaitis)中基于HOG进行正脸人脸检测的测试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具 它的源码可以从https github com TadasBaltrusaitis OpenFace下载 OpenFace主要包括面部关键点检测 facia
  • 计算机毕业设计项目大全

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • 美化github首页

    创建仓库 注 新建仓库的名字要和自己的名字完全一致 提交的源码必须在主分支上 master或者main 配置完成 回到你的主页 你就能看到在置顶项目的上方多了一个README md 编辑改文件即可 美化首页源码 1 github概览数据 G
  • 若依框架中@DataScope数据权限注解的使用与自定义sql语句。

    介绍 若依框架本身具有角色 部门 用户业务 在业务中 用户必须绑定一个角色 而角色又必须将自身绑定到部门 角色绑定了哪些部门 就决定着隶属于该角色的用户能对哪些部门数据进行增删改 那么 怎么实现让用户只能遵循其绑定角色所指定的部门 来进行数
  • 分布式CAP定理,为什么不能同时满足三个特性?

    在弄清楚这个问题之前 我们先了解一下什么是分布式的CAP定理 根据百度百科的定义 CAP定理又称CAP原则 指的是在一个分布式系统中 Consistency 一致性 Availability 可用性 Partition tolerance
  • linux rhel6 nvidia 卡 在启动界面,RHEL6上安装Nvidia显卡驱动

    二 在字符界面下 运行级3 运行驱动安装程序 在RHEL6上因为Nouveau的关系会出现下面的错误 因此需要将该模块禁用掉 root rhel6 sh NVIDIA Linux x86 64 275 09 07 run Verifying
  • 如何编译SQLite-How To Compile SQLite

    SQLite是ANSI C的源代码 在使用之前必须要编译成机器码 这篇文章是用于各种编译SQLite方法的指南 这篇文章不包含编译SQLite的每个步骤的反馈 那样可能会困难因为每种开发场景都不同 所以这篇文章描述和阐述了编译Sqlite的
  • 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)

    文章目录 四 智能合约的开发和WeBASE合约IDE的使用 一 实验概述 二 实验目标 三 实验环境及建议 四 实验步骤 4 1 启动Webase 4 2 智能合约开发 4 2 1 合约功能设计 4 2 2 存证合约开发 4 2 3 工厂合
  • 浅析赋值、浅拷贝、深拷贝的区别

    1 原理 赋值 将某一对象赋给某个变量的过程 称为赋值 浅拷贝 浅拷贝是创建一个对象 这个对象有着原始对象属性值的一份精准拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 如果其中一个对象改变了这个地
  • 寒假训练 第二节 数据结构基础 总结

    数组 定义 语言支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 所有的数组都是由连续的内存位置组成 最低的地址对应第一个元素 最高的地址对应最后一个元素 数组
  • python 爬虫 GET(带参) 请求 配置params参数

    import requests 发送网络请求 response requests get http httpbin org get name Jack age 30 print response text 输出结果 args age 30
  • 2019北邮网安院机试真题(回忆版)@lantin

    2019北邮网安院机试真题 回忆版 细不谈 前两题真的都是签到题 会简单排序和if else都可以写的出来的题目 网安院的机试基本上是两道签到题 C题是数据结构题 D题是算法 做到保2争3 保3争4面试不出原则问题基本上复试稳了 Probl
  • Qt系列文章之 mousePressEvent

    上一篇文章介绍QTabWidget的使用技巧 本文开始介绍Qt最常用的事件之一QMouseEvent 鼠标事件 mousePressEvent 鼠标事件是Qt中十分重要的人机交互形式 鼠标事件包括很多内容 此处先介绍最基本的mousePre