QT事件

11 篇文章 0 订阅

一、鼠标事件

 

1.声明事件,然后再cpp文件中去实现

    //鼠标点击事件

    void mousePressEvent(QMouseEvent *ev) override;

    //鼠标释放事件

    void mouseReleaseEvent(QMouseEvent *ev) override;

    //鼠标移动事件

    void mouseMoveEvent(QMouseEvent *ev) override;

    //进入窗口事件

    void enterEvent(QEvent *);

    //离开窗口事件

    void leaveEvent(QEvent *);

 

2.以鼠标点击事件为例

void MyLabel::mouseReleaseEvent(QMouseEvent *ev)

{

    int x = ev->x();

    int y = ev->y();

    if(ev->button() == Qt::LeftButton)

    {

        qDebug()<<"left is clicked";

    }

    else if(ev->button() == Qt::RightButton)

    {

        qDebug()<<"right is clicked";

    }

    else if(ev->button() == Qt::MidButton)

    {

        qDebug()<<"mid is clicked";

    }

    QString text = QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(x).arg(y);

    this->setText(text);

}

 ev->x();ev->y();就是在获取坐标的x,y轴的值,然后显示在自定义的Label上。

通过ev->button(),可以获知是点击的左键还是右键还是其他的。

 

二、键盘事件

1.声明事件

void keyPressEvent(QKeyEvent *event);

 

2.实现事件

void Widget::keyPressEvent(QKeyEvent *event)

{

    qDebug()<<event->text();

    qDebug()<<event->key();

}

text打印出来可以看到点击的是哪个字符,key打印的是int值,可以与QT提供的键值表对比,得知按下哪个键。

 

三、定时器事件

1.声明事件

void timerEvent(QTimerEvent *event);

 

2.实现事件

void Widget::timerEvent(QTimerEvent *event)

{

    qDebug()<<"开始计时";

    static int sec = 0;

    sec++;

    qDebug()<<sec;

    if(sec==15)

    {

        this->killTimer(this->TimerId);

    }

}

 

定时器事件需要开启,以毫秒为单位

TimerId=this->startTimer(1000);

 

关闭时,需要使用ID关闭定时器。

 

如果启动多个定时器事件,可以使用event->timerId()来进行比较,从而知道是哪个定时器事件。

 

四、事件的接受和忽略

1.自定义一个Button控件继承于QPushButton

实现鼠标按下的事件

void MyButton::mousePressEvent(QMouseEvent *ev)

{

    if(ev->button() == Qt::LeftButton)

    {

        qDebug()<<"left is pressed";

    }

    QPushButton::mousePressEvent(ev);

}

 

在窗体的cpp文件中连接clicked信号

    connect(ui->pushButton,&MyButton::clicked,

           [=]()

            {

               qDebug()<<"is clicked";

            }

 

 

            );

 

QPushButton::mousePressEvent(ev);的作用就是继续把信号传递给父类,让其他的事件能够接收。

如果不加这句,就不会输出is clicked这句话,因为事件没有继续传递下去。

 

2.accept函数和ignore函数

调用accept函数就是接受事件,使得事件不再继续传递。

ignore函数就是忽略事件,将事件传递给父组件,与上面不同的是,这里传递的是父组件而不是父类,也就是说如果上一级组件是Widget,则事件会传递给Widget。

 

五、event函数

bool Widget::event(QEvent *event)

{

    switch(event->type())

    {

        case QEvent::KeyPress:

            keyPressEvent( static_cast<QKeyEvent*>(event));

            return QWidget::event(event);

        default:

            return QWidget::event(event);

    }

}

用来管理事件,事件首先会传递给event,有event()来管理,如果在event中不下发事件,其他的事件就不会执行。

return QWidget::event(event);是为了处理事件后,让事件继续传递。

 

六、事件过滤器

bool Widget::eventFilter(QObject *obj,QEvent *event)

{

    if(obj==ui->label)

    {

        if(event->type()==QEvent::MouseMove)

        {

            qDebug()<<"new Mouse";

        }

        return true;   //返回true,不让事件继续传播

    }

    else

    {

        return QWidget::event(event);   //返回给基类,让事件继续传播

    }

}

 

注意:需要给控件安装事件过滤器,可以在窗口的构造函数中进行安装

ui->label->installEventFilter(this);

 

 

注意:在设置鼠标移动时,可以用下面的方法,直接得到鼠标的舰艇事件,不需要再点击一下才得到鼠标的监听

ui->label->setMouseTracking(true);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt事件循环是一个非常重要的机制,它负责接收和分发事件,保证 Qt 应用程序的正常运行。下面是简单的 Qt 事件循环源码分析: 1. Qt事件循环是通过 `QCoreApplication::exec()` 方法启动的。该方法首先会创建一个 `QEventLoop` 对象,然后进入一个无限循环。 2. 在事件循环中,`QEventLoop` 对象通过调用 `QCoreApplication::processEvents()` 方法来处理当前队列中的事件。该方法会检查是否有待处理的事件,如果没有,则线程会进入休眠状态,等待新的事件到来。 3. 当一个事件到来时,Qt 会根据事件的类型和目标对象,将事件分发给正确的接收者进行处理。接收者可以是窗口部件、控件、布局等。 4. 对于每个事件Qt 会调用接收者的对应方法来处理。例如,对于鼠标点击事件Qt 会调用接收者的 `mousePressEvent()` 方法来处理。 5. 在事件处理过程中,如果需要进行其他操作(如更新界面、执行定时器等),Qt 会将这些操作添加到事件队列中。 6. 当所有待处理的事件都被处理完毕后,Qt 会通过调用 `QCoreApplication::quit()` 方法退出事件循环,程序结束运行。 需要注意的是,Qt事件循环并不是单线程的。在多线程环境下,每个线程都可以有自己的事件循环,但每个线程只能有一个事件循环。当一个事件需要跨线程传递时,Qt 会通过事件队列和线程间的信号槽机制来实现。 以上是简单的 Qt 事件循环源码分析,如果您对具体的源码细节有更深入的需求,建议参考 Qt 的官方文档和源代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值