QCoreApplication 类

QCoreApplication 类为没有 UI 的 Qt 应用程序提供事件循环。 更多...

头: #include <QCoreApplication>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承: QObject
继承者:

QAndroidService and QGuiApplication

特性

公共函数

QCoreApplication (int & argc , char ** argv )
virtual ~QCoreApplication ()
(从 6.5 起) Qt::PermissionStatus checkPermission (const QPermission & permission )
void installNativeEventFilter (QAbstractNativeEventFilter * filterObj )
virtual bool notify (QObject * receiver , QEvent * event )
void removeNativeEventFilter (QAbstractNativeEventFilter * filterObject )
(从 6.5 起) void requestPermission (const QPermission & permission , Functor && functor )
(从 6.5 起) void requestPermission (const QPermission & permission , const QObject * context , Functor functor )

公共槽

void exit (int returnCode = 0)
void quit ()

信号

void aboutToQuit ()
void applicationNameChanged ()
void applicationVersionChanged ()
void organizationDomainChanged ()
void organizationNameChanged ()

静态公共成员

void addLibraryPath (const QString & path )
QString applicationDirPath ()
QString applicationFilePath ()
QString applicationName ()
qint64 applicationPid ()
QString applicationVersion ()
QStringList arguments ()
bool closingDown ()
QAbstractEventDispatcher * eventDispatcher ()
int exec ()
bool installTranslator (QTranslator * translationFile )
QCoreApplication * 实例 ()
bool isQuitLockEnabled ()
bool isSetuidAllowed ()
QStringList libraryPaths ()
QString organizationDomain ()
QString organizationName ()
void postEvent (QObject * receiver , QEvent * event , int priority = Qt::NormalEventPriority)
void processEvents (QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)
void processEvents (QEventLoop::ProcessEventsFlags flags , int ms )
(从 6.7 起) void processEvents (QEventLoop::ProcessEventsFlags flags , QDeadlineTimer deadline )
void removeLibraryPath (const QString & path )
void removePostedEvents (QObject * receiver , int eventType = 0)
bool removeTranslator (QTranslator * translationFile )
bool sendEvent (QObject * receiver , QEvent * event )
void sendPostedEvents (QObject * receiver = nullptr, int event_type = 0)
void setApplicationName (const QString & application )
void setApplicationVersion (const QString & version )
void setAttribute (Qt::ApplicationAttribute 属性 , bool on = true)
void setEventDispatcher (QAbstractEventDispatcher * eventDispatcher )
void setLibraryPaths (const QStringList & paths )
void setOrganizationDomain (const QString & orgDomain )
void setOrganizationName (const QString & orgName )
void setQuitLockEnabled (bool enabled )
void setSetuidAllowed (bool allow )
bool startingUp ()
bool testAttribute (Qt::ApplicationAttribute 属性 )
QString translate (const char * context , const char * sourceText , const char * disambiguation = nullptr, int n = -1)

重实现保护函数

virtual bool event (QEvent * e ) override
void qAddPostRoutine (QtCleanUpFunction ptr )
void qRemovePostRoutine (QtCleanUpFunction ptr )

Q_COREAPP_STARTUP_FUNCTION (QtStartUpFunction ptr )
Q_DECLARE_TR_FUNCTIONS ( context )

详细描述

非 GUI 应用程序使用此类来提供事件循环。对于使用 Qt 的非 GUI 应用程序,应准确存在一个 QCoreApplication 对象。对于 GUI 应用程序,见 QGuiApplication 。对于使用 Qt Widgets 模块的应用程序,见 QApplication .

QCoreApplication 包含主事件循环,会处理和分派来自操作系统 (如:计时器和网络事件) 和其它源的所有事件。它还处理应用程序的初始化和定稿,及系统范围和应用程序范围的设置。

事件循环和事件处理

开始事件循环通过调用 exec ()。长时间运行的操作可以调用 processEvents () 以保持应用程序的响应速度。

一般而言,推荐创建 QCoreApplication, QGuiApplication QApplication 对象在 main() 函数要尽可能早。 exec () 不会返回直到事件循环退出;如:当 quit () 被调用。

还提供了几个静态方便函数。QCoreApplication 对象可获取自 实例 ()。可以发送事件采用 sendEvent () 或张贴到事件队列采用 postEvent ()。待决事件可以移除采用 removePostedEvents () 或分派采用 sendPostedEvents ().

类提供 quit () 槽和 aboutToQuit () 信号。

应用程序和库路径

应用程序有 applicationDirPath () 和 applicationFilePath ()。库路径 (见 QLibrary ) 可以被检索采用 libraryPaths () 和操纵通过 setLibraryPaths (), addLibraryPath (),和 removeLibraryPath ().

国际化和翻译

添加 (或移除) 翻译文件可以使用 installTranslator () 和 removeTranslator ()。可以翻译应用程序字符串使用 translate ()。 QObject::tr () 函数的实现是根据 translate ().

