您的位置:首页 > 编程语言 > Qt开发

QT事件(1)

2015-08-10 16:25 453 查看
QT事件的产生可分为两种,一种是系统自身产生的,比如定时器,另一种是用户操作产生的,比如鼠标,键盘事件。QT是用一个事件队列来维护事件,这些事件都是不可预知的,比如我们并不知道用户何时按下鼠标,所以当有事件产生时,新产生的事件就会添加到队列后面,等待着被处理。当然也可以通过一些方法直接处理。

因为我在公司做的项目不算难,基本不用去关心事件是如何发生,如何处理的,更多的是在关心信号和槽函数的连接,信号何时发出去。但我觉得想学好QT,就需要去学习QT事件。所以这里做个学习的笔记。

一开始我也对事件和信号与槽这两者混淆,网上很多人是这样子区分两者的不同的:一般来说,使用 Qt 组件时,我们并不会把主要精力放在事件上。因为在 Qt 中,我们关心的更多的是事件关联的一个信号。比如,对于
QPushButton
的鼠标点击,我们不需要关心这个鼠标点击事件,而是关心它的
clicked()
信号的发出。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个能够响应鼠标事件的
EventLabel
,我们就需要重写
QLabel
的鼠标事件,做出我们希望的操作。

看完上面的区分或许还是有些模糊,但我们在对程序理解模糊时,应该通过自己动手写代码,看效果,这样会有更深的理解,因为同一个意思,每个人表达出来的或许不一样。

话不多说了,看下面部分代码:

#ifndef CUSTOMLABEL_H
#define CUSTOMLABEL_H

#include <QLabel>

class CustomLabel : public QLabel
{
    Q_OBJECT
public:
    explicit CustomLabel(QWidget *parent = 0);
protected:
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

signals:

public slots:

};

#endif // CUSTOMLABEL_H


#include "customlabel.h"

CustomLabel::CustomLabel(QWidget *parent) :
    QLabel(parent)
{
}
void CustomLabel::mousePressEvent(QMouseEvent *ev){
    this->setText("press");
}

void CustomLabel::mouseReleaseEvent(QMouseEvent *ev){
    this->setText("release");
}


以上CustomLabel类是我自己定义的一个类,继承QLabel,重写了mousePressEvent(QMouseEvent *ev)和mouseReleaseEvent(QMouseEvent *ev)方法。当运行程序把鼠标在CustomLabel按下时,CustomLabel会显示press,释放鼠标时会显示release。这说明了我们改写鼠标按下和释放的事件,达到我们想要的效果,如果我们不重写的话,按下鼠标和释放鼠标,CustomLabel并不会有反应。

有更好理解的欢迎一起交流,互相学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: