QT_QApplication类简介.docx

上传人:hw****26 文档编号:3172613 上传时间:2019-05-24 格式:DOCX 页数:4 大小:29.67KB
下载 相关 举报
QT_QApplication类简介.docx_第1页
第1页 / 共4页
QT_QApplication类简介.docx_第2页
第2页 / 共4页
QT_QApplication类简介.docx_第3页
第3页 / 共4页
QT_QApplication类简介.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、 Qt QApplication 类简介一、详细描述QApplication 类管理图形用户界面应用程序 的控制流和主要设置。 可以说 QApplication 是 Qt 的整个后台管理的命脉它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。它也处理绝大多数系统范围和应用程序范围的设置。对于任何一个使用 Qt 的图形用户界面应用程序,都存在一个 QApplication 对象,而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。QApplication 对象是可以通过全局变量 qApp 访问。它的负责的主要范围

2、有:* 它使用用户的桌面设置,例如 palette()、font()和 doubleClickInterval()来初始化应用程序。如果用户改变全局桌面,例如通过一些控制面板,它会对这些属性保持跟踪。* 它执行事件处理,也就是说它从低下的窗口系统接收事件并且把它们分派给相关的窗口部件。通过使用 sendEvent()和 postEvent(),你可以发送你自己的事件到窗口部件。* 它 分析命令行参数并且根据它们设置内部状态。关于这点的详细情况请参考下面的构造函数文档。* 它定义了由 QStyle 对象封装的应用程序的观感。在运行状态下,可以通过 setStyle()来改变。* 它指定了应用程序

3、如何分配颜色。详细情况请参考 setColorSpec()。* 它定义了默认文本编码(请参考 setDefaultCodec())并且提供了通过 translate()用户可见的本地化字符串。* 它提供了一些像 desktop()和 clipboard()这样的魔术般的对象。* 它知道应用程序的窗口。你可以使用 widgetAt()来询问在一个确定点上存在哪个窗口部件,得到一个 topLevelWidgets()(顶级窗口部件)的列表和通过 closeAllWindows()来关闭所有窗口,等等。* 它管理应用程序的鼠标光标处理,请参考 setOverrideCursor()和 setGlob

4、alMouseTracking()。* 在 X 窗口系统上,它提供刷新和同步通讯流的函数,请参考 flushX()和 syncX()。* 它提供复杂的对话管理支持。这使得当用户注销时,它可以让应用程序很好地结束,如果无法终止,撤消关闭进程并且甚至为未来的对话保留整个应用程序的状态。详细情况请参考 isSessionRestored()、sessionId()、commitData()和 saveState()。应用程序排演实例包含了一个 QApplication 通常用法的典型完整的 main()。因为 QApplication 对象做了如此多的初始化,它必须在所有与用户界面相关的其它类被创建