访问命令行自变量

命令行自变量被传递给 QCoreApplication 构造函数的访问应该是使用 arguments () 函数。

注意: QCoreApplication 移除选项 -qmljsdebugger="..." 。它剖析自变量为 qmljsdebugger ,然后删除此选项及其自变量。

对于更高级命令行选项处理,创建 QCommandLineParser .

区域设置

在 Unix/Linux,Qt 默认配置为使用系统区域设置。这会导致冲突当使用 POSIX 函数时,例如,当在数据类型 (譬如:浮点数和字符串) 之间转换时,由于表示法可能因区域设置不同而异。要解决此问题,调用 POSIX 函数 setlocale(LC_NUMERIC,"C") 恰好先于初始化 QApplication , QGuiApplication 或 QCoreApplication 以将用于数字格式化的区域设置重置为 C 区域设置。

另请参阅 QGuiApplication , QAbstractEventDispatcher , QEventLoop , 使用信号量的生产者和消费者 ,和 使用等待条件的生产者和消费者 .

特性文档编制

applicationName : QString

此特性保持该应用程序的名称

The application name is used in various Qt classes and modules, most prominently in QSettings when it is constructed using the default constructor. Other uses are in formatted logging output (see qSetMessagePattern ()), in output by QCommandLineParser , in QTemporaryDir and QTemporaryFile default paths, and in some file locations of QStandardPaths . Qt D-Bus , 可访问性 , and the XCB platform integration make use of the application name, too.

If not set, the application name defaults to the executable name.

访问函数:

QString applicationName ()
void setApplicationName (const QString & application )

通知程序信号:

void applicationNameChanged ()

另请参阅 organizationName , organizationDomain , applicationVersion ,和 applicationFilePath ().

applicationVersion : QString

此特性保持该应用程序的版本

若未设置,应用程序版本默认为由主应用程序可执行文件或包确定的特定平台值 (从 Qt 5.9 起):

平台
Windows (经典桌面) VERSIONINFO 资源的 PRODUCTVERSION 参数
macOS, iOS, tvOS, watchOS 信息特性列表的 CFBundleVersion 属性
Android AndroidManifest.xml 清单元素的 android:versionName 特性

在其它平台,默认为空字符串。

访问函数:

QString applicationVersion ()
void setApplicationVersion (const QString & version )

通知程序信号:

void applicationVersionChanged ()

另请参阅 applicationName , organizationName ,和 organizationDomain .

organizationDomain : QString

此特性保持编写此应用程序的 Internet 组织域

值用于 QSettings class when it is constructed using the default constructor. This saves having to repeat this information each time a QSettings 对象被创建。

在 Mac, QSettings 使用 organizationDomain() 作为组织若它不是空字符串;否则它使用 organizationName ()。在所有其它平台, QSettings 使用 organizationName () 作为组织。

访问函数:

QString organizationDomain ()
void setOrganizationDomain (const QString & orgDomain )

通知程序信号:

void organizationDomainChanged ()

另请参阅 organizationName , applicationName ,和 applicationVersion .

organizationName : QString

此特性保持编写此应用程序的组织名称

值用于 QSettings class when it is constructed using the default constructor. This saves having to repeat this information each time a QSettings 对象被创建。

在 Mac, QSettings 使用 organizationDomain () 作为组织若它不是空字符串;否则它使用 organizationName()。在所有其它平台, QSettings 使用 organizationName() 作为组织。

访问函数:

QString organizationName ()
void setOrganizationName (const QString & orgName )

通知程序信号:

void organizationNameChanged ()

另请参阅 organizationDomain and applicationName .

quitLockEnabled : bool

此特性保持是否使用 QEventLoopLocker 特征,可能导致应用程序离开。

When this property is true the release of the last remaining QEventLoopLocker operating on the application will attempt to quit the application.

Note that attempting a quit may not necessarily result in the application quitting, for example if there still are open windows, or the QEvent::Quit 事件被忽略。

默认为 true .

访问函数:

bool isQuitLockEnabled ()
void setQuitLockEnabled (bool enabled )

另请参阅 QEventLoopLocker .

成员函数文档编制

QCoreApplication:: QCoreApplication ( int & argc , char ** argv )

构造 Qt 核心应用程序。核心应用程序是没有 GUI (图形用户界面) 的应用程序。这种应用程序用于控制台或用作服务器进程。

The argc and argv 自变量由应用程序处理,并以更方便形式使之可用通过 arguments () 函数。

警告: 数据引用通过 argc and argv 必须保持有效对于整个生命周期 QCoreApplication 对象。此外, argc 必须大于 0 且 argv 必须包含至少一条有效字符串。

[virtual noexcept] QCoreApplication:: ~QCoreApplication ()

销毁 QCoreApplication 对象。

[private signal] void QCoreApplication:: aboutToQuit ()

