1.首先介绍一下什么是事件?
事件(event)是由系统或Qt本身在不同时刻发出的,当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件,一些事件在对用户操作做出响应是发出,如键盘事件等,另一些事件则由系统自动发出,如计时器事件。
2.Qt事件处理机制:
3.鼠标点击事件—单击窗口显示坐标及移动鼠标实时显示坐标
1)对函数进行声明
protected: //QMouseEvent 鼠标事件的一些属性,比如点击,释放等 (QKeyEvent 是键盘事件) //鼠标点击事件 void mousePressEvent(QMouseEvent *p); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *p);
注:虚函数的名字、参数、返回值任何一个都不能自己写, 要和基类一样。如果自己写,就属于自己定义函数了,而不是虚函数了。
查看 mousePressEvent()函数的用法必须在基类QWidget才能看到,在派生类中Event 是看不到的。
虚函数不理解的参考:
https://www.cnblogs.com/to-creat/p/5897465.html
https://blog.csdn.net/haoel/article/details/1948051
2)实现
void Event::mousePressEvent(QMouseEvent *p) { int i = p->x(); int j = p->y(); QString cx = QString::number(i); QString cy = QString::number(j); /*if(p->button() == Qt::LeftButton ) { QString a = QString::fromLocal8Bit("x坐标为:"); ui.label->setText(a+cx); } else if(p->button() == Qt::RightButton ) { QString a = QString::fromLocal8Bit("y坐标为:"); ui.label->setText(a+cy); }*/ QString a = QString::fromLocal8Bit("坐标为:"); ui.label->setText(a+cx+","+cy); } void Event::mouseMoveEvent(QMouseEvent *p) { int i = p->x(); int j = p->y(); QString cx = QString::number(i); QString cy = QString::number(j); QString a = QString::fromLocal8Bit("坐标为:"); ui.label->setText(a+cx+","+cy); }
3)设置默认追中鼠标,否则需要单机长按拖动才实时显示坐标
{ ui.setupUi(this); //设定默认追中鼠标 this->setMouseTracking(true); }
注:上边是整个窗口坐标都能显示,若只想在label部件上显示坐标,可以新建一个基类为QWidget的类,将下边三处改为QLabel(因为新建类中基类没有QLabel,需要自己手动改),再将label控件提升为新建的类,将实现函数放到新建的类中即可。
4.定时器事件
1)
protected: void timerEvent(QTimerEvent *); int timeId;//定时器结束id,与定时器开始参数保持一致
2)
可以放在想要计时的程序前面,放 ui.setupUi(this);下面的话,程序开始时就计时
//触发定时器,开始计时 timeId=this->startTimer(1000);//单位是毫秒 1000毫秒=1秒
3)
void Event::timerEvent(QTimerEvent *e) { //静态的:使用完不释放,一直累加 static int i = 0; QString time = QString::number(i++); ui.label1->setText(time); //计时器到4秒停止,因为从0开始 if(i == 5) { this->killTimer(timeId); } }
4)效果