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

来源:互联网 发布:ai文件打开软件 编辑:程序博客网 时间:2024/05/16 01:16

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_OBJECTpublic:    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

3 1
原创粉丝点击