此信号被发射当应用程序即将离开主事件循环 (如:当事件循环级别降至 0 时)。这可能发生之前有调用 quit () 从应用程序内或当用户关闭整个桌面会话时。

信号特别有用,若应用程序必须在最后一秒做一些清理。注意,在此状态下不可能进行用户交互。

注意: At this point the main event loop is still running, but will not process further events on return except QEvent::DeferredDelete events for objects deleted via deleteLater (). If event processing is needed, use a nested event loop or call QCoreApplication::processEvents () manually.

注意: 这是私有信号。它可以用于信号连接,但不能由用户发射。

另请参阅 quit ().

[static] void QCoreApplication:: addLibraryPath (const QString & path )

前置 path 到库路径列表的开头,确保库被首先搜索。若 path 为空或已在路径列表中,路径列表不改变。

默认路径列表由 1 个或 2 个条目组成。第 1 个是插件安装目录,为 INSTALL/plugins ,其中 INSTALL 是 Qt 安装目录。第 2 个是应用程序自己的目录 ( not 当前目录),但仅后于 QCoreApplication 对象被实例化。

将库路径重置成默认,当实例化 QCoreApplication 被销毁。

另请参阅 removeLibraryPath (), libraryPaths (),和 setLibraryPaths ().

[static] QString QCoreApplication:: applicationDirPath ()

返回包含应用程序可执行文件的目录。

例如,若有安装 Qt 在 C:\Qt 目录,和运行 regexp 范例,此函数将返回 C:/Qt/examples/tools/regexp。

在 macOS 和 iOS,这指向实际包含可执行文件的目录,可能位于应用程序捆绑中 (若应用程序有捆绑)。

警告: 在 Linux,此函数将试着获取路径从 /proc 文件系统。若失败,假定 argv[0] 包含可执行文件的绝对文件名。函数还假定当前目录未被应用程序所改变。

另请参阅 applicationFilePath ().

[static] QString QCoreApplication:: applicationFilePath ()

返回应用程序可执行文件的文件路径。

例如,若有安装 Qt 在 /usr/local/qt 目录,和运行 regexp 范例,此函数将返回 /usr/local/qt/examples/tools/regexp/regexp。

警告: 在 Linux,此函数将试着获取路径从 /proc 文件系统。若失败,假定 argv[0] 包含可执行文件的绝对文件名。函数还假定当前目录未被应用程序所改变。

另请参阅 applicationDirPath ().

[static] qint64 QCoreApplication:: applicationPid ()

返回应用程序的当前进程 ID。

[static] QStringList QCoreApplication:: arguments ()

返回命令行自变量列表。

通常 arguments().at(0) 是程序名,arguments().at(1) 是第一自变量,和 arguments().last() 是最后一个自变量。见下文有关 Windows 的注意事项。

调用此函数很慢 - 应将结果存储在变量中,当剖析命令行时。

警告: 在 Unix,此列表构建自传递给 main() 函数构造函数的 argc 和 argv 参数。argv 中字符串数据的解释是使用 QString::fromLocal8Bit ();因此,例如,在按 Latin1 区域设置运行的系统中,传递日语命令行自变量是不可能的。大多数现代 Unix 系统没有此局限性,因为它们基于 Unicode。

在 Windows,列表仅构建自 argc 和 argv 参数,若修改后的 argv/argc 参数被传递给构造函数。在此情况下,可能出现编码问题。

否则,arguments() 构造自返回值对于 GetCommandLine() 。因此,由 arguments().at(0) 给出的字符串可能不是 Windows 程序名,从属应用程序如何启动。

另请参阅 applicationFilePath () 和 QCommandLineParser .

[since 6.5] Qt::PermissionStatus QCoreApplication:: checkPermission (const QPermission & permission )

校验状态为给定 permission

若结果为 Qt::PermissionStatus::Undetermined 那么应请求权限凭借 requestPermission () 以确定用户的意图。

该函数在 Qt 6.5 引入。

另请参阅 requestPermission () 和 应用程序权限 .

[static] bool QCoreApplication:: closingDown ()

返回 true 若应用程序对象正在被销毁;否则返回 false .

另请参阅 startingUp ().

[override virtual protected] bool QCoreApplication:: event ( QEvent * e )

重实现: QObject::event (QEvent *e).

[static] QAbstractEventDispatcher *QCoreApplication:: eventDispatcher ()

返回指向主线程事件分派程序对象的指针。若不存在事件分派程序对于线程,此函数返回 nullptr .

另请参阅 setEventDispatcher ().

[static] int QCoreApplication:: exec ()

进入主事件循环并等待,直到 exit () 被调用。返回值被传递给 exit () (为 0 若 exit () 被调用凭借 quit ()).

有必要调用此函数以启动事件处理。主事件循环从窗口系统接收事件,并将其分派给应用程序 Widget。

