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

  • 相关阅读:
    Leetcode Substring with Concatenation of All Words
    Leetcode Divide Two Integers
    Leetcode Edit Distance
    Leetcode Longest Palindromic Substring
    Leetcode Longest Substring Without Repeating Characters
    Leetcode 4Sum
    Leetcode 3Sum Closest
    Leetcode 3Sum
    Leetcode Candy
    Leetcode jump Game II
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12271016.html
Copyright © 2011-2022 走看看