6_1.event

  • 消息处理流程:

QApplication先得到消息,然后发送给下面的所有窗口。

通过:event()虚函数能够捕获所有的消息,利用该函数可以拦截消息。

1)可以重载具体的虚函数,来实现对消息的响应
2)可以重载event函数,用来处理或者截取消息

 

  • 鼠标键盘消息响应规则  

鼠标消息:

鼠标放到哪个窗口上,对应窗口响应鼠标消息。

键盘消息:

当焦点在哪个窗口上 ,对应窗口响应键盘消息。

 

  • 一个消息可以被多个窗口处理

在QLineEdit输入完字符后,按下回车键,QLineEdit接收该事件,同时父窗口也被接收该事件 。

通过捕获returnPressed信号可以调试出来。

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    /* widget's event handler (all event) */
    bool event(QEvent *);

    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    /* 不要用 */
   // void mouseDoubleClickEvent(QMouseEvent *);

    void keyPressEvent(QKeyEvent *);
    void keyReleaseEvent(QKeyEvent *);

    void closeEvent(QCloseEvent *);

 //   void showEvent(QShowEvent *);
 //   void hideEvent(QHideEvent *);
    void paintEvent(QPaintEvent *);

    QPushButton* button;
    QLineEdit* edit;

signals:

public slots:
    void slotButtonClicked();

};

#endif // MYWIDGET_H
#include "MyWidget.h"
#include <QApplication>
#include <QEvent>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QVBoxLayout>
#include <QPainter>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
//    QVBoxLayout* lay = new QVBoxLayout(this);
#if 0
    QPushButton* button2;
    lay->addWidget(button = new QPushButton("OK", this));
    lay->addWidget(button2 = new QPushButton("Button2"));

    button->setDefault(true);

    // 鼠标不需要按下,mouseMove就能得到调用
    this->setMouseTracking(true);

    connect(button2, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
#endif
//    lay->addWidget(edit = new QLineEdit());
//    connect(edit, SIGNAL(returnPressed()), this, SLOT(slotButtonClicked()));
}

void MyWidget::slotButtonClicked()
{
    QLineEdit* button = (QLineEdit*)sender();
    qDebug() << button->text();
}
/* QApplication先得到->具体应该处理的窗口::event()->event()根据消息类型来调用具体的虚函数 */
/* 1)可以重载具体的虚函数,来实现对消息的响应
   2)可以重载event函数,用来处理或者截取消息 */

/* 截取消息 */
bool MyWidget::event(QEvent *ev)
{
    // 鼠标消息被截断
   // if(ev->type() == QEvent::MouseButtonPress)
     //   return true;
    ev->accept();

    return QWidget::event(ev);
}
void MyWidget::closeEvent(QCloseEvent *)
{
    qDebug() << "closeEvent";
}

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawLine(QPoint(0, 0), QPoint(100, 100));

}

void MyWidget::mousePressEvent(QMouseEvent *ev)
{
#if 0
    QPoint pt = ev->pos();
    qDebug() << pt;
    if(ev->button() == Qt::LeftButton)
    {

    }
    if(ev->modifiers() == Qt::ShiftModifier)
    {
        qDebug() << "shift press";
    }
#endif
    if(ev->button() == Qt::LeftButton)
    {
        if(ev->modifiers() == Qt::ControlModifier)
        {
            // handle with Control;
            return;
        }

        // handle2 without control;
    }
    else
    {

    }
}
void MyWidget::mouseReleaseEvent(QMouseEvent *)
{}
void MyWidget::mouseMoveEvent(QMouseEvent *)
{
    static int i=0;
    qDebug() << "mouse move"<< i++;
}

void MyWidget::keyPressEvent(QKeyEvent *ev)
{
    ev->modifiers();
    int key = ev->key();
    qDebug() << key;
    char a = key;
    qDebug() << (char)a;
}

void MyWidget::keyReleaseEvent(QKeyEvent *)
{}


int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    return app.exec();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunxiaopengsun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值