(十三)事件分发器——event()函数,事件过滤
生活随笔
收集整理的這篇文章主要介紹了
(十三)事件分发器——event()函数,事件过滤
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
事件分發器——event()函數
事件過濾
事件進入窗口之前被攔截 eventFilter?
#include "mywidget.h" #include "ui_mywidget.h" #include <QDebug>MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget) {ui->setupUi(this);// 給MyLabel 安裝事件過濾器// 參數 誰來過濾label 的事件ui->mylabel->installEventFilter(this);ui->label_2->installEventFilter(this); }MyWidget::~MyWidget() {delete ui; }void MyWidget::mousePressEvent(QMouseEvent *) {qDebug() << "+++++++++++++"; }bool MyWidget::eventFilter(QObject *obj, QEvent *e) {// 判斷對象if (obj == ui->mylabel) {// 過濾事件if (e->type() == QEvent::MouseMove){ui->mylabel->setText("++++++++++");return true;}}if (obj == ui->label_2) {if (e->type() == QEvent::MouseMove){ui->label_2->setText("**********");return true;}}// 執行默認處理return QWidget::eventFilter(obj,e); } mywidget.cpp #include "mylabel.h" #include <QMouseEvent> #include <QTimerEvent> #include <QTimer> #include <QEvent>// QWidget 默認是不追蹤鼠標事件的 MyLabel::MyLabel(QWidget *parent) : QLabel(parent) {// 設置窗口追蹤鼠標鍵this->setMouseTracking(true);// 啟動定時器// 參數 1: 觸發定時器的時間, 單位: ms// 參數2: 使用默認值// 返回值: 定時器IDid = startTimer(2000);id1 = startTimer(3000);// 第二種定時器用法 // QTimer * timer = new QTimer(this); // timer->start(100); // connect(timer, &QTimer::timeout, this, [=]() // { // static int number = 0; // this->setText(QString::number(number++)); // }); }// 進入還是離開邊界的一瞬間來完成的 // 鼠標進入 void MyLabel::enterEvent(QEvent *) {setText("你不要在我身上亂摸!!!!"); }// 鼠標離開 void MyLabel::leaveEvent(QEvent *) {setText("終于離開了..."); }void MyLabel::mousePressEvent(QMouseEvent *ev) {// 字符串拼接 QString().arg()// %1, %2, %3 -- 占位符 QString btn;if(ev->button() == Qt::LeftButton){btn = "LeftButton";}else if(ev->button() == Qt::RightButton){btn = "RightButton";}else if(ev->button() == Qt::MidButton){btn = "MidButton";}QString str = QString("MousePree[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn);setText(str); }void MyLabel::mouseReleaseEvent(QMouseEvent *ev) {QString btn;if(ev->button() == Qt::LeftButton){btn = "LeftButton";}else if(ev->button() == Qt::RightButton){btn = "RightButton";}else if(ev->button() == Qt::MidButton){btn = "MidButton";}QString str = QString("MouseRelease[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn);setText(str); }void MyLabel::mouseMoveEvent(QMouseEvent *ev) {QString btn;if(ev->buttons() & (Qt::LeftButton | Qt::RightButton)){btn = "LeftButton";}else if(ev->buttons() & Qt::RightButton){btn = "RightButton";}else if(ev->buttons() & Qt::MidButton){btn = "MidButton";}QString str = QString("MouseMove[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn);setText(str); }// 每觸發一次定時器, 進入該函數中 void MyLabel::timerEvent(QTimerEvent *e) {QString str;if(e->timerId() == id){static int num = -100;str = QString("%1: %2").arg("Time out: ").arg(num++);if(num >= 100){// 關閉定時器 killTimer(id);}}else if(e->timerId() == id1){static int num1 = 10000;str = QString("%1: %2").arg("Time out: ").arg(num1++);if(num1 >= 10000+1000){// 關閉定時器 killTimer(id1);}}setText(str); }bool MyLabel::event(QEvent *e) {// 返回值// true -- 代表事件被處理了,不再繼續下發,停止了// false -- 事件沒有被處理,會繼續向下分發// 大概的處理步驟 // switch(e->type()){ // case QEvent::MouseMove: // mouseMoveEvent(e); // break; // case QEvent::Timer: // timerEvent(e); // break; // }// 過濾定時器事件if (e->type() == QEvent::Timer) {return true;// return false,將事件拋給父類 } // else if (e->type() == QEvent::MouseMove) { // return true; // }else if (e->type() == QEvent::MouseButtonPress) {return false;}// 讓父類執行默認的處理return QLabel::event(e); } mylabel.cpp #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>namespace Ui { class MyWidget; }class MyWidget : public QWidget {Q_OBJECTpublic:explicit MyWidget(QWidget *parent = nullptr);~MyWidget();void mousePressEvent(QMouseEvent *);bool eventFilter(QObject *obj, QEvent *e); private:Ui::MyWidget *ui; };#endif // MYWIDGET_H mywidget.h #ifndef MYLABEL_H #define MYLABEL_H#include <QWidget> #include <QLabel>class MyLabel : public QLabel {Q_OBJECT public:explicit MyLabel(QWidget *parent = nullptr);void enterEvent(QEvent *);void leaveEvent(QEvent *);void mousePressEvent(QMouseEvent *ev);void mouseReleaseEvent(QMouseEvent *ev);void mouseMoveEvent(QMouseEvent *ev);void timerEvent(QTimerEvent *e);bool event(QEvent *e); private:int id;int id1; signals:public slots: };#endif // MYLABEL_H mylabel.h?
轉載于:https://www.cnblogs.com/xiangtingshen/p/10765753.html
總結
以上是生活随笔為你收集整理的(十三)事件分发器——event()函数,事件过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派+驱动器 控制57步进电机运动
- 下一篇: Codeforces Round #55