-
消息处理流程:
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();
}