事件派发—事件过滤器—事件分发—事件处理阶段
1、窗口关闭二次确认
2、窗口调整大小
widget.h
protected:
void closeEvent(QCloseEvent *event);
void resizeEvent(QResizeEvent *event);
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();
}
3、鼠标按下、释放、移动事件
新建MyLabel类继承QLabel
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
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);
}
widget.cpp
ui->label->setStyleSheet("border:2px solid red;");
4、重写事件分发函数
举例:监听Tab按键按下事件
widget.h
protected:
// void closeEvent(QCloseEvent *event);
// void resizeEvent(QResizeEvent *event);
bool event(QEvent *event);
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);
}