• QT事件介绍


    QT事件

    事件派发—事件过滤器—事件分发—事件处理阶段

    1、窗口关闭二次确认

    2、窗口调整大小

    widget.h

    protected:
        void closeEvent(QCloseEvent *event);
        void resizeEvent(QResizeEvent *event);
    
    • 1
    • 2
    • 3

    widget.cpp

    #include 
    #include 
    #include 
    #include 
    
    void Widget::closeEvent(QCloseEvent *event)
    {
        int ret = QMessageBox::question(this,"提示", "您确定要关闭窗口吗?");
        if (ret == QMessageBox::Yes)
        {
            event->accept();
        }
        else {
            event->ignore();
        }
    }
    
    void Widget::resizeEvent(QResizeEvent *event)
    {
        qDebug()<<"oldSize:"<<event->oldSize();
        qDebug()<<"newSize:"<<event->size();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3、鼠标按下、释放、移动事件

    • 新建MyLabel类继承QLabel

      • 新建工程
      • ui绘制Label
      • 新增c++类(类名叫MyLabel)继承QWidget,在代码中修改继承为QLabel
      • 在ui绘制中调整Label提升为新创建的MyLabel类
    • mylabel.h

      #ifndef MYLABEL_H
      #define MYLABEL_H
      
      // #include 
      #include 
      
      // class MyLabel : public QWidget
      class MyLabel : public QLabel
      {
          Q_OBJECT
      public:
          explicit MyLabel(QWidget *parent = 0);
      
      signals:
      
      public slots:
      
      protected:
          void mousePressEvent(QMouseEvent *ev);
          void mouseReleaseEvent(QMouseEvent *ev);
          void mouseMoveEvent(QMouseEvent *ev);
      
      };
      
      #endif // MYLABEL_H
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
    • mylabel.cpp

      #include "mylabel.h"
      
      #include 
      #include
      
      // MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
      MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
      {
          this->setMouseTracking(true);  // 设置为true后,不需要按下鼠标即可追踪鼠标了
      }
      
      void MyLabel::mousePressEvent(QMouseEvent *ev)
      {
          // qDebug()<<"标签被鼠标按下了";
      
          if(ev->button() == Qt::LeftButton){
              qDebug()<<"标签被鼠标左键按下了";
          }else if (ev->button() == Qt::RightButton){
              qDebug()<<"标签被鼠标右键按下了";
          }else {
              qDebug()<<"标签被鼠标其他键按下了";
          }
      }
      
      void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
      {
          qDebug()<<"在标签上的鼠标释放了";
      }
      
      void MyLabel::mouseMoveEvent(QMouseEvent *ev)
      {
          // qDebug()<<"在标签上的鼠标移动了";
          qDebug()<<"在标签上的鼠标移动了"<<ev->x()<<","<<ev->y();
      
      		QString str;
          str.sprintf("(%d , %d)",ev->x(), ev->y());
          this->setText(str);
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
    • widget.cpp

      ui->label->setStyleSheet("border:2px solid red;");
      
      • 1

    4、重写事件分发函数

    举例:监听Tab按键按下事件

    widget.h

    protected:
        // void closeEvent(QCloseEvent *event);
        // void resizeEvent(QResizeEvent *event);
    
        bool event(QEvent *event);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    widget.cpp

    bool Widget::event(QEvent *event)
    {
        // 判断事件类型(键盘事件)
        if(event->type() == QEvent::KeyPress){
            // 将QEvent类型的event转换类型为QKeyEvent
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if(keyEvent->key() == Qt::Key_Tab){
                qDebug()<<"TAB被按下";
                return true;
            }
        }
    		// 上面处理事件之后,可以直接返回true,表示已经对此事件进行了处理;
    		// 对于其他不关心的事件,则需要调用父类的event()函数继续转发。
        return QWidget::event(event);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    安卓稳定性测试必备工具Monkey详解
    idea集成swagger创建接口文档
    计算机毕业设计ssm基于ssm流浪宠物领养系统8xg84系统+程序+源码+lw+远程部署
    深入理解 volatile 关键字
    如何制作专属的VS Code主题
    车载软件架构 —— 持续集成持续交付
    selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()
    Elasticsearch 深入理解search After 处理深度分页问题
    fastapi项目结构以及多进程部署
    九、Nacos集群搭建
  • 原文地址:https://blog.csdn.net/qq_27751235/article/details/136469341