Qt QWidget 的各种事件

4 篇文章 0 订阅

Qt跟MFC一样有事件机制,系统产生的事件进入Qt 窗体的事件队列,再由容器层层分发,回调QWidget子类的 xxxEvent事件函数。

// qwidget.h
// ...
protected:
  // Event handlers
  virtual void mousePressEvent(QMouseEvent *event) override; // 鼠标按下事件(不分左右) ,双击鼠标时不会触发第二次
  virtual void mouseReleaseEvent(QMouseEvent *event) override; // 鼠标释放事件(不分左右)
  virtual void mouseDoubleClickEvent(QMouseEvent *event) override; // 鼠标双击事件
  virtual void mouseMoveEvent(QMouseEvent *event) override; // 鼠标按下后的移动事件,鼠标释放时不触发
#if QT_CONFIG(wheelevent)
  virtual void wheelEvent(QWheelEvent *event) override; // 鼠标滚轮事件
#endif
  virtual void keyPressEvent(QKeyEvent *event) override; // 键盘按下事件
  virtual void keyReleaseEvent(QKeyEvent *event) override; // 键盘释放事件
  virtual void focusInEvent(QFocusEvent *event) override; // 获得焦点
  virtual void focusOutEvent(QFocusEvent *event) override; // 释放焦点
  virtual void enterEvent(QEvent *event) override; // 鼠标进入
  virtual void leaveEvent(QEvent *event) override; // 鼠标离开
  virtual void paintEvent(QPaintEvent *event) override; // 窗口重绘
  virtual void moveEvent(QMoveEvent *event) override; // 窗口移动
  virtual void resizeEvent(QResizeEvent *event) override; // 窗口改变大小
  virtual void closeEvent(QCloseEvent *event) override; // 窗口关闭
#ifndef QT_NO_CONTEXTMENU
  virtual void contextMenuEvent(QContextMenuEvent *event) override; // 鼠标右键菜单
#endif
#if QT_CONFIG(tabletevent)
  // 用于平板设备的事件
  virtual void tabletEvent(QTabletEvent *event) override;
#endif
#ifndef QT_NO_ACTION
  virtual void actionEvent(QActionEvent *event) override;
#endif

#ifndef QT_NO_DRAGANDDROP
  /**
   * 拖拽事件,一般不应用于窗体,用于控件
   */
  virtual void dragEnterEvent(QDragEnterEvent *event) override;
  virtual void dragMoveEvent(QDragMoveEvent *event) override;
  virtual void dragLeaveEvent(QDragLeaveEvent *event) override;
  virtual void dropEvent(QDropEvent *event) override;
#endif

  virtual void showEvent(QShowEvent *event) override; // 窗体显示在屏幕上时
  virtual void hideEvent(QHideEvent *event) override; // 窗体从屏幕上消失时,(包括最小化,不包括被遮挡)
  virtual bool nativeEvent(const QByteArray &eventType, void *message,
                           long *result) override;

  // Misc. protected functions
   //   窗体的变化都会触发
  virtual void changeEvent(QEvent *) override;

  // 输入法事件
  virtual void inputMethodEvent(QInputMethodEvent *) override;
// ...
  • 一个拖拽button移动的例子
// mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QObject>
#include <QPushButton>
#include <QWidget>
#include <QPoint>

class MyButton : public QPushButton {
  Q_OBJECT
public:
  MyButton(QWidget *parent = nullptr);

protected:
  void mouseMoveEvent(QMouseEvent *event) override;
  void mousePressEvent(QMouseEvent *event) override;
  void mouseReleaseEvent(QMouseEvent *event) override;

private:
  QPoint prev_pos;
};

#endif // MYBUTTON_H

// mybutton.cc
#include "mybutton.h"
#include <QDebug>
#include <QMouseEvent>

MyButton::MyButton(QWidget *parent) : QPushButton(parent) {
  this->setText("drag me");
  this->show();
}

void MyButton::mouseMoveEvent(QMouseEvent *event) {
  auto delta_pos = event->globalPos() - prev_pos;
  this->move(this->pos() + delta_pos);
  this->prev_pos = event->globalPos();
}

void MyButton::mousePressEvent(QMouseEvent *event) {
  this->prev_pos = event->globalPos();
}

void MyButton::mouseReleaseEvent(QMouseEvent *event) {}

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tadus_zeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值