Qt c++事件,以及事件的接收和忽略

实验环境:linux mint 下Qt5.11

  • Qt中的事件

其实我们谈及Qt编程,第一个想起的无外乎信号和槽,信号就是通过某一控件的动作(例如按钮的按下和抬起)让接收信号的微件有所响应(调用标准或自定义函数----槽)。

而事件,为响应微件事件作出函数处理增加了更多的可能。

  • 常见事件----我们为窗体定义事件的依据

自定义微件大多继承自QWidget,而Widget又继承自QObject,这样的继承关系,允许了微件能重写(多态实现)很多事件,下图显示了QWidget和QObject用到的一些protected function

QWidget  保护成员函数

 QObject保护成员函数---可见timerevent计时器事件

  • 我们为父窗体定义事件的依据 (我创建了一个Qmainwindow项目)

  •  自定义一个定时器
由于建了一个MainWindow,所以定时器采用的是startTimer
  • 代码实现-----mainwindow声明计时器描述符(我暂且这么叫)

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QTimerEvent>
#include<QEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void mousePressEvent(QMouseEvent *event);
    void timerEvent(QTimerEvent *event);
private:
    Ui::MainWindow *ui;
    int timerid;
    int timerid1;
};

#endif // MAINWINDOW_H

具体实现:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QString>
#include <QMouseEvent>
#include<QTimerEvent>
#include "mybtn.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this); 
    connect(ui->pushButton,&mybtn::clicked,[=]()
    {
        qDebug()<<"接收到了按下鼠标左键发出的信号";
    });
    //qDebug()<<typeid(ui->pushButton);
    timerid=this->startTimer(1000);
    timerid1=this->startTimer(1000);
}


void MainWindow::mousePressEvent(QMouseEvent *qt)
{
    qDebug()<<"转发到窗口的信号";
}

void MainWindow::timerEvent(QTimerEvent *qtimer)
{

    if(qtimer->timerId()==timerid)//计时器I timerid
    {
        static int countsecond =10;
        QString qs = QString("导弹发射倒计时:%1").arg(--countsecond);
        this->ui->label_2->setText(qs);
        if(countsecond==0)
        {
            this->ui->label_2->setText(QString("导弹发射--Missile Launched!"));
            this->killTimer(timerid);
        }
    }
    else //计时器II  timerid1
    {
        static int contacttimeline =0;
        QString qs2 = QString("皮埃尔将军与飞行员马他尔保持通信的时长:%1").arg(++contacttimeline);
        this->ui->label_3->setText(qs2);
    }
}



MainWindow::~MainWindow()
{
    delete ui;
}

大致运行效果:插图:法国超级军旗舰载战斗机,配备“飞鱼”反舰导弹

  • 事件的接收和忽略 
然而对于事件我们可以加以干预,执行的代码(事件)可以选择忽略ignore()(信号将传至组件所在的父组件,或者接收accept(),信号不再继续往下传)

 代码实例:https://www.cnblogs.com/saintdingspage/p/12271774.html

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