没有合适的资源?快使用搜索试试~ 我知道了~
QT编程----事件(一). 事件的反应 点击按钮弹出事件框
资源推荐
资源详情
资源评论
review
.ui生成.h.cpp 文件
uicform1.ui-oform1.h
uicform1.ui-iform1.h-oform1.cpp
C++三个特点:继承重载封装
QT 程序设计进阶-事件
Qt 事件
Qt 程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发.
Qt 事件的类型很多,常见的 qt 的事件如下:
键盘事件:按键按下和松开.
鼠标事件:鼠标移动,鼠标按键的按下和松开.
拖放事件:用鼠标进行拖放.
滚轮事件:鼠标滚轮滚动.
绘屏事件:重绘屏幕的某些部分.
定时事件:定时器到时.
焦点事件:键盘焦点移动.
进入和离开事件:鼠标移入 widget 之内,或是移出.
移动事件:widget 的位置改变.
大小改变事件:widget 的大小改变.
显示和隐藏事件:widget 显示和隐藏.
窗口事件:窗口是否为当前窗口.
还有一些非常见的 qt 事件,比如 socket 事件,剪贴板事件,字体改变,布局改变等等.
Qt的事件和 Qt 中的 signal 不一样.后者通常用来使用 widget,而前者用来实现widget.
比如一个按钮,我们使用这个按钮的时候,我们只关心他 clicked()的 signal,至于这个按钮如
何接收处理鼠标事件,再发射这个信号,我们是不用关心的.但是如果我们要重载一个按钮的
时候,我们就要面对 event 了.比如我们可以改变它的行为,在鼠标按键按下的时候(mousepres
sevent)就触发 clicked()的 signal 而不是通常在释放的(mousereleaseevent)时候.
事件起源:
基于事件如何被产生与分发,可以把事件分为三类:
1)Spontaneous事件
2)Posted事件
3)Sent事件
1)Spontaneous事件,由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。
本类事件通常是 windowsystem 把从系统得到的消息,比如鼠标按键,键盘按键等,放入系统
的消息队列中.Qt 事件循环的时候读取这些事件,转化为 QEvent,再依次处理.
2)Posted事件,由 Qt 或是应用程序产生,它们被 Qt 组成队列,再通过事件循环处理。
调用 QApplication::postEvent()来产生一个 posted 类型事件.
例如:QWidget::update()函数
当需要重新绘制屏幕时,程序调用 update()函数
其实现的原理是 new 出一个 paintEvent,调用QApplication::postEvent(),将其放入 Qt 的消息队
列中,等待依次被处理.
3)Sent事件由 Qt 或是应用程序产生,但它们被直接发送到目标对象。
调用 QApplication::sendEvent()函数来产生一个 sent 类型事件.
sent类型事件不会放入队列,而是直接被派发和处理,QWidget::repaint()函数用的就是这种
方式.
当我们在 main()函数的末尾调用 QApplication::exec()时,程序进入了 Qt 的事件循环
事件循环如下面所示:
while(!exit_was_called)
{
while(!posted_event_queue_is_empty)
{
process_next_posted_event();
}
while(!spontaneous_event_queue_is_empty)
{
process_next_spontaneous_event();
}
while(!posted_event_queue_is_empty)
{
process_next_posted_event();
}
}
事件循环的处理流程:
1)先处理 Qt 事件队列中的 posted 事件,直至为空
2)再处理系统消息队列中的 spontaneous 消息,直至为空
3)在处理系统消息的时候会产生新的 Qtposted 事件,需要对其再次进行处理
不通过事件循环
sendEvent 的事件派发不通过事件循环。QApplication::sendEvent()是通过调用
QApplication::notify(),直接进入了事件的派发和处理环节。
Notify
调用 QApplication::sendEvent 的时候,消息会立即被处理,是同步的.实际上
QApplication::sendEvent()是通过调用 QApplication::notify(),直接进入了事件的派发和处理
环节.所有的事件都最终通过notify派发到相应的对象中。
boolQApplication::notify(QObject*receiver,QEvent*event)
它是通过调用 receiver->event(event)来实现的。
目标接受对象的 event 方法会自动接受 notify 传来的 event 事件
event()会返回一个布尔值,来告诉调用者是否事件被 accept 或 ignore,
(true 表示 accept),从 event()返回的布尔值却是用来与 QApplication:notify()通讯的
event()函数的处理如下所示:
boolQWidget::event(QEvent*event)
{
switch(e->type()){
caseQEvent::KeyPress:
keyPressEvent((QKeyEvent*)event);
if(!((QKeyEvent*)event)->isAccepted())
returnfalse;
break;
caseQEvent::KeyRelease:
keyReleaseEvent((QKeyEvent*)event);
if(!((QKeyEvent*)event)->isAccepted())
returnfalse;
break;
...
}
returntrue;
}
Close 事件有点不同,调用 QCloseEvent:ignore()取消了关闭操作,而 accept()告诉 Qt 继续
执行正常的关闭操作。为了避免混乱,最好是在 closeEvent()的新实现中明确地进行
accept()与 ignore()的调用:、
voidMainWindow::closeEvent(QCloseEvent*event)
{
if(userReallyWantsToQuit()){
event->accept();
}else{
event->ignore();
剩余17页未读,继续阅读
资源评论
花名-思雪
- 粉丝: 2
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功