(12)事件和信号的区别

答案都在注释中:

#include <QApplication>
#include <QLabel>
#include <QMouseEvent>

//一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,
//因为在Qt中,需要我们关心的事件总会发出一个信号。
//比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。

//信号与事件的区别
//Qt的事件很容易和信号槽混淆。这里简单的说明一下,signal由具体对象发出,
//然后会马上交给由connect函数连接的slot进行处理;而对于事件,
//Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,
//前一个事件完成后,取出后面的事件进行处理。
//但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。
//并且,事件还可以使用“事件过滤器”进行过滤。
//总的来说,如果我们使用组件,我们关心的是信号槽;
//如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。
//比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。


//在所有组件的父类QWidget中,定义了很多事件处理函数,
//如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。
//这些函数都是protected virtual的,也就是说,我们应该在子类中重定义这些函数。下面来看一个例子。
class EventLabel : public QLabel
{

protected:
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
};

void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}

void EventLabel::mousePressEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}

void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
        QString msg;
        msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                                event->x(), event->y());
        this->setText(msg);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    EventLabel *label = new EventLabel;
    label->setWindowTitle("MouseEvent Demo");
    label->resize(300, 200);
    label->show();

    return a.exec();
}

//这里我们继承了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数。
//我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值