XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


事件

目录

事件

所有的事件都被称为QEvent

鼠标事件

鼠标进入的事件叫QEnterEvent, 只要鼠标进入就有

void myLabel::enterEvent(QEvent *event)
{
    qDebug()<<"小飞棍来喽";
}

void myLabel::leaveEvent(QEvent *event)
{
    qDebug()<<"小飞棍走喽";
}

void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->buttons() & Qt::LeftButton){
    qDebug()<<"小飞棍动喽";
    }
}

void myLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button()==Qt::LeftButton){
    QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());

    qDebug()<<"按下"<<str;
    }
    QString str2 = QString("鼠标按下了 Gx = %1 Gy = %2").arg(ev->globalX()).arg(ev->globalY());
    qDebug()<<"按下"<<str2;

}

void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    qDebug()<<"释放";
}

可以从QMouseEvent获取鼠标的信息

      QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
      qDebug()<<"按下"<<str;

可以使用格式化字符串, 使用x(), y()获取相对于控件的坐标, 使用globelX(), globelY()获取相对于屏幕的坐标

Qt::MouseButton button() const获取按下的按键

使用buttons()获取多个按键的状况, 使用&进行判断, 进行状态的判断, 在移动的时候使用这个进行判断

setMouseTracking(true);

设置鼠标的追踪状态

定时器

事件

//启动定时器, 返回值是定时器的id, 可以定义多个定时器
startTimer(1000);//单位毫秒

void Widget::timerEvent(QTimerEvent *ev)
{
    int id = ev->timerid();//获得id可以进行判断
    int num = 1;
    ui->label_2->setText(QString::number(num++));
}

定时器类

//另一种
QTimer *timer = new QTimer(this);
timer->start(500);
//会产生一个信号
connect(timer, &QTimer::timeout, [=](){
    qDebug() << "jiji";
});

事件分发器

应用在调用处理函数之前会先调用事件分发器, 返回值是一个bool, 是true的时候就代表是用户要处理这个事件, 可以对事件进行一个拦截, 使用函数bool event(QEvent *);

bool myLabel::event(QEvent *e)
{
    if(e->type()==QEvent::MouseButtonPress)
    {
        //鼠标按下进行拦截
        QString str = QString("EVENT鼠标按下了");
        qDebug()<<"按下"<<str;
        //不进行调用
        return true;
    }
    //父类处理函数
    return QLabel::event(e);
}

可以使用强制类型装换装换为鼠标的事件, 然后进行坐标的提取

  QMouseEvent *ev = static_cast<QMouseEvent *>(e);
  QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());

事件过滤器

在事件到事件分发器之前可以使用事件过滤器进行过滤

有两个步骤, 首先给事件安装事件过滤器, 然后重写eventfilter事件

//给label安装事件过滤器
ui->label->installEventFilter(this);


//重写函数
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);
}