要使应用程序履行空闲处理 (通过执行特殊函数,当没有待决事件时),使用 QTimer 采用 0 超时。更高级空闲处理方案可以达成使用 processEvents ().

推荐把清理代码连接到 aboutToQuit () 信号,而不是将它放入应用程序的 main() 函数,因为在某些平台,exec() 调用可能不返回。例如在 Windows,当用户注销时,系统在 Qt 关闭所有顶层窗口后终止过程。因此,不保证应用程序会有时间退出其事件循环并执行代码结束 main() 函数在 exec() 调用之后。

另请参阅 quit (), exit (), processEvents (),和 QApplication::exec ().

[static slot] void QCoreApplication:: exit ( int returnCode = 0)

告诉应用程序采用返回代码去退出。

在调用此函数后,应用程序离开主事件循环并返回从调用的 exec ()。 exec () 函数返回 returnCode 。若事件循环未运行,此函数什么都不做。

按约定, returnCode 0 意味着成功,而任何非零值指示出错。

始终将信号连接到此槽是很好的实践,使用 QueuedConnection 。若在控制进入主事件循环之前发射连接 (非队列) 到此槽的信号 (譬如先于 int main 调用 exec ()),槽不起作用且应用程序从不退出。使用队列连接确保不会被援引,直到控制进入主事件循环之后。

注意:不像同名 C 库函数,此函数 does 会返回给调用者 – 停止的是事件处理。

另请注意,此函数不是线程安全的。只应从主线程调用它 (是 QCoreApplication 对象用于处理事件的线程)。要求应用程序从另一线程退出,要么使用 QCoreApplication::quit () 或采用 QMetaMethod::invokeMethod() 从主线程调用此函数代替。

另请参阅 quit () 和 exec ().

void QCoreApplication:: installNativeEventFilter ( QAbstractNativeEventFilter * filterObj )

安装事件过滤器 filterObj 为所有本机接收事件,通过主线程中的应用程序。

事件过滤器 filterObj 接收事件凭借其 nativeEventFilter () 函数,在主线程中收到的所有本机事件都会调用它。

The QAbstractNativeEventFilter::nativeEventFilter () 函数应返回 true 若应过滤掉事件 (即:停止)。它应返回 false 以允许正常 Qt 处理继续进行:然后可以将本机事件转换成 QEvent 并处理通过标准 Qt event 过滤,如 QObject::installEventFilter ().

若安装了多个事件过滤器,则首先激活最后安装的过滤器。

注意: 这里设置的过滤器函数接收本机消息,即:MSG 或 XCB 事件结构。

注意: 本机事件过滤器将被应用程序所禁用当 Qt::AA_PluginApplication 属性有设置。

为获得最大可移植性,应始终试着使用 QEvent and QObject::installEventFilter () 每当可能时。

另请参阅 QObject::installEventFilter ().

[static] bool QCoreApplication:: installTranslator ( QTranslator * translationFile )

添加翻译文件 translationFile 到用于翻译的翻译文件列表。

可以安装多个翻译文件。按照安装它们时的反向次序搜索翻译,因此,首先搜索最近安装的翻译文件,最后搜索首先安装的翻译文件。一旦发现包含匹配字符串的翻译,就停止搜索。

安装或移除 QTranslator ,或改变安装的 QTranslator 生成 LanguageChange 事件为 QCoreApplication 实例。 QApplication 实例将事件传播给所有顶层 Widget,重实现 changeEvent 可以重新翻译用户界面通过传递用户可见字符串凭借 tr () 函数到各自的特性 setter。由 Qt Designer 生成的用户界面类提供 retranslateUi() 函数可以被调用。

函数返回 true 当成功时和 false 当失败时。

注意: QCoreApplication does not 拥有所有权对于 translationFile .

另请参阅 removeTranslator (), translate (), QTranslator::load (),和 为动态语言改变做准备 .

[static noexcept] QCoreApplication *QCoreApplication:: 实例 ()

返回指针指向应用程序的 QCoreApplication (或 QGuiApplication / QApplication ) 实例。

若没有分配实例, nullptr 被返回。

[static] bool QCoreApplication:: isSetuidAllowed ()

返回 true 若允许应用程序在 UNIX 平台运行 setuid。

另请参阅 QCoreApplication::setSetuidAllowed ().

[static] QStringList QCoreApplication:: libraryPaths ()

返回将搜索的应用程序路径列表当动态加载库时。

此函数的返回值可能改变当 QCoreApplication 被创建。不推荐调用它先于创建 QCoreApplication 。应用程序可执行文件目录 ( not 工作目录) 是列表的一部分若已知。为使它知道 QCoreApplication 已构造,所以它将使用 argv[0] 来查找它。

Qt 提供默认库路径,但也可以设置它们使用 qt.conf 文件。在此文件中指定的路径将覆盖默认值。注意,若 qt.conf 文件在应用程序可执行文件目录下,可能找不到它直到 QCoreApplication 被创建。若当调用该函数时找不到它,将使用默认库路径。

