(18):事件
  AnyLlCIhvKpr 2023年11月12日 14 0

事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

事件也就是我们通常说的“事件驱动(event drive)”程序设计的基础概念。事件的出现,使得程序代码不会按照原始的线性顺序执行。我们的程序的执行顺序不再是线性的,而是由一个个事件驱动着程序继续执行。没有事件,程序将阻塞在那里,不执行任何代码。

在 Qt 中,事件的概念似乎同信号槽类似。但是,Qt 中的事件和信号槽却并不是可以相互替代的。信号由具体的对象发出,然后会马上交给由​​connect()​​函数连接的槽进行处理;而对于事件,Qt 使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。前一个事件完成后,取出后面的事件进行处理。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个能够响应鼠标事件的​​EventLabel​​​,我们就需要重写​​QLabel​​​的鼠标事件,做出我们希望的操作,有可能还得在恰当的时候发出一个类似按钮的​​clicked()​​​信号(如果我们希望让这个​​EventLabel​​能够被其它组件使用)或者其它的信号。

在前面我们也曾经简单提到,Qt 程序需要在​​main()​​​函数创建一个​​QCoreApplication​​​对象,然后调用它的​​exec()​​​函数。这个函数就是开始 Qt 的事件循环。在执行​​exec()​​函数之后,程序将进入事件循环来监听应用程序的事件。 

 

 鼠标事件

#include "mainwindow.h"
#include <QApplication>
#include<QLabel>
#include<QMouseEvent>

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->setMouseTracking(true);
label->resize(300, 200);
label->show();

return a.exec();
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   49   0   0 事件javascript
  TEZNKK3IfmPf   2023年11月13日   20   0   0 事件jQuery
  TEZNKK3IfmPf   2023年11月14日   18   0   0 事件jQueryjavascript
  AnyLlCIhvKpr   2023年11月12日   15   0   0 事件
  TEZNKK3IfmPf   2023年11月12日   54   0   0 事件javascript
  TEZNKK3IfmPf   2023年11月15日   20   0   0 事件WPF
  TEZNKK3IfmPf   2023年11月12日   19   0   0 react事件
  AnyLlCIhvKpr   2023年11月12日   18   0   0 事件
  TEZNKK3IfmPf   2023年11月13日   32   0   0 监听器事件java
  TEZNKK3IfmPf   2023年11月12日   53   0   0 html事件js
AnyLlCIhvKpr