C++系列三:QT-事件处理

目录

介绍:

  1. GUI应用程序是由事件(event)驱动的,点击鼠标,按下按键,窗口大小改变等等
  2. 按事件的来源,可以将事件划分为3类:
    自生事件(spontaneous event):由窗口系统产生,如:QKeyEvent、QMouseEvent。自生事件会进入系统队列,等待事件循环的处理。
    发布事件(posted event):是由Qt应用程序产生,如:QTimerEvent。使用QCoreApplication::postEvent()产生发布事件,等待事件循环的处理。
    发送事件(sent event):有QT或其他程序定向发送的事件。使用QCoreApplication::sendEvent()产生发送事件,有对象的event()函数直接处理。
  3. Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生的系统事件,将它们转换为QEvent,并将转换后的事件发送给QObject。任何QObject派生的类都可以处理事件

来源参考:

  1. 阿西拜编程:https://www.bilibili.com/video/BV1km4y1k7CW/
  2. 流程:https://zhuanlan.zhihu.com/p/638582691
  3. Widget:https://doc.qt.io/qt-6/qwidget.html#protected-slots

事件类:

rect():返回需要绘制的区域的矩形范围;
region():返回需要绘制的区域的 QRegion 对象;
isAccepted():返回一个布尔值,表示是否接受该事件;
accept():标记该事件为已接受,阻止事件进一步传递;
ignore():忽略该事件,允许事件继续传递。

案例1:

protected:
virtual void closeEvent(QCloseEvent *event) override;//窗口关闭时
virtual void paintEvent(QPaintEvent *event) override;//用于触发绘图操作
virtual void keyPressEvent(QKeyEvent *event) override;//键盘点击
virtual void mousePressEvent(QMouseEvent *event) override;//鼠标点击
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button()!=Qt::LeftButton)
        return;
    QPoint pt=event->pos();//相对widget的位置
    QPointF relaPt=event->position();
    QPointF winPt=event->scenePosition();
    QPointF globPt=event->globalPosition();//相对屏幕的绝对位置
    QString str=QString::asprintf("pos()=(%d,%d)",pt.x(),pt.y());
    str+=QString::asprintf("\nposition()=(%.0f,%.0f)",relaPt.x(),relaPt.y());
    str+=QString::asprintf("\nscenePosition()=(%.0f,%.0f)",winPt.x(),winPt.y());
    str+=QString::asprintf("\nglobalPos()=(%.0f,%.0f)",globPt.x(),globPt.y());

    ui->labMove->setText(str);
    ui->labMove->adjustSize();
    ui->labMove->move(event->pos());
    QWidget::mousePressEvent(event);
}
void Widget::keyPressEvent(QKeyEvent *event)
{
    QPoint pt=ui->btnMove->pos();
    if((event->key()==Qt::Key_A)||(event->key()==Qt::Key_Left))
        ui->btnMove->move(pt.x()-20,pt.y());

    if((event->key()==Qt::Key_D)||(event->key()==Qt::Key_Right))
        ui->btnMove->move(pt.x()+20,pt.y());

    if((event->key()==Qt::Key_W)||(event->key()==Qt::Key_Up))
        ui->btnMove->move(pt.x(),pt.y()-20);

    if((event->key()==Qt::Key_S)||(event->key()==Qt::Key_Down))
        ui->btnMove->move(pt.x(),pt.y()+20);

    QWidget::keyPressEvent(event);
}
void Widget::paintEvent(QPaintEvent *event)//背景加载
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.drawPixmap(0,0,width(),this->height(),
                       QPixmap(":/pics/images/background.jpg"));
}
void Widget::closeEvent(QCloseEvent *event)
{
    QMessageBox::StandardButton result=QMessageBox::question(
                this,"消息框","确定要退出吗?",
                QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);

    if(result==QMessageBox::Yes)
        event->accept();
    else
        event->ignore();
}



案例2:
//MyButton.h:
#include <QPushButton>  
#include <QMouseEvent>  

class MyButton : public QPushButton
{
    Q_OBJECT

public:
    explicit MyButton(QWidget* parent = nullptr) : QPushButton(parent) {}

protected:
    void mousePressEvent(QMouseEvent* event) override
    {
        if (event->button() == Qt::LeftButton) {
            // 处理鼠标左键点击事件  
            qDebug() << "LeftButton clicked";
        }
        else if (event->button() == Qt::RightButton) {
            // 处理鼠标右键点击事件  
            qDebug() << "RightButton clicked";
        }
    }
};

//MainWindown.cpp:
QVBoxLayout* vlay = new QVBoxLayout();
QPushButton* btn = new QPushButton("demo",this);
MyButton* btn1 = new MyButton(this);
btn1->setText("demo2");

vlay->addWidget(btn);
vlay->addWidget(btn1);
this->setLayout(vlay);

connect(btn, &QPushButton::clicked, []() {
    qDebug("demo1111");
    });

posted @ 2023-09-12 21:08  cactus9  阅读(84)  评论(0编辑  收藏  举报