列表将包括插件安装目录,若存在 (插件的默认安装目录为 INSTALL/plugins ,其中 INSTALL 是 Qt 安装目录)。冒号分隔的条目对于 QT_PLUGIN_PATH 环境变量总是被添加。插件安装目录 (且其存在) 可能改变,当应用程序可执行文件目录变为已知时。

另请参阅 setLibraryPaths (), addLibraryPath (), removeLibraryPath (), QLibrary ,和 如何创建 Qt 插件 .

[虚拟] bool QCoreApplication:: notify ( QObject * receiver , QEvent * event )

发送 event to receiver : receiver ->event( event )。返回来自接收者的事件处理程序返回的值。注意:此函数被调用,对于被发送给任何线程中的任何对象的所有事件而言。

对于某些类型的事件 (如鼠标事件和按键事件),事件会被传播给接收者的父级,依此类推直至顶层对象,若接收者对事件不感兴趣 (即:它返回 false ).

有 5 种不同办法可以处理事件。重实现此虚函数只是其中之一。以下列出所有 5 种途径:

  1. 重实现 paintEvent (), mousePressEvent () 等。这是最常见、最简单且最不强大的方式。
  2. 重实现此函数。这非常强大,提供完全控制;但每次只可以激活一个子类。
  3. 安装事件过滤器在 QCoreApplication::instance ()。这种事件过滤器能够处理所有 Widget 的所有事件,因此它就像重实现 notify() 般强大;此外,拥有多个应用程序全局事件过滤器也是可能的。全局事件过滤器甚至可以看到鼠标事件对于 被禁用 Widget 。注意,仅存活在主线程中的对象才能调用应用程序事件过滤器。
  4. 重实现 QObject::event () (作为 QWidget 做的)。若这样做以获得 Tab 键按下,和在任何特定 Widget 事件过滤器之前看到事件。
  5. 在对象上安装事件过滤器。这种事件过滤器获取所有事件,包括 Tab 和 Shift+Tab 键按下事件,只要它们不改变聚焦 Widget。

未来方向: This function will not be called for objects that live outside the main thread in Qt 7. Applications that need that functionality should find other solutions for their event inspection needs in the meantime. The change may be extended to the main thread, causing this function to be deprecated.

警告: 若覆写此函数,必须确保处理事件的所有线程停止这样做,在开始销毁应用程序对象之前。这包括可能正使用的由其它库启动的线程,但不适用于 Qt 自己的线程。

另请参阅 QObject::event () 和 installNativeEventFilter ().

[static] void QCoreApplication:: postEvent ( QObject * receiver , QEvent * event , int priority = Qt::NormalEventPriority)

添加事件 event ,采用对象 receiver 作为事件接收者,到事件队列并立即返回。

必须在堆上分配事件,因为 Post 事件队列将拥有事件的所有权,且事件一旦已被张贴就会被删除。它是 not safe 去访问事件,在它被张贴之后。

当控制返回到主事件循环时,存储在队列中的所有事件将被发送使用 notify () 函数。

事件按降序排序 priority 次序,即,事件具有高 priority 队列前于事件具有较低 priority priority 可以是任何整数值,即,在 INT_MAX 和 INT_MIN (包括在内) 之间;见 Qt::EventPriority 了解更多细节。事件具有相等 priority 将按张贴次序处理。

注意: 此函数是 thread-safe .

另请参阅 sendEvent (), notify (), sendPostedEvents (),和 Qt::EventPriority .

[static] void QCoreApplication:: processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)

处理调用线程的一些待决事件根据指定 flags .

使用此函数不鼓励。取而代之,首选把长操作从 GUI 线程移入辅助线程,并完全避免处理嵌套事件循环。若事件处理真的有必要,考虑使用 QEventLoop 代替。

在正在运行连续调用此函数的本地循环事件中,若没有事件循环, DeferredDelete 事件不会被处理。这会影响 Widget 的行为,如 QToolTip 依赖 DeferredDelete 事件才能正确运行。替代是调用 sendPostedEvents () 从本地循环内。

调用此函数仅处理调用线程的事件,并在处理所有可用事件后返回。可用事件是在函数调用之前的队列事件。这意味着当函数运行时张贴的事件将被队列,直到稍后一轮的事件处理为止。

注意: 此函数是 thread-safe .

另请参阅 exec (), QTimer , QEventLoop::processEvents (),和 sendPostedEvents ().

[static] void QCoreApplication:: processEvents ( QEventLoop::ProcessEventsFlags flags , int ms )

这是重载函数。

处理调用线程待决事件以 ms 毫秒为单位或直到没有更多要处理事件为止,以较短者为准。

This is equivalent to calling:

QCoreApplication::processEvents(flags, QDeadlineTimer(ms));
					

[static, since 6.7] void QCoreApplication:: processEvents ( QEventLoop::ProcessEventsFlags flags , QDeadlineTimer deadline )

