Qt的事件处理和定时器解析(实例解析)

Qt、C++学习交流群招管理员咯  群号:302558294   http://blog.csdn.net/rl529014/article/details/53439586

理论准备:

1、事件是由窗口系统或者Qt自身产生的,用以响应所发生的各类事情。

2、Qt事件的产生可能是因为键盘或鼠标被按下,也有可能是窗口在显示时,产生的绘制事件。

3、大多数事件都是为用户的操作而产生的响应。其中比较特殊的定时器事件,则是由系统独立产生的。

4、在Qt中,事件就是QEvent子类的一个实例,QEvent是所有事件类的基类。我们可以通过QEventtype()函数返回事件的类型。


bool MainWindow::event(QEvent *event)
{
    qDebug()<<event->type();
    return true;
}

当鼠标移动,或者按下键盘是,打印出当前的事件类型。

程序运行效果:



实例:

下面仔细讲一讲Qt中如何重新实现事件处理器,以及怎么样使用单个定时器和多个定时器。


程序运行效果:



定时器事件:

定时器1: 通过信号与槽绑定,使用timeout()信号才出发槽。

定时器2和定时器3: 通过startTimer()开启,并记录器ID,在虚函数timerEvent(QTimerEvent *event)中判断定时器定时是否已经到了。

鼠标按键:

  • 按下组合键Ctrl + F1,定时器1清零,重新开始计数;
  • 按下Ctrl + F2,定时器2清零,重新开始计数;
  • 按下Ctrl + F3,定时器3清零,重新开始计数;

源码解析:

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    return a.exec();
}

定义一个MainWindow对象,并且使用show()方法显示出来。


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimerEvent>
#include <QKeyEvent>
#include "ui_mainwindow.h"

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow  ,Ui_MainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void timerEvent(QTimerEvent *event);
  // bool event(QEvent *event);

private slots:
    void onTimerOut();
    void keyPressEvent(QKeyEvent *event);

private:
    QTimer *m_Timer1;

    int m_Timer1ID;
    int m_Timer2ID;
    int m_Timer3ID;

    int m_Timer1Count;
    int m_Timer2Count;
    int m_Timer3Count;
};

#endif // MAINWINDOW_H

重新实现虚函数

    void timerEvent(QTimerEvent *event);
    void keyPressEvent(QKeyEvent *event);

timerEvent()用于定时器事件,keyPressEvent()用于键盘按键事件。

*m_Timer1是一个QTimer类型的对象。


mainwindow.cpp

#include <QTimer>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    setupUi(this);

    lineEdit1->setEnabled(false);
    lineEdit2->setEnabled(false);
    lineEdit3->setEnabled(false);

    m_Timer1Count = 0;
    m_Timer2Count = 0;
    m_Timer3Count = 0;

    m_Timer2ID = startTimer(2000);
    m_Timer3ID = startTimer(3000);

    m_Timer1 = new QTimer(this);
    connect(m_Timer1,SIGNAL(timeout()),this,SLOT(onTimerOut()));  //绑定定时器的信号与槽
    m_Timer1->start(1000);
}

MainWindow::~MainWindow()
{

}

void MainWindow::timerEvent(QTimerEvent *event)
{
    //判断定时器的时间是否到了
    if(event->timerId() == m_Timer2ID)
    {
        ++m_Timer2Count;
        lineEdit2->setText(QString::number(m_Timer2Count));
    }

    if(event->timerId() == m_Timer3ID)
    {
        ++m_Timer3Count;
        lineEdit3->setText(QString::number(m_Timer3Count));
    }
}

//bool MainWindow::event(QEvent *event)
//{
//    qDebug()<<event->type();
//    return true;
//}

void MainWindow::onTimerOut()
{
    ++m_Timer1Count;
    lineEdit1->setText(QString::number(m_Timer1Count));
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    //判断按键值
    switch (event->key())
    {
    case Qt::Key_F1:
        if(event->modifiers() & Qt::ControlModifier)
        {
            m_Timer1Count = 0;
        }
        break;

    case Qt::Key_F2:
        if(event->modifiers() & Qt::ControlModifier)
        {
            m_Timer2Count = 0;
        }
        break;

    case Qt::Key_F3:
        if(event->modifiers() & Qt::ControlModifier)
        {
            m_Timer3Count = 0;
        }
        break;
    default:
        qDebug()<<event->key();
        break;
    }
}

    m_Timer2ID = startTimer(2000);
    m_Timer3ID = startTimer(3000);

开启两个定时器,定时时间分别为2秒和3秒,并且记录下定时器唯一的ID号。


m_Timer1 = new QTimer(this);
connect(m_Timer1,SIGNAL(timeout()),this,SLOT(onTimerOut()));  //绑定定时器的信号与槽
m_Timer1->start(1000);

实例化定时器,绑定信号与槽,定时时间为1秒。


void MainWindow::timerEvent(QTimerEvent *event)
{
    //判断定时器的时间是否到了
    if(event->timerId() == m_Timer2ID)
    {
        ++m_Timer2Count;
        lineEdit2->setText(QString::number(m_Timer2Count));
    }


    if(event->timerId() == m_Timer3ID)
    {
        ++m_Timer3Count;
        lineEdit3->setText(QString::number(m_Timer3Count));
    }
}


源码下载:http://download.csdn.net/detail/rl529014/9700434

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值