zoukankan      html  css  js  c++  java
  • 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打印结果(如果按照代码给出的安排):

  • 相关阅读:
    Hui之组件大全
    程序员交流学习平台
    PHP 常用框架
    常用浏览器
    设计必备工具、平台
    文档必备工具
    开发必备工具
    工作必备工具
    源码托管平台、软件
    前端常用框架
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12271774.html
Copyright © 2011-2022 走看看