zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hadoop day 5
    SSM前言——相关设计模式
    多线程技术点二
    其他对象
    集合拾遗
    入职技术准备
    File类相关操作
    IO流技术
    多线程技术点
    第二章
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12271016.html
Copyright © 2011-2022 走看看