【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

07-21 1017阅读

qt 事件

  • 事件
    • 1. 事件概念
    • 2. 事件的处理
    • 3. 按键事件
      • (1)单个按键
      • (2)组合按键
      • 4. 鼠标事件
        • (1)鼠标单击事件
        • (2)鼠标释放事件
        • (3)鼠标双击事件
        • (4)鼠标移动事件
        • (5)滚轮事件

          事件

          1. 事件概念

          事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当用户按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在用户操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常见的 Qt 事件如下:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          常见事件描述:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          2. 事件的处理

          事件处理⼀般常用的方法为:重写相关的 Event 函数。

          在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。如:在实现⿏标的进⼊和离开事件时,直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          代码示例1:

          1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件;

          2、设计 UI 文件,在 ui 文件中拖入一个 Label,给 Label 加一个边界框,方便观察鼠标进入和移动,如下图;

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          3、在项目中新添加⼀个类:MyLabel;

          先选中项⽬名称 qt_event,点击⿏标右键,选择 add new … ,弹出如下对话框:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          接下来弹出以下界面,按照下面的操作即可:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          此时项⽬中会新添加以下两个文件件:

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          4、将 enterEvent() 添加到项目文件 “mylabel.h” 中:

          			#ifndef MYLABEL_H
          			#define MYLABEL_H
          			
          			#include 
          			
          			class MyLabel : public QWidget
          			{
          			    Q_OBJECT
          			public:
          			    explicit MyLabel(QWidget *parent = nullptr);
          			    
          			    // 鼠标进入事件
          			    void enterEvent(QEvent* event);
          			
          			signals:
          			
          			};
          			
          			#endif // MYLABEL_H
          

          5、在 mylabel.cpp 中重写 enterEvent() 方法:

          			#include "mylabel.h"
          			#include 
          			
          			MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
          			{}
          			
          			void MyLabel::enterEvent(QEvent *event)
          			{
          			    qDebug()  提升为…,当点击 "提升为… " 之后,弹出如下对话框,按照顺序添加即可: 
          

          【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

          7、修改基类,到 mylabel.cpp 和 mylabel.h 中将 Widget 改为 QLabel:

          mylabel.h:

          			#ifndef MYLABEL_H
          			#define MYLABEL_H
          			
          			#include 
          			
          			class MyLabel : public QLabel
          			{
          			    Q_OBJECT
          			public:
          			    explicit MyLabel(QWidget *parent = nullptr);
          			
          			    // 鼠标进入事件
          			    void enterEvent(QEvent* event);
          			
          			signals:
          			
          			};
          			
          			#endif // MYLABEL_H
          

          mylabel.cpp:

          			#include "mylabel.h"
          			#include 
          			
          			MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
          			{}
          			
          			void MyLabel::enterEvent(QEvent *event)
          			{
          			    qDebug() y());
          			    qDebug() button() == Qt::LeftButton) {
          			        // x, y 为基于窗口的坐标
          			        QString str = QString("鼠标左键: x = %1, y = %2").arg(ev->x()).arg(ev->y());
          			        qDebug() button() == Qt::RightButton) {
          			        // globalX, globalY 为基于屏幕的坐标
          			        QString str = QString("鼠标左键: x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());
          			        qDebug() setupUi(this);
          			}
          			
          			Widget::~Widget()
          			{
          			    delete ui;
          			}
          			
          			void Widget::keyPressEvent(QKeyEvent *event)
          			{
          			    if(event->key() == Qt::Key_A) {
          			        qDebug() modifiers() == Qt::ControlModifier) // 判断是否按下ctrl键
          			    {
          			        if(event->key() == Qt::Key_A) {     // 判断 A 键是否按下
          			            qDebug() setupUi(this);
          			}
          			
          			Widget::~Widget()
          			{
          			    delete ui;
          			}
          			
          			void Widget::mousePressEvent(QMouseEvent *event)
          			{
          			    if(event->button() == Qt::LeftButton) {
          			        qDebug() button() == Qt::MidButton) {
          			        qDebug() button() == Qt::LeftButton) {
          			        qDebug() button() == Qt::LeftButton) {
          		        qDebug() setupUi(this);
          			
          			    // 设置鼠标追踪状态
          			    setMouseTracking(true);
          			}
          			
          			void Widget::mouseMoveEvent(QMouseEvent *event)
          			{
          			    qDebug()  0) {
          			        qDebug() 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]