文档章节

Qt学习之路(19): 事件(event)

小代码2016
 小代码2016
发布于 2015/05/27 15:33
字数 1143
阅读 5
收藏 0
前面说了几个标准对话框,下面不打算继续说明一些组件的使用,因为这些使用很难讲完,很多东西都是与实际应用相关的。实际应用的复杂性决定了我们根本不可能把所有组件的所有使用方法都说明白。这次来说说Qt相对高级一点的特性:事件。
 
事件(event)是有系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
 
一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。比如,我们关心的是 QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。这与其他的一些框架不同:在Swing中, 你所要关心的是JButton的ActionListener这个点击事件。
 
Qt的事件很容易和信号槽混淆。这里简单的说明一下,signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处 理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处 理。但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。总的来说,如果我们 使用组件,我们关心的是信号槽;如果我们 自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作。比如,如果我们要自定义一个QPushButton,那么我们就需要重写它的鼠标点击事件和键盘处理事件,并且在恰当的时候发出clicked()信号。
 
还记得我们在main函数里面创建了一个QApplication对象,然后调用了它的exec()函数吗?其实,这个函数就是开始Qt的事件 循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt将创建一个事件对象。Qt的所有事件都继承于 QEvent类。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事 件对象的类型分派给特定的事件处理函数(event handler)。关于这一点,我们会在以后的章节中详细说明。
 
在所有组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、 mousePressEvent()、mouseReleaseEvent()等。这些函数都是protected virtual的,也就是说,我们应该在子类中重定义这些函数。下面来看一个例子。
 
#include <QApplication>
#include <QWidget>
#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 app(argc, argv);
        EventLabel *label = new EventLabel;
        label->setWindowTitle( "MouseEvent Demo");
        label->resize(300, 200);
        label->show();
         return app.exec();
}
 
这里我们继承了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三 个函数。我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。 注意我们在mouseReleaseEvent函数里面有关QString的构造。我们没有使用arg参数的方式,而是使用C语言风格的sprintf来 构造QString对象,如果你对C语法很熟悉(估计很多C+++程序员都会比较熟悉的吧),那么就可以在Qt中试试熟悉的C格式化写法啦!

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/223974

本文转载自:http://devbean.blog.51cto.com/448512/223974

小代码2016
粉丝 45
博文 328
码字总数 153495
作品 0
安阳
程序员
私信 提问
Qt 学习之路 2(52):使用拖放

拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制。操作系统与应用程序之间进行的剪贴...

SuShine
2016/05/12
111
0
QWheelEvent 使用分析一例

缘起 一网友问: 答案其实很简单,QWheelEvent 的 Manual中如此描述(可是,你真的理解这句话了么?): 一点弯路 说实话,这句话一开始我没有理解。相信大家也是一样,特别是,和它紧挨着还有...

晨曦之光
2012/05/08
189
0
Qt Event Dispatcher学习

距离上次整理Qt事件系统已经过了14个月了。重新理理思绪: Qt中的事件大致可分为3类: Spontaneous events 从系统得到的消息:鼠标按键、键盘按键、定时器事件等。转化为QEvent后被Qt事件系统...

晨曦之光
2012/05/08
1K
0
QT4学习笔记 重新实现事件处理函数(Reimplementing Event Handlers)

http://hi.baidu.com/changfa1999/blog/item/a4f75a7ad06fcae82f73b3b4.html 7.1 重新实现事件处理函数(Reimplementing Event Handlers) 在Qt中,一个事件是QEvent的子类的对象。Qt能够处理上......

长平狐
2012/06/12
376
0
Qt事件处理(四)——重写event()函数

目录 前言 根据视频看的事件处理,但是没有顺序,所以有点乱!不过理解起来也不麻烦!学习!分享!感谢! Qt的事件分发过程 在的事件循环中,会不断判断事件的产生,然后把产生的事件分派给对...

simonforfuture
2017/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
5
0
用好项目管理工具,人人都可以成为项目经理

现在市面上的项目管理工具越来越多了,但是大多数都是一些协同工具或轻量项目管理工具。如果是多团队、跨部门使用或者企业级的项目管理,从管理思想到工具运用,需要适应企业的业务流程体系,...

cs平台
昨天
12
0
只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
70
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部