【Qt】事件处理


事件

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表示⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent

事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。⼀些事件是在用户操作时发出,如键盘事件、鼠标事件等,另⼀些事件则是由系统自动发出,如定时器事件。常见的 Qt 事件如下:

  • QMouseEvent 鼠标事件

  • QKeyEvent 键盘事件

Qt在上级控件中定义了一些事件处理函数,这是一些虚函数,如(例如 QObject::event()QWidget::mousePressEvent())。对象通过继承上级基类,并重写事件处理函数来处理事件。

事件与信号槽机制

信号槽实际上是Qt为了方便事件处理的实现,抽象出来的一种机制,也就是说事件是信号槽的底层实现,我们在开发中往往使用信号槽居多,事件机制适用于更底层,更贴近系统层面的事件处理。


鼠标事件

QWidget中关于鼠标的事件

Events 说明
mousePressEvent(QMouseEvent *event) 点按鼠标
mouseReleaseEvent(QMouseEvent *event) 释放鼠标
mouseDoubleClickEvent(QMouseEvent *event) 双击鼠标
mouseMoveEvent(QMouseEvent *event) 移动鼠标
enterEvent(QEvent *event) 鼠标进入控件
leaveEvent(QEvent *event) 鼠标离开控件
wheelEvent(QWheelEvent *event) 滑动鼠标滑轮

QMouseEvent类中一些常用接口

接口 说明
QPoint pos() 获取鼠标所在坐标 (当前控件内)
int x() 横坐标
int y() 纵坐标
Qt::MouseButton button() 返回造成此次事件发生的鼠标按键 (Qt::MouseButton鼠标按键枚举类型)
QPoint globalPos() 获取鼠标所在坐标 (全屏内)
class Label : public QLabel//自定义Label类,继承自QLabel,重写事件处理函数以自定义事件处理逻辑
{
    Q_OBJECT
public:
    Label(QWidget* parent);

    //重写事件处理函数
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void wheelEvent(QWheelEvent *event);
};
#include "label.h"
#include <QDebug>
#include <QMouseEvent>

Label::Label(QWidget* parent) : QLabel(parent)
{

}

void Label::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        qDebug() << "点击了左键";
    }
    else if(event->button() == Qt::RightButton){
        qDebug() << "点击了右键";
    }
    qDebug() << event->pos();
}

void Label::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug() << event->x() << " " << event->y();
}

void Label::mouseDoubleClickEvent(QMouseEvent *event)
{
    (void)event;
    qDebug() << "双击鼠标";
}

void Label::mouseMoveEvent(QMouseEvent *event)
{
/*    
    If mouse tracking is switched off, 
    mouse move events only occur if a mouse button is pressed while the mouse is being moved.
*/
    qDebug() << "move: " << event->pos();
}

特别地,为了提高效率,mouseMoveEvent事件并不会鼠标一移动就触发,那样会发生非常多次!进行以下设置会打开鼠标追踪,不限制鼠标移动事件的触发。

this->setMouseTracking(true);

鼠标滑轮事件

void Label::wheelEvent(QWheelEvent *event)
{
    //使用鼠标滑轮,改变字体大小
    QFont font = this->font();
    int newPointSize = font.pointSize() + event->delta() / 10;
    if(newPointSize > 0){
        font.setPointSize(newPointSize);
        this->setFont(font);
    }
}

delta()函数返回滑轮滚动的距离。向前滚动返回正数,向后滚动返回负数。一个滚动单位的数值是120。


键盘事件

QWidget中关于键盘的事件

Events 说明
keyPressEvent(QKeyEvent *event) 点击键盘按键
keyReleaseEvent(QKeyEvent *event) 释放键盘按键

注意,控件必须被聚焦时 (focus on),键盘事件才会发生。

  • 单个按键
void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug() << event->key();//获取键盘输入的按键是哪个,可以直接使用值,
    //也可以使用Qt中的内置按键枚举类型Key
    if(event->key() == Qt::Key_A){
        qDebug() << "按下了A键";
    }
    else if(event->key() == Qt::Key_B){
        qDebug() << "按下了B键";
    }
}
  • 组合键

    Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作。

image-20240717162435710

相关推荐

  1. Qt中的事件事件处理

    2024-07-22 13:42:01       51 阅读
  2. Qt 使用eventfilter处理绘图事件

    2024-07-22 13:42:01       47 阅读
  3. Qt事件处理和传递流程

    2024-07-22 13:42:01       25 阅读
  4. Qt事件处理机制2-事件函数的传播

    2024-07-22 13:42:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 13:42:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 13:42:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 13:42:01       45 阅读
  4. Python语言-面向对象

    2024-07-22 13:42:01       55 阅读

热门阅读

  1. 多个返回值QT/C++

    2024-07-22 13:42:01       17 阅读
  2. C# --- .Net Framework中的Binding Redirect

    2024-07-22 13:42:01       19 阅读
  3. 深入语音识别:贝叶斯准则的细致解析

    2024-07-22 13:42:01       18 阅读
  4. 从统计学、到机器学习和ChatGPT

    2024-07-22 13:42:01       18 阅读
  5. MobaXterm远程工具

    2024-07-22 13:42:01       21 阅读
  6. 【TORCH】获取第一个batch数值的几种方法

    2024-07-22 13:42:01       19 阅读
  7. [Python]使用pyttsx3将文字转语音

    2024-07-22 13:42:01       14 阅读
  8. 【QT】线程控制和同步

    2024-07-22 13:42:01       15 阅读
  9. [基础算法理论] --- 双指针

    2024-07-22 13:42:01       17 阅读
  10. PHP银行卡实名认证接口对接、银行卡识别

    2024-07-22 13:42:01       17 阅读
  11. 27. 移除元素【 力扣(LeetCode) 】

    2024-07-22 13:42:01       17 阅读
  12. HTML5+CSS3学习笔记第一天

    2024-07-22 13:42:01       15 阅读
  13. LeetCode 常见题型汇总

    2024-07-22 13:42:01       16 阅读