这是重载函数。

Processes pending events for the calling thread untile deadline has expired, or until there are no more events to process, whichever happens first.

使用此函数不鼓励。取而代之,首选把长操作从 GUI 线程移入辅助线程,并完全避免处理嵌套事件循环。若事件处理真的有必要,考虑使用 QEventLoop 代替。

调用此函数仅处理调用线程的事件。

注意: 不像 processEvents () 重载,此函数还处理张贴事件当函数运行时。

注意: 在超时之前队列的所有事件都将被处理,不管需要多久。

注意: 此函数是 thread-safe .

该函数在 Qt 6.7 引入。

另请参阅 exec (), QTimer ,和 QEventLoop::processEvents ().

[static slot] void QCoreApplication:: quit ()

要求应用程序离开。

请求可能被忽略,若应用程序阻止离开 (例如:若无法关闭其某个窗口)。应用程序可以影响这通过处理 QEvent::Quit 事件在应用程序级别,或 QEvent::Close 事件对于各个窗口。

若离开不被中断,应用程序将按返回代码 0 (成功) 退出。

要退出应用程序不给中断机会,调用 exit () 直接。注意,该方法不是线程安全的。

始终将信号连接到此槽是很好的实践,使用 QueuedConnection 。若在控制进入主事件循环之前发射连接 (非队列) 到此槽的信号 (譬如先于 int main 调用 exec ()),槽不起作用且应用程序从不退出。使用队列连接确保不会被援引,直到控制进入主事件循环之后。

范例:

QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
					

线程安全注意事项 :可以从任何线程调用此函数,以线程安全方式导致目前运行的主应用程序循环的退出。不管怎样,线程安全得不到保证若 QCoreApplication 对象被同时销毁。

注意: 此函数是 thread-safe .

另请参阅 exit () 和 aboutToQuit ().

[static] void QCoreApplication:: removeLibraryPath (const QString & path )

移除 path 从库路径列表。若 path 为空或不在路径列表中,列表不改变。

将库路径重置成默认,当实例化 QCoreApplication 被销毁。

另请参阅 addLibraryPath (), libraryPaths (),和 setLibraryPaths ().

void QCoreApplication:: removeNativeEventFilter ( QAbstractNativeEventFilter * filterObject )

移除事件 filterObject 从此对象。忽略请求,若尚未安装这种事件过滤器。

将自动移除此对象的所有事件过滤器,当此对象被销毁时。

它始终安全地移除事件过滤器,即使在事件过滤器激活期间 (即:从 nativeEventFilter() 函数)。

另请参阅 installNativeEventFilter ().

[static] void QCoreApplication:: removePostedEvents ( QObject * receiver , int eventType = 0)

移除所有事件为给定 eventType 的张贴是使用 postEvent () 对于 receiver .

事件 not 被分派,取而代之,从队列移除它们。应该从不需要调用此函数。若调用它,注意杀除事件可能导致 receiver 破坏一个或多个不变体。

receiver is nullptr ,事件的 eventType 被移除从所有对象。若 eventType 为 0,移除所有事件从 receiver 。 从不应调用此函数采用 eventType of 0.

注意: 此函数是 thread-safe .

[static] bool QCoreApplication:: removeTranslator ( QTranslator * translationFile )

移除翻译文件 translationFile 从此应用程序使用的翻译文件列表 (它不会从文件系统中删除翻译文件)。

函数返回 true 当成功时和 false 当失败时。

另请参阅 installTranslator (), translate (),和 QObject::tr ().

[since 6.5] template <typename Functor> void QCoreApplication:: requestPermission (const QPermission & permission , Functor && functor )

请求给定 permission .

当请求就绪时, functor 将被调用如 functor(const QPermission &permission) ,采用 permission 描述请求的结果。

The functor 可以是独立式 (或静态) 成员函数:

qApp->requestPermission(QCameraPermission{}, &permissionUpdated);
					

or a lambda:

qApp->requestPermission(QCameraPermission{}, [](const QPermission &permission) {
});
					

若用户明确授予应用程序请求 permission ,或 permission 知道给定平台不要求用户授权,状态将是 Qt::PermissionStatus::Granted .

若用户明确拒绝应用程序请求 permission ,或 permission 知道不可访问 (或不可应用于) 给定平台应用程序,状态将是 Qt::PermissionStatus::Denied .

请求结果从不会是 Qt::PermissionStatus::Undetermined .

注意: 只可以从主线程请求权限。

该函数在 Qt 6.5 引入。

另请参阅 checkPermission () 和 应用程序权限 .

[since 6.5] template <typename Functor> void QCoreApplication:: requestPermission (const QPermission & permission , const QObject * context , Functor functor )

请求给定 permission ,在上下文 context .

当请求就绪时, functor 将被调用如 functor(const QPermission &permission) ,采用 permission 描述请求的结果。

