Qt实现鼠标双击事件

这篇具有很好参考价值的文章主要介绍了Qt实现鼠标双击事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当同一个部件既要响应鼠标单击事件又要响应鼠标双击事件时,就会发生冲突,如下例:

创建自己的按钮类,让其继承于QPushButton类(特别注意!!!),在创建类的时候默认可供选择的基类中无QPushButton类且没有QPushButton类的基类,无法使用多重继承,故必须手动修改继承。之后声明所具备的信号以及信号的发送条件,头文件里面代码如下:

#ifndef MYBTN_H
#define MYBTN_H

#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QEvent>

class Mybtn :  public QPushButton
{
    Q_OBJECT
public:
    explicit Mybtn(QWidget *parent = nullptr);
    //重写父类的两个虚函数
    virtual void mouseDoubleClickEvent(QMouseEvent *event) {
        if(event->button() == Qt::LeftButton) {
            emit doubleClicked();
        }
    }
    virtual void mousePressEvent(QMouseEvent *event) {
        if(event->button() == Qt::LeftButton) {
            emit mousePress();
        }
    }
signals:
    void doubleClicked();
    void mousePress();
};

#endif // MYBTN_H

在源文件中实现按钮的构造函数,此类的析构函数采用系统默认提供,故不声明,源文件里面代码如下:

#include "mybtn.h"
#include <QString>
#include <QPushButton>
#include <QDebug>

Mybtn::Mybtn(QWidget *parent)
    :QPushButton{parent}
{
    this->setParent(parent);
    this->setText("我是自定义按钮");
    this->setFixedSize(QSize(100, 50));
}

之后在widget中实例化一个按钮对象,并使用连接函数(connect函数用法此处不赘述)实现鼠标单击事件与鼠标双击事件,widget源文件代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include "mybtn.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    Mybtn *btn = new Mybtn(this);
    btn->move(100,200);
    connect(btn,&Mybtn::mousePress,this,&Widget::close);
    connect(btn,&Mybtn::doubleClicked,this,&Widget::close);
}

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

运行之后发现了在文章开头提到的问题,在单击鼠标之后,connect函数就会触发,从而关闭界面, 与鼠标双击事件冲突。解决方法:添加一个计时器,在规定时间内要是只单击一次就是鼠标单击事件,否则为鼠标双击事件。创建自定义按钮类的操作和前文所述相近,不再过多赘述,头文件代码如下:

#ifndef MYBTN_H
#define MYBTN_H

#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QEvent>
#include <QTimer>
#include "mybtn.h"

class Mybtn : public QPushButton
{
    Q_OBJECT
public:
    explicit Mybtn(QWidget *parent = nullptr);
    void mousePressEvent(QMouseEvent *)override; //重写函数
signals:

private slots:
    void slotClickTime();

private:
    QTimer* _clickTimer = nullptr;//使用定时器来判断鼠标单击还是双击
    int _clickCount = 0;//点击次数
};

#endif // MYBTN_H

自定义按钮类源文件如下:

#include "mybtn.h"
#include <QString>
#include <QPushButton>
#include <QDebug>
#include <QTimer>

Mybtn::Mybtn(QWidget *parent)
    : QPushButton{parent}//构造函数的调用
{
    _clickTimer = new QTimer;
    connect(_clickTimer, SIGNAL(timeout()), this, SLOT(slotClickTime()));
    this->setParent(parent);
    this->setText("我是自定义按钮");
    this->setFixedSize(QSize(100, 50));
}
//头文件中声明的重写函数在此实现
void Mybtn::mousePressEvent(QMouseEvent *e) {
    if (e->button() & Qt::LeftButton) {
        if (!_clickTimer->isActive()) {
            _clickTimer->start(300);
            _clickCount++;
        } else {
            _clickCount++;
        }
    }
}

void Mybtn::slotClickTime() {
    _clickTimer->stop();
    if (_clickCount == 1) {//只点击了一次
        qDebug() << QStringLiteral("鼠标左键点击了一次");
    } else if (_clickCount == 2) {//双击鼠标
        qDebug() << QStringLiteral("鼠标左键点击了两次");
    }
    _clickCount = 0;
}

