QCoreApplication 类
QCoreApplication 类为没有 UI 的 Qt 应用程序提供事件循环。 更多...
头文件 | #include <QCoreApplication> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承自 | QObject |
继承于 |
属性
|
|
公共函数
QCoreApplication(int &argc, char **argv) | |
虚拟 | ~QCoreApplication() |
(自 6.5 版起) Qt::PermissionStatus | checkPermission(const QPermission &permission) |
void | installNativeEventFilter(QAbstractNativeEventFilter *filterObj) |
虚拟 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 | 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 * | instance() |
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) |
(since 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 attribute, 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 attribute) |
QString | translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) |
重新实现受保护的函数
虚拟 bool | event(QEvent *e) 覆盖 |
相关非成员
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()来保持应用程序的响应性。
一般情况下,我们建议您尽早在 main()
函数中创建 QCoreApplication、QGuiApplication 或 QApplication 对象。当调用 exec() 时,它不会返回直到事件循环退出;例如,当调用 quit() 时。
还提供了一些静态便捷函数。可以从 instance() 获取 QCoreApplication 对象。可以通过 sendEvent() 发送事件或将事件发布到事件队列中,使用 postEvent()。可以使用 removePostedEvents() 或 sendPostedEvents() 将挂起的事件移除或分发。
该类提供了一个 quit() 槽和一个 aboutToQuit() 信号。
应用程序和库路径
应用程序有一个 applicationDirPath() 和一个 applicationFilePath()。可以使用 libraryPaths() 获取库路径(参阅 QLibrary),并通过 setLibraryPaths()、addLibraryPath() 和 removeLibraryPath() 来操作。
国际化与翻译
可以使用 installTranslator() 和 removeTranslator() 添加或移除翻译文件。可以使用 translate() 将应用程序字符串进行翻译。QObject::tr() 函数以 translate() 为基础实现。
访问命令行参数
应使用 arguments() 函数访问传递给 QCoreApplication 构造函数的命令行参数。
注意:QCoreApplication 会移除选项 -qmljsdebugger="..."
。它会解析 qmljsdebugger
的参数,然后移除该选项及其参数。
对于更高级的命令行选项处理,请创建一个 QCommandLineParser。
地区设置
在 Unix/Linux 下,Qt 默认配置为使用系统地区设置。这在使用 POSIX 函数时可能会导致冲突,例如,在转换浮点数和字符串等数据类型时,因为不同的地区之间的表示可能不同。为了解决这个问题,应在初始化 QApplication、QGuiApplication 或 QCoreApplication 后立即调用 POSIX 函数 setlocale(LC_NUMERIC,"C")
,以便将用于数字格式的地区重置为 "C"-地区。
参见:QGuiApplication、QAbstractEventDispatcher、QEventLoop、使用信号量进行生产和消费 和 使用等待条件进行生产和消费。
属性文档
applicationName : QString
该属性持有此应用程序的名称
应用程序名称在各种Qt类和模块中使用,尤其是在使用默认构造函数创建QSettings时最为突出。其他用途包括格式化日志输出(参见qSetMessagePattern()),QCommandLineParser的输出,在QTemporaryDir和QTemporaryFile的默认路径中,以及QStandardPaths的一些文件位置。Qt D-Bus、辅助功能和XCB平台集成也使用了应用程序名称。
如果未设置,应用程序名称的默认值为可执行文件名。
访问函数
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
此属性保留编写此应用程序的组织的互联网域名
当使用默认构造函数创建QSettings时,该值由QSettings类使用。这可以避免每次创建QSettings对象时重复此信息。
在Mac上,如果QSettings不为空字符串,则将其用作组织;否则,使用organizationName()。在其他所有平台上,QSettings使用organizationName()作为组织。
访问函数
QString | organizationDomain() |
void | setOrganizationDomain(const QString &orgDomain) |
通知信号
void | organizationDomainChanged() |
另请参阅organizationName、applicationName和applicationVersion。
organizationName : QString
此属性保留编写此应用程序的组织的名称
当使用默认构造函数创建QSettings时,该值由QSettings类使用。这可以避免每次创建QSettings对象时重复此信息。
在Mac上,如果organizationDomain不为空字符串,则QSettings将其用作组织;否则,使用组织名称。在其他所有平台上,QSettings使用组织名称()作为组织。
访问函数
QString | organizationName() |
void | setOrganizationName(const QString &orgName) |
通知信号
void | organizationNameChanged() |
另请参阅organizationDomain和applicationName。
quitLockEnabled : 布尔型
该属性用于表示是否启用 QEventLoopLocker 功能会导致应用程序退出。
当此属性为 true
时,会对应用程序正在操作的最后一个 QEventLoopLocker 进行释放,尝试退出应用程序。
请注意,尝试退出并不一定会导致应用程序退出,例如如果还有打开的窗口,或者 QEvent::Quit 事件被忽略。
默认值为 true
。
访问函数
bool | isQuitLockEnabled() |
void | setQuitLockEnabled(bool enabled) |
成员函数文档
QCoreApplication::QCoreApplication(int &argc, char **argv)
构建一个 Qt 核心应用程序。核心应用程序是没有图形用户界面的应用程序。这类应用程序用于控制台或作为服务器进程。
通过 arguments() 函数处理 argc 和 argv 参数,并且以更方便的形式提供它们。
注意: argc 和 argv 指向的数据必须在 QCoreApplication 对象的整个生命周期内有效。此外,argc 必须大于零,且 argv 必须包含至少一个有效的字符字符串。
[virtual noexcept]
QCoreApplication::~QCoreApplication()
销毁 QCoreApplication 对象。
[private signal]
void QCoreApplication::aboutToQuit()
当应用程序即将退出主事件循环时,会发出此信号,例如,当事件循环级别降到零。这可能是应用程序内部调用 quit() 后或用户关闭整个桌面会话时发生的。
该信号特别有用,如果您的应用程序需要在最后一刻进行一些清理。请注意,在此状态下无法与用户进行交互。
注意: 在这一点上,主事件循环仍在运行,但返回后不会处理除通过 deleteLater() 删除的对象的 QEvent::DeferredDelete 事件以外的任何事件。如果需要事件处理,请使用嵌套事件循环或手动调用 QCoreApplication::processEvents()。
注意: 这是一个私有信号。它可以在信号连接中使用,但不能由用户发出。
参阅quit。
[static]
void QCoreApplication::addLibraryPath(const QString &path)
将 path 添加到库路径列表的开头,确保首先搜索它。如果 path 为空或已在路径列表中,则路径列表不会更改。
默认路径列表由一个或两个条目组成。第一个是插件的安装目录,它是 INSTALL/plugins
,其中 INSTALL
是 Qt 安装的目录。第二个是应用程序的自己的目录(不是当前目录),但只有在 QCoreApplication 对象实例化之后。
当QCoreApplication实例销毁时,库路径将重置为默认值。
另请参阅 removeLibraryPath()、libraryPaths() 和 setLibraryPaths()。
[静态]
QString QCoreApplication::applicationDirPath()
返回包含应用程序可执行文件的目录。
例如,如果您将Qt安装在C:\Qt
目录下,并运行了regexp
示例,此函数将返回"C:/Qt/examples/tools/regexp"。
在macOS和iOS上,这将是实际包含可执行文件的目录,它可能位于应用程序包内(如果应用程序被打包)。
警告:在Linux上,此函数将尝试从/proc
文件系统获取路径。如果失败,则假定argv[0]
包含可执行文件的绝对文件名。此函数还假定应用程序没有更改当前目录。
另请参阅 applicationFilePath()。
[静态]
QString QCoreApplication::applicationFilePath()
返回应用程序可执行文件的文件路径。
例如,如果您将Qt安装在/usr/local/qt
目录下,并运行了regexp
示例,此函数将返回"/usr/local/qt/examples/tools/regexp/regexp"。
警告:在Linux上,此函数将尝试从/proc
文件系统获取路径。如果失败,则假定argv[0]
包含可执行文件的绝对文件名。此函数还假定应用程序没有更改当前目录。
另请参阅 applicationDirPath()。
[静态]
qint64 QCoreApplication::applicationPid()
返回当前应用程序的进程ID。
[静态]
QStringList QCoreApplication::arguments()
返回命令行参数列表。
通常,arguments().at(0)是程序名称,arguments().at(1)是第一个参数,而arguments().last()是最后一个参数。有关Windows的说明,请参阅下面注释。
调用此函数会比较慢 - 解析命令行时,您应该将结果存储在变量中。
警告:在Unix上,此列表是从main()函数构造函数中传递的argc和argv参数构建的。使用QString::fromLocal8Bit()来解释argv中的字符串数据;因此,在运行在拉丁1区域设置的系统中无法传递例如日文命令行参数。大多数现代Unix系统都没有这种限制,因为它们是基于Unicode的。
在Windows上,只有当构造函数传递了修改过的argv/argc参数时,列表才从argc和argv参数构建。在这种情况下,可能会出现编码问题。
否则,从GetCommandLine()的返回值构建arguments()。因此,取决于应用程序的启动方式,arguments().at(0)提供的字符串可能在Windows上不是程序名称。
另请参阅 applicationFilePath() 和 QCommandLineParser()。
[since 6.5]
Qt::PermissionStatus QCoreApplication::checkPermission(const QPermission &permission)
检查给定
如果结果是 Qt::PermissionStatus::Undetermined,则应通过调用requestPermission()来请求权限,以确定用户的意图。
该函数是在Qt 6.5版本中引入的。
另请参阅requestPermission()和应用程序权限。
[静态]
bool QCoreApplication::closingDown()
如果应用程序对象正在销毁则返回true
;否则返回false
。
另请参阅startingUp()。
[重写虚保护]
bool QCoreApplication::event(QEvent *e)
重新实现了:QObject::event(QEvent *e)。
[静态]
QAbstractEventDispatcher *QCoreApplication::eventDispatcher()
返回指向主线程事件调度器的指针。如果对于此线程不存在事件调度器,则此函数返回 nullptr
。
另请参阅setEventDispatcher()。
[静态]
int QCoreApplication::exec()
进入主事件循环,并等待直到调用exit()。返回传递给exit()的值(如果通过quit()调用则为0)。
必须调用此函数来启动事件处理。主事件循环从窗口系统接收事件并将这些事件分发到应用程序小部件。
要使您的应用程序执行空闲处理(通过在没有挂起的事件时执行一个特殊函数),请使用0超时的QTimer。更高级的空闲处理方案可以通过使用processEvents()来实现。
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()
函数中,因为在某些平台上,exec()调用可能不会返回。例如,在Windows中,当用户注销时,系统会在Qt关闭所有顶层窗口后终止进程。因此,不能保证应用程序有时间退出发事件循环并在exec()调用后执行main()
函数末尾的代码。
另请参阅quit,exit,processEvents和QApplication::exec。
[静态槽]
void QCoreApplication::exit(int returnCode = 0)
告诉应用程序以返回码退出。
在此函数被调用后,应用程序离开主事件循环并从到exec()的调用返回。该exec()函数返回returnCode。如果事件循环没有运行,此函数不做任何事情。
传统上,returnCode为0表示成功,任何非零值表示错误。
始终使用QueuedConnection将信号连接到槽是一个好习惯。如果连接(非队列的)到该槽的信号在控制进入主事件循环之前发出(例如在调用exec()之前),则槽不起作用,应用程序永远不会退出。使用队列连接确保槽在控制进入主事件循环之后才会被调用。
注意,与同名的C库函数不同,此函数确实返回给调用者——停止的是事件处理。
请注意,此函数不是线程安全的。它只能从主线程(即QCoreApplication对象在上处理事件的线程)调用。要从另一个线程请求应用程序退出,可以调用QCoreApplication::quit(),或者从主线程使用QMetaMethod::invokeMethod()调用此函数。
void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
为应用在主线程中接收的所有原生事件安装事件过滤器filterObj。
事件过滤器filterObj通过其nativeEventFilter()函数接收事件,该函数在主线程中接收的所有原生事件都会调用。
QAbstractNativeEventFilter::nativeEventFilter()函数应返回true以过滤事件,即停止。它应返回false以允许Qt的正常处理继续:原生事件则可以被转换为QEvent并由标准的Qtevent过滤处理,例如QObject::installEventFilter()。
如果安装了多个事件过滤器,则最后安装的过滤器首先被激活。
注意:在此设置的过滤器函数接收原生消息,即MSG或XCB事件结构。
注意:如果设置了Qt::AA_PluginApplication属性,应用中的原生事件过滤器将被禁用。
为了实现最大的可移植性,在可能的情况下,您应该始终尝试使用QEvent和QObject::installEventFilter()。
另请参阅QObject::installEventFilter()。
[static]
bool QCoreApplication::installTranslator(QTranslator *translationFile)
将翻译文件translationFile添加到要用于翻译的翻译文件列表中。
可以安装多个翻译文件。翻译将按照安装的顺序相反的方式搜索,所以最近安装的翻译文件先搜索,第一次安装的翻译文件最后搜索。找到匹配的字符串的翻译后搜索停止。
安装或移除QTranslator,或更改已安装的QTranslator,将生成一个LanguageChange事件,该事件针对的是QCoreApplication实例。一个QApplication实例会将事件传播到所有顶层小部件中,在可重写的changeEvent中,可以通过传递用户可见字符串并通过tr()函数传递给相应的属性设置器来重新翻译用户界面。由Qt Designer生成的用户界面类提供了一个可以调用的retranslateUi()
函数。
函数在成功时返回true
,在失败时返回FALSE。
注意:QCoreApplication不会拥有translationFile的所有权。
另请参见:removeTranslator(),translate(),QTranslator::load(),以及动态语言更改准备。
[静态 noexcept]
QCoreApplication *QCoreApplication::instance()
返回应用的QCoreApplication(或QGuiApplication和QApplication)实例的指针。
如果没有分配实例,则返回nullptr
。
[静态]
bool QCoreApplication::isSetuidAllowed()
如果应用被允许在UNIX平台上运行setuid,则返回TRUE。
另请参见:QCoreApplication::setSetuidAllowed。
[静态]
QStringList QCoreApplication::libraryPaths()
返回应用在动态加载库时将搜索的路径列表。
当创建QCoreApplication时,此函数的返回值可能会有所变化。不建议在创建QCoreApplication之前调用它。如果已知,则应用可执行文件的目录是列表的一部分(不是工作目录)。为了使之已知,需要构造一个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发送到receiver:receiver->event(event). 返回接收者的事件处理程序返回的值。请注意,此函数为所有发送到任何线程中任何对象的事件都会被调用。
对于某些类型的事件(例如鼠标和键盘事件),如果接收者对事件不感兴趣(即,它返回false
),则事件将继续传播到接收者的父级,一直到顶级对象。
事件可以有五种不同的处理方式;重写此虚函数只是其中之一。以下列出了所有五种方法。
- 重写paintEvent()、mousePressEvent()等。这是最常见、最简单且最不强大的方式。
- 重写此函数。这非常强大,提供了完全控制;但一次只能有一个子类活跃。
- 在QCoreApplication::instance上安装事件过滤器。这种事件过滤器能够处理所有小部件的事件,因此它和重写notify()一样强大。此外,可以安装多个全局事件过滤器。全局事件过滤器还可以看到禁用小部件的鼠标事件。请注意,应用事件过滤器只针对位于主线程的对象。
- 以QWidget的方式重写QObject::event()。如果您这样做,您将得到Tab键的按键,并能够看到任何小部件特定事件过滤器之前的事件。
- 在对象上安装事件过滤器。这种事件过滤器会获取所有事件,包括Tab键和Shift+Tab键的按键,只要它们不会更改焦点小部件。
未来方向:在Qt 7中,对于位于主线程之外的对象,此函数将不会被调用。需要在同时期查找其他解决方案来解决需要此功能的ólque的应用程序的事件检查需要。更改可能会扩展到主线程,导致此函数被弃用。
注意:如果您重写此函数,您必须确保在您的应用程序对象开始销毁之前,处理事件的所有线程都停止这样做。这包括您可能使用的其他库启动的线程,但不适用于Qt自己的线程。
另请参阅:QObject::event()和installNativeEventFilter()。
[静态]
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
将事件event添加到事件队列中,并带有receiver作为事件接收者,然后立即返回。
事件必须在堆上分配,因为事件队列将接管事件,一旦事件被发布就会删除它。在发布后访问事件是不安全的。
当控制权返回主事件循环时,所有存储在队列中的事件将使用notify()函数发送。
事件按降序优先级排序,即具有高优先级的事件将排在前,而具有低优先级的事件排在后。优先级可以是任何整数,即从INT_MAX到INT_MIN,包括这两个值;有关更多详细信息,请参阅Qt::EventPriority。具有相同优先级的事件将按它们被发布的时间顺序进行处理。
注意:此函数是线程安全的。
另请参阅:sendEvent(),notify(),sendPostedEvents(),以及Qt::EventPriority。
[静态]
void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)
根据指定的标志处理线程中的一些挂起的事件。
不鼓励使用此函数。相反,最好是把长时间操作从GUI线程移到一个辅助线程,并完全避免嵌套事件循环处理。如果事件处理确实是必要的,请考虑使用QEventLoop代替。
如果在运行本地循环时持续调用此函数,且没有事件循环,则不会处理DeferredDelete事件。这可能会影响依赖于DeferredDelete事件的控件的行为,例如QToolTip。作为替代方案,可以在该本地循环中调用sendPostedEvents()。
调用此函数仅处理调用线程的事件,并在所有可用事件都处理完后返回。可用事件是在函数调用之前入队的。这意味着,在函数运行期间发布的事件将排队,直到下一次事件处理的轮次。
注意:此函数是线程安全的。
另请参阅:exec(),QTimer,QEventLoop::processEvents(),以及sendPostedEvents。
[静态]
void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int ms)
这是一个重载函数。
对调用线程挂起的事件进行处理,直到ms毫秒或没有更多要处理的事件, whichever is shorter。
这相当于调用如下函数:
QCoreApplication::processEvents(flags, QDeadlineTimer(ms));
[静态,自6.7起]
void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline)
这是一个重载函数。
处理调用线程挂起事件,直到deadline过期,或直到没有更多事件要处理, whichever happens first。
不鼓励使用此函数。相反,最好是把长时间操作从GUI线程移到一个辅助线程,并完全避免嵌套事件循环处理。如果事件处理确实是必要的,请考虑使用QEventLoop代替。
调用此函数仅处理调用线程的事件。
注意:与processEvents()重载函数不同,此函数还会处理函数运行期间发布的事件。
注意:所有在超时前入队的事件都将被处理,无论这需要多长时间。
注意:此函数是线程安全的。
此函数是在Qt 6.7中引入的。
另请参阅:exec(),QTimer,以及QEventLoop::processEvents。
[静态槽]
void QCoreApplication::quit()
请求应用程序退出。
如果应用程序阻止退出,例如其中一个窗口无法关闭,请求可能被忽略。应用程序可以通过处理应用程序级别的QEvent::Quit事件或单个窗口的QEvent::Close事件来影响此行为。
如果退出不被中断,应用程序将使用返回代码0(成功)退出。
为了在不被中断的情况下退出应用程序,请直接调用exit()。请注意,该方法不是线程安全的。
始终使用QueuedConnection将信号连接到槽是一个好习惯。如果连接(非队列的)到该槽的信号在控制进入主事件循环之前发出(例如在调用exec()之前),则槽不起作用,应用程序永远不会退出。使用队列连接确保槽在控制进入主事件循环之后才会被调用。
示例
QPushButton *quitButton = new QPushButton("Quit"); connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
线程安全说明:此函数可以从任何线程调用以安全地导致当前运行的主应用程序循环退出。然而,如果同时销毁QCoreApplication对象,则不能保证线程安全。
注意:此函数是线程安全的。
另请参阅exit()和aboutToQuit
[静态]
void QCoreApplication::removeLibraryPath(const QString &path)
从库路径列表中删除path。如果path为空或不位于路径列表中,则列表不会更改。
当QCoreApplication实例销毁时,库路径将重置为默认值。
另请参阅addLibraryPath()、libraryPaths()和setLibraryPaths()。
void QCoreApplication::removeNativeEventFilter(QAbstractNativeEventFilter *filterObject)
从此对象中删除事件过滤器filterObject。如果未安装此类事件过滤器,则请求被忽略。
当此对象被销毁时,所有事件过滤器会自动被移除。
在事件过滤器激活期间(即从nativeEventFilter()函数中)删除事件过滤器始终是安全的。
另请参阅installNativeEventFilter()。
[静态]
void QCoreApplication::removePostedEvents(QObject *receiver, int eventType = 0)
删除为receiver使用postEvent()发布的所有给定eventType事件。
事件没有被分发,而是从队列中删除。您不需要调用此函数。如果确实调用它,请注意,删除事件可能会导致receiver破坏一个或多个不变性。
如果receiver是nullptr
,则删除所有对象的eventType事件的eventType。如果eventType是0,则删除receiver的所有事件。您不应使用类型为0的eventType调用此函数。
注意:此函数是线程安全的。
[静态]
bool QCoreApplication::removeTranslator(QTranslator *translationFile)
从本应用程序使用的翻译文件列表中删除翻译文件translationFile。(它不会从文件系统中删除翻译文件。)
函数在成功时返回true
,在失败时返回FALSE。
另请参阅installTranslator()、translate()和QObject::tr().
[自6.5起]
模板 <typename Functor> void QCoreApplication::requestPermission(const QPermission &permission, Functor &&functor)
请求指定的 permission.
当请求准备就绪时,将按照 functor(const QPermission &permission)
调用 functor,其中 permission
描述了请求的结果。
functor 可以是一个独立函数或静态成员函数
qApp->requestPermission(QCameraPermission{}, &permissionUpdated);
或是一个lambda表达式
qApp->requestPermission(QCameraPermission{}, [](const QPermission &permission) { });
如果用户明确授予应用程序请求的 permission,或者已知该 permission 在指定平台上不需要用户授权,则状态将是 Qt::PermissionStatus::Granted。
如果用户明确拒绝应用程序请求的 permission,或者已知该 permission 在指定平台上不可访问或不适用于应用程序,则状态将是 Qt::PermissionStatus::Denied。
请求的结果永远不会是 Qt::PermissionStatus::Undetermined。
注意:权限只可以从主线程请求。
该函数是在Qt 6.5版本中引入的。
另请参阅:checkPermission() 和 应用程序权限。
[自6.5起]
模板 <typename Functor> void QCoreApplication::requestPermission(const QPermission &permission, const QObject *context, Functor functor)
在 context 的上下文中请求指定的 permission。
当请求准备就绪时,将按照 functor(const QPermission &permission)
调用 functor,其中 permission
描述了请求的结果。
functor 可以是一个独立函数或静态成员函数
qApp->requestPermission(QCameraPermission{}, context, &permissionUpdated);
一个lambda表达式
qApp->requestPermission(QCameraPermission{}, context, [](const QPermission &permission) { });
或在 context 对象中的槽
qApp->requestPermission(QCameraPermission{}, this, &CamerWidget::permissionUpdated);
functor 将在 context 对象的线程中被调用。如果请求完成前 context 被销毁,则不会调用 functor。
如果用户明确授予应用程序请求的 permission,或者已知该 permission 在指定平台上不需要用户授权,则状态将是 Qt::PermissionStatus::Granted。
如果用户明确拒绝应用程序请求的 permission,或者已知该 permission 在指定平台上不可访问或不适用于应用程序,则状态将是 Qt::PermissionStatus::Denied。
请求的结果永远不会是 Qt::PermissionStatus::Undetermined。
注意:权限只可以从主线程请求。
这是一个重载函数。
该函数是在Qt 6.5版本中引入的。
另请参阅:checkPermission() 和 应用程序权限。
[静态]
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
使用 notify() 函数,将事件 event 直接发送到接收器 receiver。返回值由事件处理程序返回。
在发送事件后,事件不会被删除。通常,在堆栈上创建事件,例如
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0); QApplication::sendEvent(mainWindow, &event);
[静态]
void QCoreApplication::sendPostedEvents(QObject *receiver = nullptr, int event_type = 0)
立即处理之前用 QCoreApplication::postEvent() 队列的所有事件,这些事件是针对对象 receiver 且事件类型为 event_type 的。
此函数不处理来自窗口系统的事件,这些事件由 processEvents() 处理。
如果 receiver 是 nullptr
,将向所有对象发送 event_type 的事件。如果 event_type 是 0,则为 receiver 发送所有事件。
注意:必须从其 QObject 参数 receiver 所在的线程中调用此方法。
另请参阅:postEvent。
[静态]
void QCoreApplication::setAttribute(Qt::ApplicationAttribute attribute, bool on = true)
如果 on 为 true,则设置属性 attribute;否则清除该属性。
注意:某些应用程序属性必须在创建 QCoreApplication 实例之前设置。有关更多信息,请参阅 Qt::ApplicationAttribute 文档。
另请参阅:testAttribute()。
[静态]
void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
将主线程的事件调度器设置为 eventDispatcher。这只有在尚未安装事件调度器的情况下才可行。也就是说,在 QCoreApplication 实例化之前。此方法将获取对对象的控制权。
另请参阅:eventDispatcher()。
[静态]
void QCoreApplication::setLibraryPaths(const QStringList &paths)
将使用 QLibrary 加载插件时搜索的目录列表设置为 paths。将删除所有现有路径,路径列表将由 paths 中提供的路径和应用程序的路径组成。
当QCoreApplication实例销毁时,库路径将重置为默认值。
另请参阅:libraryPaths()、addLibraryPath()、removeLibraryPath() 和 QLibrary。
[静态]
void QCoreApplication::setSetuidAllowed(bool allow)
如果 allow 为 true,允许应用程序在 UNIX 平台上运行 setuid。
如果 allow 为 false(默认值)并且 Qt 检测到应用程序正在以与实际用户 ID 不同的有效用户 ID 运行,则在创建 QCoreApplication 实例时,应用程序将被终止。
由于攻击面较大,Qt 不是一个适合 setuid 程序的解决方案。但是,出于历史原因,某些应用程序可能需要在这种方式下运行。此标志将防止 Qt 在检测到这种情况时终止应用程序,并且必须在创建 QCoreApplication 实例之前设置。
注意:强烈建议不要启用此选项,因为它会引入安全风险。如果此应用程序启用了标志并启动了子进程,则应尽可能通过调用 setuid(2)
或最迟使用 QProcess::UnixProcessParameters::ResetIds 标志来在自身上降级权限。
另请参阅:isSetuidAllowed()。
[静态]
bool QCoreApplication::startingUp()
如果尚未创建应用程序对象,则返回 true
;否则返回 false
。
另请参阅:closingDown()。
[静态]
bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute)
如果属性 attribute 已设置,则返回 true
;否则返回 false
。
参见setAttribute。
[静态]
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 和 QObject::tr() 文档。
n 与 %n
结合使用,以支持复数形式。有关详细信息,请参阅 QObject::tr。
如果没有任何翻译文件在 context 中包含 sourceText 的翻译,则该函数返回与 sourceText 等效的 QString。
此函数不是虚拟的。您可以通过继承 QTranslator 来使用其他翻译技术。
注意:此函数是线程安全的。
相关非成员
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 以来是线程安全的。
注意:此函数是线程安全的。
void qRemovePostRoutine(QtCleanUpFunction ptr)
从由 ptr 指定要清理的后备函数列表中删除由 QCoreApplication 析构函数调用的函数。该函数必须之前通过调用 qAddPostRoutine() 添加到列表中,否则此函数没有效果。
注意: 此功能自 Qt 5.10 以来是线程安全的。
注意:此函数是线程安全的。
另请参阅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,启动函数将再次调用。
注意:此宏不适用于将库代码静态链接到应用程序中,因为该函数可能根本不会被链接器调用。
注意:此宏是 重入。
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:
或 protected:
之前。例如
class MyMfcView : public CView { Q_DECLARE_TR_FUNCTIONS(MyMfcView) public: MyMfcView(); ... };
context 参数通常是类名,但可以是任何文本。
另请参阅Q_OBJECT 和 QObject::tr()。
© 2024 Qt 公司有限公司。本文件中包含的文档贡献是各自所有者的版权。本提供的文档是在自由软件开发基金会发布的 GNU 自由文档许可证第 1.3 版 条件下许可的。Qt 及相关标识是芬兰的 Qt 公司及其它在世界各地的商标。所有其他商标均为各自所有者的财产。