5、之前被创建。因为它也处理命令行参数,在应用程序中对 argv 解释和修改之前创建它通常是一个好主意。(注意,也对于 X11,setMainWidget() 可以根据-geometry 选项来改变主窗口部件。为了保持这个功能,你必须在 setMainWidget()和它的任何重载之前设置你的默认。)二、QApplication 两类构造的讲解QApplication:QApplication ( int #elsebool useGUI = TRUE;#endifQApplication app(argc, argv, useGUI);if ( useGUI ) /开始图形用户界面版本. els

6、e /开始非图形用户界面版本.return app.exec();三、窗口管理在窗口管理方面,对于独立的 1 个进程,qApplication 提供窗口管理的成员函数有(多进程的窗口管理,这里暂不介绍):QDesktopWidget * QApplication:desktop () 静态返回桌面窗口部件(也调用根窗口) 。桌面窗口部件对于获得屏幕大小很有用。在桌面上绘制也是可能的。我们建议不要假设可以在桌面上绘制,因为它不能在所有的操作系统上工作。QDesktopWidget *d = QApplication:desktop();int w = d-width(); / 返回桌面宽度int

7、 h = d-height(); / 返回桌面高度QWidgetList * QApplication:allWidgets () 静态返回应用程序中所有窗口部件的列表。这个列表必须使用 new 来被创建并且必须被调用者删除 。如果没有窗口部件,这个列表为空(QPtrList:isEmpty())。注意一些窗口部件也许被隐藏。更新所有窗口部件的实例:QWidgetList *list = QApplication:allWidgets();QWidgetListIt it( *list ); / 遍历窗口部件QWidget * w;while ( (w=it.current() != 0 )

8、/ 对于每一个窗口部件+it;w-update();delete list; / 删除这个列表,不是这个窗口部件QWidgetList * QApplication:topLevelWidgets () 静态返回应用程序中顶级窗口部件的列表。这个列表是使用 new 创建的并且必须由调用者删除。如果没有顶级窗口部件,这个列表是空的(QPtrList:isEmpty())。注意一些顶级窗口部件也许被隐藏了,例如如果当前没有工具提示被显示的工具提示。实例:/ 显示所有隐藏的顶级窗口部件。QWidgetList *list = QApplication:topLevelWidgets();QWidge

9、tListIt it( *list ); / 遍历窗口部件QWidget * w;while ( (w=it.current() != 0 ) / 对每一个顶级窗口部件+it;if ( !w-isVisible() )w-show();delete list; / 删除这个列表,而不是窗口部件QWidget * QApplication:topLevelAt ( int x, int y ) static返回最上层 x,y 点的 widget, 可以用来定位最上层窗口QWidget * QApplication:widgetAt ( int x, int y ) static返回当前层 x,y

10、 点的 widget, 可以用来定位当前窗口,和 topLevelAt 不同的是 widgetAt 是以 global screen position 来判断的,而topLevelAt 是以显示区域为坐标区域的。void QApplication:closeAllWindows () static slot关闭所有顶级窗口。exitAct = new QAction(tr(“EexitAct-setShortcuts(QKeySequence:Quit);exitAct-setStatusTip(tr(“Exit the application“);connect(exitAct, SIGNA

11、L(triggered(), qApp, SLOT(closeAllWindows();四、关于事件循环qApplication 的事件循环,就是 MainLoop 的事件循环,当然它的原理和 QEventLoop 的原理是一样的。void QCoreApplication:processEvents ( QEventLoop:ProcessEventsFlags flags =QEventLoop:AllEvents ) staticProcesses all pending events for the calling thread according to the specified f

12、lags until there are no more events to process.You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).In event you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not b

13、e processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.Calling this function processes events only for the calling thread.大体意思就是预先调用处于队列状态的事件,直到全部处理完

14、毕。这个函数大多用于系统繁忙时,导致一些事件被延后了(如绘制事件等),用此函数可保证全部事件处理完毕后在继续执行。常见于 show(),update()之后调用。Note: 这个函数线程安全五、事件的发送关于事件的发送有两种方式:1、bool QApplication:sendEvent ( QObject * receiver, QEvent * event ) 静态使用 notify()函数直接发送事件 event 给接受者 receiver。返回由事件处理器返回的值。这个事件在它被发送时,不能被删除。通常的访问方式是在栈中创建这个事件,例如:QMouseEvent me( QEvent:

15、MouseButtonPress, pos, 0, 0 );QApplication:sendEvent( mainWindow, 如果你在堆中创建这个事件,你就必须删除它。void QApplication:postEvent ( QObject * receiver, QEvent * event ) 静态把事件 event 添加为对象 receiver 的接收对象,把它添加到事件队列中并且立即返回。这个时间必须在堆中被分配,因为递送事件队列将会得到事件的所有权并且一旦它被递送就删除它。当控制返回主事件循环,存储在队列中的所有事件将被使用 notify()函数发送。基本上 Qt 大部分的地方都是用到 sendEvent, 而少部分地方会用到 postEvent, 研究线程安全的童鞋可以多看看这方面的资料

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。