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是所有事件类的基类。我们可以通过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_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
- Qt的事件处理和定时器解析(实例解析)
- Qt的事件处理和定时器解析
- Qt中事件处理的方法和实例
- C#中委托和事件的区别实例解析
- QT 事件处理 KeyPressEvent 和 定时器时间 Timer
- Qt学习: QTimerEvent定时器事件的处理程序代码示例
- dictionary实例的解析和强制解析
- Qt中的json解析和处理 (使用的是qt5 版本)
- 基于事件驱动的解析接口 SAX (实例一)
- 基于事件驱动的解析接口 SAX (实例二)
- 基于事件驱动的解析接口 SAX (实例三)
- Qt事件处理(五)——定时器
- qt 处理文字解析异常(本地)
- java日历处理的实例解析
- QT 事件机制 源码解析
- QT中的event事件解析
- QT中鼠标事件解析
- QT定时器使用的实例
- 指针的基础知识补充
- Go语言学习(九)文件操作
- TCP/IP详解卷1笔记_第一章 概述
- 路上的程序员
- svn常见问题汇总
- Qt的事件处理和定时器解析(实例解析)
- Toolbar包含EditText时,点击键盘弹出时Toolbar被拉伸
- UVALive 7511 Multiplication Table
- Java Variable
- 最小生成树概念及性质
- 安卓基础
- java九九乘法表
- 【POJ 3630 Phone List】+ 字典树
- 什么是野指针如何避免野指针