事件概述
信号就是事件的一种,事件由用户触发;
鼠标点击窗口,也可以检测到事件;产生事件后,传给事件处理,判断事件类型,后执行事件相应函数;
类似单片机的中断(中断向量);
事件实验
工程准备
创建Qwidget基类工程且带UI
ui添加一个标签,这个标签拉得足够大,因为要显示
添加一个类文件Qwidget基类型的
更换为QLabel的基类
添加虚拟函数,属于保护类型;
输入void mousePressEvent(QMouseEvent *ev);如果参数不显示,删除括号且之后的删除;然后重新打括号
mylable.h
#ifndef MYLABLE_H
#define MYLABLE_H
#include <QWidget>
#include<QLabel>
#include<QMouseEvent>
class MyLable : public QLabel
{
Q_OBJECT
public:
explicit MyLable(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
signals:
public slots:
};
#endif // MYLABLE_H
mylable.c
#include "mylable.h"
#include<QString>
#include<QDebug>
MyLable::MyLable(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);//默认追踪鼠标,一开始不用点击窗口,就在追踪了
}
void MyLable::mousePressEvent(QMouseEvent *ev)
{
int i=ev->x();
int j=ev->y();
if(ev->button()==Qt::LeftButton)//左键
{
qDebug()<<"LeftButton";
}
else if(ev->button()==Qt::RightButton)//右键
{
qDebug()<<"RightButton";
}
else if(ev->button()==Qt::MidButton)//中间按键
{
qDebug()<<"MidButton";
}
//居中加粗指令
QString str=QString("<center><h1>press mouse:(%1 ,%2)</h1></center>").arg(i).arg(j);
this->setText(str);//设置标签内容为str
qDebug()<<str;
}
void MyLable::mouseReleaseEvent(QMouseEvent *ev)
{
}
void MyLable::mouseMoveEvent(QMouseEvent *ev)
{
}
<center> </center> //居中指令 后面加的 /属于闭合标记,相当于括号的最后一半括号
<h1> </h1> //加粗指令 后面加的 /属于闭合标记,相当于括号的最后一半括号
%1 %2 属于参数 1 和参数2; .arg(i) .arg(j) //添加对应变量
类提升
之前的标签基类,就变成了代码标签基类;
这个标签就成为了代码写的那个标标签;就可以显示文字了;
没有这个提升,就意味标签类不同,代码和UI的标签不是一个标签;
按键事件+定时器事件
开始一个定时器,分辨率为1ms 返回一个定时器ID
//停止定时器,只能使用kill
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mylable.h"
#include<QKeyEvent>//按键事件头
#include<QDebug>
#include<QTimerEvent>//定时器事件头
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ID1_time =this->startTimer(1000);//开始一个定时器,分辨率为1ms 返回一个定时器ID
}
Widget::~Widget()
{
delete ui;
}
void Widget::keyPressEvent(QKeyEvent *e)//按键事件处理函数
{
qDebug()<< (char)e->key();//打印按键
if(e->key()==Qt::Key_A)//按键时这个就打印
{
qDebug()<< "Qt::Key_A";
}
}
void Widget::timerEvent(QTimerEvent *t)//定时器事件处理函数
{
if(t->timerId()==ID1_time)//判断当前的ID
{
static int time_counter;
qDebug()<< time_counter++;
if(time_counter==10)
{
this->killTimer(ID1_time);//停止定时器,只能使用kill
}
}
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTimerEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected://虚拟函数,都使用保护
void keyPressEvent(QKeyEvent *e);//虚拟函数,按键事件
void timerEvent(QTimerEvent *t);//虚拟函数,定时器事件
private:
Ui::Widget *ui;
int ID1_time;//定时器ID
};
#endif // WIDGET_H