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(),信号不再继续往下传)