widget的源文件如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include "mybtn.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    Mybtn *btn = new Mybtn(this);
    btn->move(100,200);
}

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

最后运行结果可以监测出鼠标单击与鼠标单击事件,运行结果如下:

qt双击信号,Qt问题解决与实例,qt,c++

---------------------------------------------------------------------------------------------------------------------------------

大家有问题可以与我交流~文章来源地址https://www.toymoban.com/news/detail-692743.html

到了这里,关于Qt实现鼠标双击事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt实现判断鼠标左右键信号

    Qt按钮自带的信号非常简单,并不能区分鼠标左右键,但是实际上Qt组件的功能很强大,只是将区分按键的功能隐藏了。 要实现这个功能,就需要自定义信号,然后重载mousePressEvent()函数。 需要注意的几个细节: 必须要继承 QObject 类或它的子类,比如 QWidget 、 QPushButton 等。

    2024年02月16日
    浏览(47)
  • QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

    需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示 问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来 ui图: 问题1:处理QSlider 滚轮事件的时候 这里有很大的问题,但是不知道原因,为什么会出现这样的原因,网上

    2024年02月01日
    浏览(46)
  • QT--day4(定时器事件、鼠标事件、键盘事件、绘制事件、实现画板、QT实现TCP服务器)

     QT实现tcpf服务器代码:(源文件) 头文件:

    2024年02月15日
    浏览(54)
  • Qt自定义控件 —— 子控件与父控件的鼠标事件问题

    目录 0、引言: 1、问题描述: 2、解决方案: 3、解决后效果: 在 Qt自定义控件 —— 颜色选择组合控件 https://blog.csdn.net/YMGogre/article/details/128955257 一文中我们创建了自定义的组合控件,在该控件中包含了三个子控件 —— QGraphicsView 、 QLineEdit 和 QPushButton 。当我们通过 setIt

    2024年02月09日
    浏览(93)
  • Qt实现全局鼠标事件监听器-Linux

    更多精彩内容 👉个人内容分类汇总 👈 👉Qt自定义模块、工具👈 Qt版本:V5.12.5 兼容系统: Windows:这里测试了Windows10,其它的版本没有测试; Linux:这里测试了ubuntu18.04、20.04,其它的没有测试; Mac:等啥时候我有了Mac电脑再说。 有时候我们想获取到【系统全局鼠标事件】

    2024年02月11日
    浏览(42)
  • Qt实现全局鼠标事件监听器-Windows

    更多精彩内容 👉个人内容分类汇总 👈 👉Qt自定义模块、工具👈 Qt版本:V5.12.5 兼容系统: Windows:这里测试了Windows10,其它的版本没有测试; Linux:这里测试了ubuntu18.04、20.04,其它的没有测试; Mac:等啥时候我有了Mac电脑再说。 有时候我们想获取到【系统全局鼠标事件】

    2024年02月16日
    浏览(39)
  • QTday4(鼠标事件和键盘事件/QT实现连接TCP协议)

    笔记 时钟绘制  

    2024年02月15日
    浏览(38)
  • Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

    现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。 一种更为直接的解决方案是子类化 QLineEdit 并且重新实现鼠标事件 keyPressEvent() ,然后调用 focusNextChild() 。 首先需要创建一个子类MyLineEdit继承于QLineEdit类。然后重

    2024年02月12日
    浏览(57)
  • 【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

    说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。 示例 myitem 为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。 myitem.h myi

    2024年02月04日
    浏览(51)
  • Qt - Qt5事件处理(鼠标事件)

    鼠标事件 ​ 鼠标事件包括鼠标的移动,鼠标键按下,松开,单击,双击等 使用鼠标事件时,加入对应头文件 常见的鼠标事件如下: QMouseEvent类包含了用于描述鼠标事件的参数。 当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。 鼠标移动事件只会

    2023年04月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包