概述
QLabel中鼠标常用事件
enterEvent 鼠标进入事件
鼠标进入离开事件 是虚函数
可以重写
QLabel Reimplemented Punctions
重新实现的方法
virtul void mouseMoveEvent
自己写一个QLabel
右键 添加新文件 C++ Class
所有控件 QWIdget 下的控件都有鼠标进入鼠标 离开方法
鼠标事件
鼠标进入 enterEvent
鼠标离开 leaveEvent
鼠标的按下,释放,移动
通过ev可以获取到 x,y坐标
判断鼠标左右键
等等吧
QString做格式化字符串 用%1 %2 .arg().arg()
定时器事件
timerEvent
定时器使用
timerEvent事件
启动定时器 startTimer(毫秒) 返回值就是Id号
区分定时器 timerId
定时器的第二种方式(推荐)
QTImer 头文件
创建QTimer *timer...
启动定时器timer->start(毫秒)
发送信号 timeout
暂停定时器 stop
Event
event事件包含了所有事件
做分发事情
event返回值 bool
bool event(QEvent *)
返回值用途 返回值为true 用户自己处理
事件 不往下分发
false 系统处理事件
event事件
主要功能 事件的分发
bool event(QEvent *e)
返回值如果是true 代表用户自己处理
false 系统处理 最好抛给父亲去处理
static_case<转换类型>(原对象)
e->type 具体事件
if (e->type()==QEvent::MouseButtonPress){}
事件过滤器
哪个控件需求过滤事件 就给哪个控件安装过滤器
步骤1 安装过滤器
ui->label->installEventFilter(this);
步骤2
重写事件
#-------------------------------------------------
#
# Project created by QtCreator 2019-08-17T09:23:09
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = 03_02_Event
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++11
SOURCES +=
main.cpp
mylabel.cpp
widget.cpp
HEADERS +=
mylabel.h
widget.h
FORMS +=
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
class MyLabel : public QLabel
{
Q_OBJECT
public:
explicit MyLabel(QWidget *parent = nullptr);
//信号和槽都不需要
//signals:
//public slots:
//捕获事件
//鼠标进入
void enterEvent(QEvent *);
//鼠标离开
void leaveEvent(QEvent *);
//鼠标的按下
void mousePressEvent(QMouseEvent *ev);
//鼠标的释放
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标的移动
void mouseMoveEvent(QMouseEvent *ev);
//事件的分发 Event 可以做拦截
bool event(QEvent *);
};
#endif // MYLABEL_H
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
//定时器事件
void timerEvent(QTimerEvent *);
//定时器标识号
int id1;
int id2;
//事件过滤器的事件
bool eventFilter(QObject *, QEvent *);
};
#endif // WIDGET_H
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
#include <QString>
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
//设置鼠标追踪
this->setMouseTracking(true);
//鼠标进入某个控件 马上打印信息
}
//鼠标进入
void MyLabel::enterEvent(QEvent *){
qDebug()<<"鼠标进入了";
}
//鼠标离开
void MyLabel::leaveEvent(QEvent *){
qDebug()<<"鼠标离开了";
}
//鼠标的移动 是持续的状态,不是瞬间的状态 需要用buttons 左右中三个按键和&操作符进行判断
void MyLabel::mouseMoveEvent(QMouseEvent *ev){
//如果鼠标按下的是左键,打印内容
//注意这里用buttons 和&
//if(ev->buttons()&Qt::LeftButton){
qDebug()<<"按下了左键";
//鼠标按下的位置
QString str = QString("鼠标移动了 坐标:x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
// }
}
//鼠标的按下
void MyLabel::mousePressEvent(QMouseEvent *ev){
//如果鼠标按下的是左键,打印内容
if(ev->button()==Qt::LeftButton){
//找到按下的位置
QString str = QString("鼠标按下了 坐标:x=%1 y=%2").arg(ev->x()).arg(ev->y());
//%1 代表第一个参数,%2 代表第二个参数,如果还有更多的参数,则一直下去
qDebug()<<str;
}
}
//按下和释放是瞬间的操作
//移动是持续的操作
//鼠标的释放
void MyLabel::mouseReleaseEvent(QMouseEvent *ev){
QString str = QString("鼠标释放了 坐标:x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
//重写
bool MyLabel::event(QEvent *e){
//通常不要做拦截
//event只要分发事件就可以了
//对事件做处理 在子函数里就可以了。。。。。
if (e->type()==QEvent::MouseButtonPress)
{
//做父与子之间类型转换
QMouseEvent *ev=static_cast<QMouseEvent *>(e);
//做了一个拦截
QString str=QString("EVENT 鼠标按下了 坐标:x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
//只有鼠标按下自己处理
return true;
}
//其他事件让父亲做默认处理
return QLabel::event(e);
}
#include "widget.h"
#include "ui_widget.h"
#include <QString>
#include <QTimer> //定时器第二种方式
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
id1=startTimer(1000);//每1000毫秒调用一次timerEvent事件
id2=startTimer(2000);
//定时器第二种方法 头文件QTimer
QTimer *timer1=new QTimer(this);
//启动定时器对象
timer1->start(500);//毫秒做单位
//每隔0.5秒发送一个信号
connect(timer1,&QTimer::timeout,this,[=](){//timeout到点了
static int num=0;//防止被释放掉
ui->label_4->setText(QString().number(num++));
});
//有多个定时器 第一种方法太麻烦了
//推荐使用第二种
//点击按钮, 暂停定时器
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
timer1->stop();//停止定时器
});
//给ui->label做事件过滤器 拦截
//步骤1: 给控件安装过滤器
//参数 this意义: 通过父窗口给label安装过滤器
ui->label->installEventFilter(this);
//步骤2:重写 eventFilter 事件
}
//定时器事件
//void Widget::timerEvent(QTimerEvent *){//做判断时从这里做
// timerId 每次启动新的定时器都有一个唯一的标识号
void Widget::timerEvent(QTimerEvent *e){//做判断时从这里做
if(e->timerId()==id1)
{
static int num=0;//防止被释放掉
ui->label_2->setText(QString().number(num++));
}
if(e->timerId()==id2)
{
static int num2=0;//防止被释放掉
ui->label_3->setText(QString().number(num2++));
}
}
bool Widget::eventFilter(QObject *obj, QEvent *e){//最上层的拦截 其他拦截失效
//可能给很多人做过滤器拦截
if(obj==ui->label){
if (e->type()==QEvent::MouseButtonPress)
{
//做父与子之间类型转换
QMouseEvent *ev=static_cast<QMouseEvent *>(e);
//做了一个拦截
QString str=QString("事件过滤器 鼠标按下了 坐标:x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
//只有鼠标按下自己处理
return true;
}
}
//其他让父类处理
return QWidget::eventFilter(obj,e);
}
Widget::~Widget()
{
delete ui;
}
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<widget class="MyLabel" name="label">
<property name="geometry">
<rect>
<x>0</x>
<y>10</y>
<width>221</width>
<height>91</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>250</x>
<y>20</y>
<width>91</width>
<height>71</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::WinPanel</enum>
</property>
<property name="text">
<string>计时器</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>250</x>
<y>100</y>
<width>54</width>
<height>12</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>30</x>
<y>150</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::WinPanel</enum>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>210</x>
<y>160</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>暂停</string>
</property>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>MyLabel</class>
<extends>QLabel</extends>
<header location="global">mylabel.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
最后
以上就是调皮方盒为你收集整理的Qt学习笔记(QLabel中的鼠标事件,定时器,Event事件,事件过滤器)的全部内容,希望文章能够帮你解决Qt学习笔记(QLabel中的鼠标事件,定时器,Event事件,事件过滤器)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复