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了.比如我们可以改变它的行为,在鼠标按键按下的时候(mousepressevent)就触发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();
}
}
例子:keyPressEvent
在空白窗体页面,重载当前窗体类的keyPressEvent方法,实现按键事件的响应。
步骤一:
添加头文件<qevent.h>
在form.cpp中填加voidForm1::keyPressEvent(QKeyEvent*k)
并实现根据不同的键值,执行不同的动作。
步骤二:
添加头文件<qevent.h>
在form.h中为窗体类form1添加voidkeyPressEvent(QKeyEvent*k)声明;
步骤三:
重新编译工程并运行测试。
voidForm1::keyPressEvent(QKeyEvent*k)
{
if(k->key()==Key_Left)
{
qDebug("Left\n");
....
}
elseif(k->key()==Key_Right)
{
qDebug("Right\n");
...
}
elseQWidget::keyPressEvent(k);
}
在具备子控件的复杂窗体中,重载当前窗体类的keyPressEvent方法,实现按键事件的响应。
步骤一:
添加头文件<qevent.h>
在form.cpp中填加voidForm1::keyPressEvent(QKeyEvent*k)
并实现根据不同的键值,执行不同的动作。
步骤二:
添加头文件<qevent.h>
在form.h中为窗体类form1添加voidkeyPressEvent(QKeyEvent*k)声明;
步骤三:
在form.cpp中,消除子控件的焦点策略,使能方向及Tab按键功能。
步骤四:
重新编译工程并运行测试。
例如:
pushButton1=newQPushButton(this,"pushButton1");
pushButton1->setGeometry(QRect(200,150,111,41));
pushButton1->setFocusPolicy(QWidget::NoFocus);
voidQWidget::setFocusPolicy(FocusPolicy)
设置这个窗口部件接收键盘焦点的方式。
“focusPolicy”属性保存的是窗口部件接收键盘焦点的策略。
如果窗口部件通过tab来接收键盘焦点,这个策略就是QWidget::TabFocus;
如果窗口部件通过点击来接收键盘焦点,这个策略就是QWidget::ClickFocus;
如果窗口部件上述两种方式都使用,是QWidget::StrongFocus;
如果它不接收焦点(QWidget的默认值),是QWidget::NoFocus。
重载当前窗体类的event方法,实现针对性事件的处理与过滤效果。
步骤一:
在form.cpp中填加boolForm1::event(QEvent*event)
并实现根据不同的键值,执行不同的动作。
步骤二:
在form.h中为窗体类form1添加boolevent(QEvent*event)声明;
步骤三:
重新编译工程并运行测试。
boolForm1::event(QEvent*event)
{
if(event->type()==QEvent::KeyPress)
{
QKeyEvent*keyEvent=(QKeyEvent*)event;
if(keyEvent->key()==Key_A)
{
qDebug("--cuttheKey_A--\n");
returntrue;
}
}
returnQWidget::event(event);
}
实验:
1)用鼠标事件实现鼠标放在按钮上,按钮变大。
2)用按键事件实现方向右和方向左键控制2个窗口
3)用信号与槽机制实现鼠标点击next和back实现控制2个窗口
main.cpp:
form1.cpp
form2.cpp
相关推荐
QT编程----事件(一). 事件的反应 点击按钮弹出事件框
学习轻量级C++的GUI编程 不想多说,想学就下。
Qt编程-QTableView同时冻结行和列 https://lcxing.blog.csdn.net/article/details/133745138 示例代码
Qt编程-QTableView冻结行或冻结列或冻结局部单元格 https://lcxing.blog.csdn.net/article/details/133745084 示例代码
通过学习Qt地址薄例子的编写过程,了解Qt开发的主要步骤和思想,掌握Qt开发的技巧
Qt Quick核心编程-安晓辉著作.pdf Qt Quick核心编程-安晓辉著作.pdf Qt Quick核心编程-安晓辉著作.pdf Qt Quick核心编程-安晓辉著作.pdf Qt Quick核心编程-安晓辉著作.pdf Qt Quick核心编程-安晓辉著作.pdf Qt Quick...
Qt4编程-源代码 Qt4编程-源代码 Qt4编程-源代码 Qt4编程-源代码
《Qt高级编程》,作者: (英)Mark Summerfield ,《qt高级编程》以工程实践为主旨,是对qt现有的700多个类和上百万字参考文档中部分关键技术深入、全面的讲解和探讨,如丰富的网络/桌面应用程序、多线程、富文本处理...
1、qt-everywhere-src-5.12.12的源代码 2、编者编译Qt5.12.12所使用的代码一并上传,方便大家下载编译.
qt-vs-addin-1.2.4-opensourceQt,坦白来说,并不只是一个界面库,他是C++编程思想的集大成者。它是得到完善的C++应用程序框架。使用Qt,在一定程度上你获得的是一个“一站式”、“全方位”的解决方案,STL。string...
《精通Qt4编程(第2版)》详细介绍了qt的基础知识和gui编程应用,举例翔实,内容全面,基本涵盖了qt编程的各个方面。全书共分3篇25章,包括qt gui编程的基础知识(对话框、基础窗口部件、程序主窗口、布局管理)、中级...
优龙QT编程,分基础篇 入门篇 实战篇,让你对QT编程有一个大体的了解,方便快速入门。
嵌入式的学习 linux编程-驱动调用-QT编程.
《PYTHON QT GUI快速编程---PYQT编程指南》,其英文原版书名为:《Rapid GUI Programming with Python and Qt》随书源码。
基本涵盖了Qt编程的各个方面。全书共分3篇21章,包括Qt GUI编程的基础 知识(对话框、基础窗口部件、程序主窗口、布局管理),中级编程(2D绘图 、拖放操作与剪贴板、文件处理、网络编程、多线程、事件机制、数据库 ...
《C++ GUI Qt 4 编程(第二版)》《C++ GUI programming with Qt4》高清-中文版-扫描版-PDF 分辨率在500dpi左右,清晰度,绝对高清有保证! 书签-封面-所有信息齐全。 绝对原版扫描,一页不漏! 由于文件大(清晰度...
本书向读者介绍利用Qt开发图形用户界面的应用程序的入门知识。这里,我们首先介绍了如何搭建Qt的开发环境,之后通过一些简单的示例程序来循序渐进地介绍Qt的“信号和槽”以及布局等基本概念。我们希望以此来...
C++ GUI with Qt4编程 - 完整书签.pdf为学习Qt的经典之作,网上下载的pdf都没有标签或者标签不全。我自己整理了一下,现在为完整标签,包括每个小章节。
python QT GUI快速编程--pyqt编程指南,快速学习pythonGUI开发,图形化编程。
Qt是诺基亚公司的C++可视化...Qt是一个跨平台的C++图形用户界面应用程序框架(C++ GUI),能够为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且可应用于组件编程。