我是靠谱客的博主 调皮方盒,最近开发中收集的这篇文章主要介绍Qt学习笔记(QLabel中的鼠标事件,定时器,Event事件,事件过滤器),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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事件,事件过滤器)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部