前面说了几个标准对话框,下面不打算继续说明一些组件的使用,因为这些使用很难讲完,很多东西都是与实际应用相关的。实际应用的复杂性决定了我们根本不可能把所有组件的所有使用方法都说明白。这次来说说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
分享到:
相关推荐
### Qt 学习之路2 知识点梳理 #### 1. 序言 - **背景**: 本文档是基于作者之前的一个系列教程——《Qt学习之路》的更新版本,旨在适应Qt的新版本和发展趋势。 - **目的**: 更新和完善原有教程内容,使其更适合Qt 4....
19. 事件的接受与忽略 20. event() 21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏...
基于最新的Qt5.0.1的学习书籍,非常适合QT5的入门学习。 目录 1. 序 2. Qt 前言 3. Hello, world! 4. 信号槽 5. 自定义信号槽 6. Qt 模块简介 7. MainWindow 简介 8. 添加动作 9. 资源文件 10. 对象模型 11. 布局...
5 Qt消息机制和事件 50 5.1 事件 50 5.2 event() 52 5.3 事件过滤器 55 5.4 总结 59 5.5 不规则窗体 62 6 绘图和绘图设备 63 6.1 QPainter 63 6.2 绘图设备 65 6.2.1 QPixmap、QBitmap、QImage 66 6.2.2 QPicture ...
事件处理器(event handler)定义了对特定事件的响应方式。 7. **QT网络编程**:QT提供了丰富的网络编程接口,如QTcpSocket、QUdpSocket、QSslSocket等,可以方便地实现TCP、UDP和SSL/TLS协议的网络通信。 8. **QT...
在Qt编程领域,掌握一些实用的技巧能够极大地提高开发效率和代码质量。Qt是一个功能强大的C++库,广泛应用于桌面应用、嵌入式系统以及移动平台。以下是我整理的一些Qt编程...希望这些技巧能对你的Qt学习之路有所帮助。
例如,`QWidget`是所有GUI对象的基类,`QLayout`用于管理窗口中的控件布局,而事件处理则通过重载`event()`函数实现。 2. **信号与槽**: 这是QT的核心特性之一,用于组件间的通信。信号在特定条件满足时发出,而槽...
A Brief History of Qt Part I: Basic Qt Chapter 1. Getting Started Hello Qt Making Connections Laying Out Widgets Using the Reference Documentation Chapter 2. Creating Dialogs Subclassing ...
Part I: Basic Qt 1. Getting Started. 2. Creating Dialogs. 3. Creating Main Windows. 4. Implementing Application Functionality. 5. Creating Custom Widgets. Part II: Intermediate Qt 6. Layout ...
Event Processing chap07/ticker 8. 2D Graphics chap08/cityscape chap08/diagram chap08/oventimer 9. Drag and Drop chap09/projectchooser 10. Item View Classes chap10/booleanparser chap10/cities...
Rapid GUI programming with Python and Qt 1 Contents 8 Foreword 14 Introduction 16 Part I: Python Programming 22 Chapter 1. Data Types and Data Structures 24 Executing Python Code 25 Variables ...
ui->lcdNumber->setNumDigits(19); ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat); ui->lcdNumber->display(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); } ``` **知识点四:利用...
#### 实例19:利用QPalette改变控件颜色 `QPalette`类用于控制控件的颜色方案。 **代码示例:** ```python from PyQt4.QtGui import * app = QApplication(sys.argv) button = QPushButton('Change Color') ...
为了使用户能够拖拽起始坐标点更新线路,可以监听地图的`click`事件,获取点击位置,并调用`getWalkingRoute`函数更新路线。同时,需要创建可拖动的标记来表示起点和终点: ```javascript var startMarker = L....
### Android系统添加全局快捷键的方法 #### 一、Android中键盘驱动及按键映射机制 ...此外,随着Android系统的发展,相关的API和技术也在不断进步,因此持续学习最新的技术文档和实践案例也是非常必要的。
Current version allows preview, print and design report template under Windows and Linux platform (qt). + Added Embarcadero RAD Studio XE3 support - fixed compatibility with Fast Report FMX installed...
│ │ │ EventViewer.py │ │ │ Impersonate.py │ │ │ setup.py │ │ │ UsePrintfThroughCtypes.py │ │ │ │ │ ├─第13章 多线程与多进程编程 │ │ │ │ 第13章 多线程与多进程编程.ppt │ │ │ │...
1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) ...2.1.5. 定义访问控制 ...