Qt、C++学习交流群招管理员咯 群号:302558294 http://blog.csdn.net/rl529014/article/details/53439586
理论准备:
1、事件是由窗口系统或者Qt自身产生的,用以响应所发生的各类事情。
2、Qt事件的产生可能是因为键盘或鼠标被按下,也有可能是窗口在显示时,产生的绘制事件。
3、大多数事件都是为用户的操作而产生的响应。其中比较特殊的定时器事件,则是由系统独立产生的。
4、在Qt中,事件就是QEvent子类的一个实例,QEvent是所有事件类的基类。我们可以通过QEvent的type()函数返回事件的类型。
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));
}
}