The functor 可以是独立式 (或静态) 成员函数:

qApp->requestPermission(QCameraPermission{}, context, &permissionUpdated);
					

Lambda:

qApp->requestPermission(QCameraPermission{}, context, [](const QPermission &permission) {
});
					

或槽在 context 对象:

qApp->requestPermission(QCameraPermission{}, this, &CamerWidget::permissionUpdated);
					

The functor 会被调用当线程源于 context 对象。若 context 被销毁在请求完成之前, functor 不会被调用。

若用户明确授予应用程序请求 permission ,或 permission 知道给定平台不要求用户授权,状态将是 Qt::PermissionStatus::Granted .

若用户明确拒绝应用程序请求 permission ,或 permission 知道不可访问 (或不可应用于) 给定平台应用程序,状态将是 Qt::PermissionStatus::Denied .

请求结果从不会是 Qt::PermissionStatus::Undetermined .

注意: 只可以从主线程请求权限。

这是重载函数。

该函数在 Qt 6.5 引入。

另请参阅 checkPermission () 和 应用程序权限 .

[static] bool QCoreApplication:: sendEvent ( QObject * receiver , QEvent * event )

发送事件 event 直接到接收者 receiver ,使用 notify () 函数。返回从事件处理程序返回的值。

事件 not 被删除,当事件被发送后。正常途径是在堆栈上创建事件,例如:

QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);
					

另请参阅 postEvent () 和 notify ().

[static] void QCoreApplication:: sendPostedEvents ( QObject * receiver = nullptr, int event_type = 0)

立即分派之前队列的所有事件采用 QCoreApplication::postEvent () 和为对象 receiver 和事件类型 event_type .

来自窗口系统的事件 not 通过此函数分派,而是通过 processEvents ().

receiver is nullptr ,事件的 event_type 为所有对象发送。若 event_type 为 0,所有事件被发送为 receiver .

注意: 此方法必须被调用从线程以其 QObject 参数, receiver ,存活。

另请参阅 postEvent ().

[static] void QCoreApplication:: setAttribute ( Qt::ApplicationAttribute 属性 , bool on = true)

设置属性 属性 if on 为 true;否则清零属性。

注意: 某些应用程序属性必须被设置 before 创建 QCoreApplication 实例。参考 Qt::ApplicationAttribute 文档编制,了解更多信息。

另请参阅 testAttribute ().

[static] void QCoreApplication:: setEventDispatcher ( QAbstractEventDispatcher * eventDispatcher )

将主线程事件分派程序设为 eventDispatcher 。这才有可能,只要尚未安装事件分派程序。也就是,先于 QCoreApplication 被实例化。此方法拥有对象的所有权。

另请参阅 eventDispatcher ().

[static] void QCoreApplication:: setLibraryPaths (const QStringList & paths )

设置要搜索的目录列表,当加载插件采用 QLibrary to paths 。所有现有路径被删除且路径列表将由给定路径组成按 paths 和应用程序的路径。

将库路径重置成默认,当实例化 QCoreApplication 被销毁。

另请参阅 libraryPaths (), addLibraryPath (), removeLibraryPath (),和 QLibrary .

[static] void QCoreApplication:: setSetuidAllowed ( bool allow )

允许应用程序在 UNIX 平台运行 setuid 若 allow 为 true。

allow 为 false (默认) 且 Qt 检测到应用程序正采用不同于真实用户 ID 的有效用户 ID 在运行,应用程序将被中止当 QCoreApplication 实例被创建。

Qt 不是 setuid 程序的合适解决方案,由于它的攻击面很大。不管怎样,由于历史原因,某些应用程序可能要求以这种方式运行。此标志将阻止 Qt 中止应用程序当检测到这时,且必须有设置先于 QCoreApplication 实例被创建。

注意: It is strongly recommended not to enable this option since it introduces security risks. If this application does enable the flag and starts child processes, it should drop the privileges as early as possible by calling setuid(2) for itself, or at the latest by using the QProcess::UnixProcessParameters::ResetIds flag.

另请参阅 isSetuidAllowed ().

[static] bool QCoreApplication:: startingUp ()

返回 true 若尚未创建应用程序对象;否则返回 false .

另请参阅 closingDown ().

[static] bool QCoreApplication:: testAttribute ( Qt::ApplicationAttribute 属性 )

返回 true 若属性 属性 已设置;否则返回 false .

另请参阅 setAttribute ().

[static] QString QCoreApplication:: translate (const char * context , const char * sourceText , const char * disambiguation = nullptr, int n = -1)

返回翻译文本为 sourceText ,通过查询已安装的翻译文件。搜索翻译文件是从最近安装的文件开始到第一安装文件。

QObject::tr () 更方便提供此功能。

context 通常是类名 (如 MyDialog) 和 sourceText 是英文文本或简短标识文本。

disambiguation 是标识字符串,当相同 sourceText 被用于同一上下文中的不同角色。默认情况下,它是 nullptr .

