QT事件介绍

QT事件

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

1、窗口关闭二次确认

2、窗口调整大小

widget.h

cpp 复制代码
protected:
    void closeEvent(QCloseEvent *event);
    void resizeEvent(QResizeEvent *event);

widget.cpp

cpp 复制代码
#include <QMessageBox>
#include <QCloseEvent>
#include <QResizeEvent>
#include <QDebug>

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();
}

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

  • 新建MyLabel类继承QLabel

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

    cpp 复制代码
    #ifndef MYLABEL_H
    #define MYLABEL_H
    
    // #include <QWidget>
    #include <QLabel>
    
    // 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
  • mylabel.cpp

    cpp 复制代码
    #include "mylabel.h"
    
    #include <QMouseEvent>
    #include<QDebug>
    
    // 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);
    }
  • widget.cpp

    cpp 复制代码
    ui->label->setStyleSheet("border:2px solid red;");

4、重写事件分发函数

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

widget.h

cpp 复制代码
protected:
    // void closeEvent(QCloseEvent *event);
    // void resizeEvent(QResizeEvent *event);

    bool event(QEvent *event);

widget.cpp

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);
}
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript