Qt c++事件的接收和忽略
实验环境:ubuntu18.04 Qt5.9
- 功能和总体设计描述 (插图 俄罗斯 陆军 伊斯坎德尔战术导弹)
自定义微件 mybtn,供按钮提升使用
定时器两个timerid, timerid1
timerid用于导弹发射倒计时
timerid1用于记录首长和飞行员通信时间
mybtn类的事件mousePressEvent用于发送命令,停止timerid,终止导弹发射。事件传递给QPushButton处理mousePressEvent事件,或者由父窗体处理mousePressEvent事件
有两类三种选择:
- 事件传递给基类(由于自定义的mybtn属于QPushButton)
QPushButton::mousePressEvent(QMouseEvent *qm);
- 由QMouseEvent类的指针处理,忽略ignore(),或接收accept()
ignore()事件传递给父窗体处理-----由于项目用的是MainWindow,那么就需要为MainWindow定义一个mousePressEvent事件。 accept()----事件不再传递
- 项目目录,文件构成
- mybtn.h
#ifndef MYBTN_H #define MYBTN_H #include <QWidget> #include <QMouseEvent> #include <QPushButton> class mybtn : public QPushButton { Q_OBJECT public: explicit mybtn(QWidget *parent = nullptr); void mousePressEvent(QMouseEvent *event); signals: }; #endif // MYBTN_H
- mybtn.cpp
#include "mybtn.h" #include <QDebug> #include <QMouseEvent> mybtn::mybtn(QWidget *parent) : QPushButton(parent) { } void mybtn::mousePressEvent(QMouseEvent *qm) { if(qm->button()==Qt::LeftButton) { qDebug()<<"取消发射!!!"; qDebug()<<"不好!遭遇复杂电磁环境,命令无法发出"; //qm->accept();//可以按需解除配置,若解除,事件不会进一步传递 QPushButton::mousePressEvent(qm); qm->ignore();//事件传递给父窗体 } }
- mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "mybtn.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: static int timeelasped;//注意,声明Qt类静态变量的方法,在类实现cpp文件中具体定义 static int timepassed;//注意,声明Qt类静态变量的方法,在cpp文件中要具体定义 MainWindow(QWidget *parent = nullptr); ~MainWindow(); int gettimepassed(); void timerEvent(QTimerEvent *qt); void mousePressEvent(QMouseEvent *event); private: Ui::MainWindow *ui; int timerid; int timerid1; }; #endif // MAINWINDOW_H
-
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> int MainWindow::timeelasped=10; int MainWindow::timepassed=0; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); timerid = this->startTimer(1000); timerid1 = this->startTimer(1000); connect(ui->pushButton,&mybtn::clicked,[=](){//mybtn类mousePressEvent事件传递给基类QPushButton::mousePressEvent(qs)时调用此 qDebug()<<"第二套指挥方案启动成功!"; if(MainWindow::timeelasped>0) { this->killTimer(timerid); this->ui->label_2->setText(QString("发射取消")); } else { this->ui->label_2->setText(QString("无法中止,导弹已经发射,正飞往目标,正尝试使用激光武器")); } }); } int MainWindow::gettimepassed() { //return this->timeelasped; } void MainWindow::timerEvent(QTimerEvent *qt) { if(qt->timerId()==timerid) { QString qs = QString("距导弹发射还有%1秒").arg(--MainWindow::timeelasped); this->ui->label_2->setText(qs); if(MainWindow::timeelasped==0) { this->ui->label_2->setText(QString("导弹已经发射,正飞往目标")); this->killTimer(timerid); } } else { QString qs2 = QString("指挥部同发射员通话时间%1秒").arg(++MainWindow::timepassed); this->ui->label_3->setText(qs2); } } void MainWindow::mousePressEvent(QMouseEvent *qm)//mybtn类中QMouseEvent类对象调用ignore()方法时,事件转至此处理 { qDebug()<<"已交由全俄罗斯作战指挥中心"; if(MainWindow::timeelasped==0) { this->ui->label_4->setText(QString("达瓦里士,已调用战术激光摧毁导弹")); } else { this->ui->label_4->setText(QString("达瓦里士,已成功终止发射")); } } MainWindow::~MainWindow() { delete ui; }
-
main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
注意事项:ui中的按钮要“提升(promote)”为你定义的按钮类mybtn
运行
QDebug打印结果(如果按照代码给出的安排):