QTranslator and QObject::tr () 文档编制,了解有关上下文、消除歧义和注释的更多信息。

n 用于结合 %n 以支持复数形式。见 QObject::tr () 了解细节。

若没有翻译文件包含要翻译的 sourceText in context ,此函数返回 QString 相当于 sourceText .

此函数不是虚拟的。可以使用替代翻译技术通过子类化 QTranslator .

注意: 此函数是 thread-safe .

另请参阅 QObject::tr (), installTranslator (), removeTranslator (),和 国际化和翻译 .

相关非成员

void qAddPostRoutine ( QtCleanUpFunction ptr )

添加的全局例程将调用自 QCoreApplication 析构函数。此函数通常用于为程序范围功能添加清理例程。

清理例程按添加它们的反向次序被调用。

函数的指定通过 ptr 不应接受自变量且不应返回任何东西。例如:

static int *global_ptr = nullptr;
static void cleanup_ptr()
{
    delete [] global_ptr;
    global_ptr = nullptr;
}
void init_ptr()
{
    global_ptr = new int[100];      // allocate data
    qAddPostRoutine(cleanup_ptr);   // delete later
}
					

注意,对于应用程序 (或模块) 范围的清理,qAddPostRoutine() 常常不合适。例如,若程序被拆分成动态加载的模块,则相关模块可能早被卸载先于 QCoreApplication 析构函数的调用。在这种情况下,若仍期望使用 qAddPostRoutine(), qRemovePostRoutine () 可以用于阻止例程被调用通过 QCoreApplication 析构函数。例如,若调用该例程,在卸载模块之前。

对于模块和库,使用引用计数的初始化管理器或 Qt 的父级/子级删除机制可能更好。这里是使用父级/子级机制在正确时间调用清理函数的私有类范例:

class MyPrivateInitStuff : public QObject
{
public:
    static MyPrivateInitStuff *initStuff(QObject *parent)
    {
        if (!p)
            p = new MyPrivateInitStuff(parent);
        return p;
    }
    ~MyPrivateInitStuff()
    {
        // cleanup goes here
    }
private:
    MyPrivateInitStuff(QObject *parent)
        : QObject(parent)
    {
        // initialization goes here
    }
    MyPrivateInitStuff *p;
};
					

通过选择正确父级对象,这经常可以在正确时刻清理模块数据。

注意: 该函数从 Qt 5.10 起是 Thread-Safety (线程安全) 的。

注意: 此函数是 thread-safe .

另请参阅 qRemovePostRoutine ().

void qRemovePostRoutine ( QtCleanUpFunction ptr )

移除清理例程指定通过 ptr 从例程列表调用通过 QCoreApplication 析构函数。必须先前已将例程添加到列表通过调用 qAddPostRoutine (),否则此函数不起作用。

注意: 该函数从 Qt 5.10 起是 Thread-Safety (线程安全) 的。

注意: 此函数是 thread-safe .

另请参阅 qAddPostRoutine ().

宏文档编制

Q_COREAPP_STARTUP_FUNCTION ( QtStartUpFunction ptr )

添加的全局函数调用自 QCoreApplication 构造函数。此宏通常用于初始化程序范围功能库,不要求应用程序调用库进行初始化。

函数的指定通过 ptr 不应接受自变量且不应返回任何东西。例如:

// Called once QCoreApplication exists
static void preRoutineMyDebugTool()
{
    MyDebugTool* tool = new MyDebugTool(QCoreApplication::instance());
    QCoreApplication::instance()->installEventFilter(tool);
}
Q_COREAPP_STARTUP_FUNCTION(preRoutineMyDebugTool)
					

注意,启动函数将运行在末尾对于 QCoreApplication 构造函数,在任何 GUI 初始化之前。若函数中要求 GUI 代码,稍后可使用计时器 (或队列援引) 从事件循环履行初始化。

QCoreApplication 被删除且另一 QCoreApplication 被创建,启动函数将被再次援引。

注意: 此宏不适合用于静态链接到应用程序的库代码中,因为函数可能根本不会被调用,由于被链接器淘汰。

注意: This macro is 可重入 .

Q_DECLARE_TR_FUNCTIONS ( context )

Q_DECLARE_TR_FUNCTIONS() 宏声明并实现翻译函数 tr() 采用此签名:

static inline QString tr(const char *sourceText,
                         const char *comment = nullptr);
					

此宏很有用,若想要使用 QObject::tr () 当类未继承自 QObject .

Q_DECLARE_TR_FUNCTIONS() 必须出现在类定义最顶部 (先于第一个 public: or protected: )。例如:

class MyMfcView : public CView
{
    Q_DECLARE_TR_FUNCTIONS(MyMfcView)
public:
    MyMfcView();
    ...
};
					

The context 参数通常是类名,但它可以是任何文本。

另请参阅 Q_OBJECT and QObject::tr ().