添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
狂野的松树  ·  oracle ...·  1 年前    · 
玩足球的白开水  ·  php ...·  1 年前    · 

本文主要总结在Qt5.9中的鼠标事件,该事件包括鼠标进入控件事件、鼠标离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件。

实现鼠标进入、离开、摁下、释放控件的事件,只需要改写事件过滤虚函数eventFilter()就可以实现。

具体的步骤如下所述:

a1.首先注册目标控件,也就是将目标控件加入事件过滤器,用一个函数即可搞定:QPushbutton::installEventFilter(QObject *filterObj);

a2.然后重写虚函数事件过滤虚函数bool eventFilter(QObject *watched, QEvent *event),注意重写后,最后一定要添加一句返回值return QWidget::eventFilter(watched, event),否则注册的控件显示不出来;

a3.在事件过滤器虚函数内,用watched变量判断是否监控到控件(即watched==button);

a4.监控到控件后,用变量event判断当前鼠标事件是哪种事件,然后做对应的操作,做完后返回true;

比如是进入控件事件(event->type() == QEvent::Enter);

比如是离开控件事件(event->type() == QEvent::Leave);

比如是控件内摁下鼠标事件(event->type() == QEvent::MouseButtonPress);

比如是控件内释放鼠标事件(event->type() == QEvent::MouseButtonRelease);

a5.最后操作执行完后,一定要在末尾添加这条返回语句return QWidget::eventFilter(watched, event),否则注册的控件显示不出来。

具体的代码如下:

1.1新建一个widget工程,不要勾选ui界面。然后分别在widget.h,widget.cpp,main.cpp分别添加如下代码。

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QEvent>
#include <QMouseEvent>
class Widget : public QWidget
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
    ~Widget();
protected:
    bool eventFilter(QObject *watched, QEvent *event);
private:
    void setupUI();
    QPushButton *button;
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QVBoxLayout>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    //窗口UI界面初始化
    setupUI();
Widget::~Widget()
bool Widget::eventFilter(QObject *watched, QEvent *event)
    if(watched == button)
        if(event->type() == QEvent::Enter)
            /*鼠标进入按钮事件*/
            qDebug()<<tr("监控到按钮事件,鼠标进入按钮事件");
            return true;
        else if(event->type() == QEvent::Leave)
            /*鼠标离开按钮事件*/
            qDebug()<<tr("监控到按钮事件,鼠标离开按钮事件");
            return true;
        else if(event->type() == QEvent::MouseButtonPress)
            /*鼠标摁下按钮事件*/
            qDebug()<<tr("监控到按钮事件,鼠标摁下按钮事件");
            return true;
        else if(event->type() == QEvent::MouseButtonRelease)
            /*鼠标释放按钮事件*/
            qDebug()<<tr("监控到按钮事件,鼠标释放按钮事件");
            return true;
    return QWidget::eventFilter(watched, event);
void Widget::setupUI()
    /*注册按钮事件,也即是将按钮加入事件过滤器*/
    button = new QPushButton("button");
    button->installEventFilter(this);
    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addWidget(button);
    mainLayout->addStretch();
    this->setLayout(mainLayout);

main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
    QApplication a(argc, argv);
    Widget w;
    w.resize(960,640);
    w.setWindowTitle(QString::fromUtf8("鼠标事件:进入控件事件、离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件"));
    w.show();
    return a.exec();

1.2程序构建和运行后,结果如下图所示:

参考内容:

https://blog.csdn.net/zhenyu5211314/article/details/25599085(参考:鼠标进入控件和离开控件事件)

https://blog.csdn.net/xiezhongyuan07/article/details/80676047(参考:重写虚函数后,不显示按钮问题,需要返回上层)

https://blog.csdn.net/yu275184637/article/details/22865015(参考:鼠标进入控件内摁下和释放事件)

本文主要总结在Qt5.9中的鼠标事件,该事件包括鼠标进入控件事件、鼠标离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件。实现鼠标进入、离开、摁下、释放控件的事件,只需要改写事件过滤虚函数eventFilter()就可以实现。 具体的步骤如下所述:a1.首先注册目标控件,也就是将目标控件加入事件过滤器,用一个函数即可搞定:QPushbutton::installEventFilt...
    我们在做项目的时候,有一个这样的需求,就是一个按钮,鼠标放上去之后,就会弹出一张图片,鼠标移开,图片就消失。比如这样的按钮,鼠标放上去之后,就会弹出对话框该怎么做呢?其中,1.那个带图标的按钮, 其实是个QToolButton, 可以设置前面图标,后面文字。2.使用QLabel 显示图片 m_pStandardLabel = new QLabel(this); QPixmap...
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event) 当鼠标在窗口范围内按下时,将会产生mousePressEvent事件;如果需要接收鼠标按下事件,可以在子类中重载mousePressEvent函数。 2.鼠标双击事件
没想到配置QT使其支持鼠标键盘这种事情我都弄了一整天,只能说自己下瞎折腾效率实在太低了,不过好在最后还是被我找到了,闲来没事记录一下吧。 网上好多关于配置USB鼠标键盘博文,但都是好几年前的,在QT5.9中配置都没反应,只能说大佬们都不屑将这种小儿科写出来,哎。 QT5.9.0中(貌似QT5以后)QWS换成了QPA,对应应用程序添加鼠标、触摸屏、键盘的支持也就成了: export QT_QPA_GENERIC_PLUGINS="tslib,evdevkeyboard:/dev/input/event5,ev
【代码实现】: 首先自定义一个dialog,将该dialog的属性设置如下: setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint); 2.鼠标移入按钮弹出移出按钮关闭弹窗 【效果表现】: 鼠标移入按钮,显示弹窗,鼠标移出按钮,弹窗关闭。 【代码实现】: 先把所有的button和弹窗对象安装到过滤器 bool QObject::event(QEvent *e);//所有事件 dragEnterEvent(QDragEnterEvent *);//拖拽进入事件 focusInEvent(QFocusEvent *);//获得焦点事件 mousePressEvent(QMouseEvent *);//鼠标压下事件 ····//还有几十个各种类型的事件,不一一列举了,任何一个控件的帮助文件里都可以查到 这些事件需要继承父类
##这是一个初学者学习的 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式
在Qt中,可以通过重新实现QWidget的mousePressEvent、mouseReleaseEvent等事件来监听鼠标事件。当QWidget控件进入全屏模式时,你需要确保这些事件被正确地发送到该控件。 以下是一个示例代码,可以监听QLabel控件鼠标事件: ```cpp class FullScreenLabel : public QLabel Q_OBJECT public: explicit FullScreenLabel(QWidget *parent = nullptr); ~FullScreenLabel(); protected: void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; private: QPoint m_lastPos; FullScreenLabel::FullScreenLabel(QWidget *parent) : QLabel(parent) // 设置控件为全屏模式 setWindowState(Qt::WindowFullScreen); FullScreenLabel::~FullScreenLabel() void FullScreenLabel::mousePressEvent(QMouseEvent *event) m_lastPos = event->globalPos(); void FullScreenLabel::mouseReleaseEvent(QMouseEvent *event) QPoint newPos = event->globalPos(); int deltaX = newPos.x() - m_lastPos.x(); int deltaY = newPos.y() - m_lastPos.y(); // 处理鼠标事件 // ... 在这个示例中,我们重新实现了mousePressEvent和mouseReleaseEvent事件,并通过计算鼠标移动的偏移量处理了鼠标事件。当控件进入全屏模式时,我们可以在构造函数中设置窗口状态为Qt::WindowFullScreen。