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打印结果(如果按照代码给出的安排):

原文地址:https://www.cnblogs.com/saintdingspage/p/12271774.html