QT事件
事件派发—事件过滤器—事件分发—事件处理阶段
1、窗口关闭二次确认
2、窗口调整大小
widget.h
protected:
void closeEvent(QCloseEvent *event);
void resizeEvent(QResizeEvent *event);
widget.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
#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
#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
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);
}