Qt:QCoreApplication

1060 篇文章 297 订阅

QCoreApplication类为没有UI的Qt应用程序提供了一个事件循环

头文件:

#include <QCoreApplication>

cmake:

find_package(Qt6 COMPONENTS Core REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Core)

qmake:

QT += core

继承自:

QObject

继承者:

QGuiApplication

详细说明

非gui应用程序使用这个类来提供它们的事件循环。对于使用Qt的非gui应用程序,应该只有一个QCoreApplication对象。有关GUI应用程序,请参见QGuiApplication。有关使用Qt Widgets模块的应用程序,请参见QApplication。

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

事件循环和事件处理

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

一般来说,我们建议您尽早在main()函数中创建QCoreApplication、QGuiApplication或QApplication对象。exec()在事件循环退出之前不会返回;例如,当调用quit()时才会返回。

还提供了几个静态方便函数。QCoreApplication对象可以从instance()获得。事件可以通过sendEvent()发送,也可以通过postEvent()发送到事件队列。挂起的事件可以用removePostedEvents()删除,也可以用sendPostedEvents()分派。

这个类提供了一个quit()槽和一个aboutToQuit()信号。

应用程序和库路径

应用程序有一个applicationDirPath()和一个applicationFilePath()。库路径(参见QLibrary)可以通过librarypath()检索,并通过setlibrarypath()、addLibraryPath()和removeLibraryPath()进行操作。

国际化和翻译

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

访问命令行参数

传递给QCoreApplication的构造函数的命令行参数应使用arguments()函数进行访问。

注意:QCoreApplication删除选项-qmljsdebugger="…"。它解析qmljsdebugger的参数,然后删除这个选项及其参数。

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

区域设置

在Unix/Linux上,Qt被配置为默认使用系统区域设置。这可能会在使用POSIX函数时导致冲突,例如,在浮点数和字符串等数据类型之间转换时,因为不同地区的符号可能不同。为了解决这个问题,在初始化QApplication、QGuiApplication或QCoreApplication之后,调用POSIX函数setlocale(LC_NUMERIC,“C”),将用于数字格式化的区域设置重置为"C"-locale。

另请参见QGuiApplication,QAbstractEventDispatcher,QEventLoop,信号量示例等待条件示例

属性文档

applicationName : QString

此属性保存此应用程序的名称

当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。

如果没有设置,应用程序名称默认为可执行名称(自5.0以来)。

在这里插入图片描述

另请参见 organizationName, organizationDomain, applicationVersion, applicationFilePath().

applicationVersion : QString

此属性保存此应用程序的版本

如果没有设置,应用程序版本默认为平台特定的值,从主要应用程序可执行文件或包(从Qt 5.9开始)确定:

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

在这里插入图片描述

另请参阅applicationName,organizationName和organizationDomain。

organizationDomain : QString

此属性持有编写此应用程序的组织的Internet域

当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。

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

在这里插入图片描述

另请参阅:organizationName, applicationName, applicationVersion.

organizationName : QString

此属性保存编写此应用程序的组织的名称

当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。

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

在这里插入图片描述

另请参阅: organizationDomain 和applicationName.

quitLockEnabled : bool

此属性保存使用QEventLoopLocker特性是否会导致应用程序退出。

默认为true。
在这里插入图片描述
另请参阅: QEventLoopLocker.

成员函数

QCoreApplication

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

构建一个Qt核心应用程序。核心应用程序是没有图形界面的应用程序。这类应用程序用于控制台或者作为服务器进程

argc和argv参数由应用程序处理,arguments()函数以更方便的形式提供这些参数。

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

aboutToQuit

[private signal]
void QCoreApplication::aboutToQuit()

当应用程序即将退出主事件循环时,例如,事件循环级别降至零时,将发出此信号。这可能是在从应用程序内部调用quit()之后或当用户关闭了整个桌面会话时发生的。

如果应用程序必须做一些最后一秒的清理,这个信号特别有用。请注意,在此状态下无法进行用户交互。

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

另请参阅: quit()

quit

[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);

另请参阅: exit() 、aboutToQuit().

~QCoreApplication

[virtual]
QCoreApplication::~QCoreApplication()

销毁QCoreApplication对象。

addLibraryPath

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

将路径添加到库路径列表的开头,以确保首先搜索库。如果path为空或已在路径列表中,则不更改路径列表。

默认路径列表包含一个条目,即插件的安装目录。插件的默认安装目录是INSTALL/plugins,其中INSTALL是Qt的安装目录。

销毁QCoreApplication实例后,库路径会重置为默认值。

另请参阅:removeLibraryPath()、librarypath()和setlibrarypath()。

applicationDirPath

[static]
QString QCoreApplication::applicationDirPath()

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

例如,如果你在C:\Qt目录下安装了Qt,然后你运行了regexp的例子,这个函数会返回"C:/Qt/examples/tools/regexp"。

在macOS和iOS上,这将指向实际包含可执行文件的目录,它可能在一个应用程序包中(如果应用程序被绑定)。

警告:在Linux上,这个函数将尝试从/proc文件系统获取路径。如果失败,它假定argv[0]包含可执行文件的绝对文件名。该函数还假定应用程序没有更改当前目录。

另请参阅:applicationFilePath()。

applicationFilePath

[static]
QString QCoreApplication::applicationFilePath()

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

例如,如果你在/usr/local/ Qt目录下安装了Qt,然后你运行了regexp的例子,这个函数会返回"/usr/local/ Qt /examples/tools/regexp/regexp"。

警告:在Linux上,这个函数将尝试从/proc文件系统获取路径。如果失败,它假定argv[0]包含可执行文件的绝对文件名。该函数还假定应用程序没有更改当前目录。

另请参阅:applicationDirPath()。

applicationPid

[static]
qint64 QCoreApplication::applicationPid()

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

arguments

[static]
QStringList QCoreApplication::arguments()

返回命令行参数列表。

通常arguments().at(0)是程序名,arguments().at(1)是第一个参数,arguments().last()是最后一个参数。请参阅下面关于Windows的说明。

调用这个函数很慢——在解析命令行时,应该将结果存储在一个变量中。

警告:在Unix上,这个列表是根据main()函数中传递给构造函数的argc和argv参数构建的。argv中的字符串数据使用QString::fromLocal8Bit()进行解释;因此,在运行于拉丁1地区的系统上传递日文命令行参数是不可能的。大多数现代Unix系统都没有这个限制,因为它们是基于unicode的。

在Windows上,只有当修改过的argv/argc参数被传递给构造函数时,列表才由argc和argv参数构建。在这种情况下,编码问题可能会发生。

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

另请参阅applicationFilePath()和QCommandLineParser。

ClosedDown

[static]
bool QCoreApplication::closingDown()

如果应用程序对象被销毁,则返回true;否则返回false。

另请参见startingUp()

event

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

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

eventDispatcher

[static]
QAbstractEventDispatcher *QCoreApplication::eventDispatcher()

返回指向主线程的事件分配器对象的指针。如果该线程不存在事件分配器,则此函数返回nullptr。

另请参见setEventDispatcher()。

exec

[static]
int QCoreApplication::exec()

进入主事件循环并等待,直到调用exit()。返回传递给exit()的值(如果通过quit()调用exit(),则返回0)。

需要调用这个函数来启动事件处理。主事件循环从窗口系统接收事件,并将这些事件分派给应用程序小部件

要使应用程序执行空闲处理(在没有挂起事件时执行一个特殊函数),请使用超时为0的QTimer。使用processEvents()可以实现更高级的空闲处理方案。

我们建议将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中,因为在某些平台上exec()调用可能不会返回。例如,在Windows上,当用户退出时,Qt关闭所有顶级窗口后,系统终止进程。因此,不能保证应用程序有时间退出它的事件循环,并在exec()调用后执行main()函数末尾的代码。

请参阅quit()、exit()、processEvents()和QApplication::exec()。

exit

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

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

调用此函数后,应用程序离开主事件循环,并从调用返回到exec()。该EXEC()函数返回返回码。如果事件循环未运行,则此功能不执行任何操作。

按照惯例,returnCode为0表示成功,而任何非零值都表示错误。

始终使用QueuedConnection将信号连接到此插槽是一个好习惯。如果在控制进入主事件循环之前(例如,在“ int main”调用exec()之前),发出了连接到该插槽的信号(未排队),则该插槽无效,并且应用程序永不退出。使用排队连接可确保直到控制进入主事件循环后才调用该插槽。

注意,与同名的C库函数不同,这个函数返回给调用者——停止的是事件处理。

请参阅quit()和exec()。

installNativeEventFilter

[since 5.0]
void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)

为应用程序在主线程中接收到的所有本机事件安装一个事件过滤器filterObj

事件过滤器filterObj通过其nativeEventFilter()函数接收事件,该函数针对在主线程中接收的所有本机事件调用。

如果事件应该被过滤,即停止,该QAbstractNativeEventFilter :: nativeEventFilter()函数将返回true。如果事件允许正常的Qt继续处理,则返回false:然后可以将本机事件转换为QEvent并由标准Qt事件过滤处理,例如QObject :: installEventFilter()。

如果安装了多个事件筛选器,那么最后安装的筛选器将首先被激活。

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

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

为了获得最大的可移植性,您应该尽可能使用QEvent和QObject::installEventFilter()。

这个函数是在Qt 5.0中引入的。

参见QObject: installEventFilter()。

installTranslator

[static]
boolQCoreApplication::installTranslator(QTranslator*translationFile)

将翻译文件translationfile添加到用于翻译的翻译文件列表中。

可以安装多个翻译文件。翻译按安装时的倒序进行搜索,因此首先搜索最近安装的翻译文件,最后搜索第一个安装的翻译文件。一旦找到包含匹配字符串的翻译,搜索就停止。

安装或删除aQTranslator,或更改一个installedqtranslator时,将为 QCoreApplication 实例生成一个 LanguageChange事件。QApplication实例将把事件传播到所有顶级小部件,其中重新实现的changeEvent可以通过thetr()函数将用户可见的字符串传递给各自的属性设置器,从而重新转换用户界面。Qt Designer生成的用户界面类提供了可以调用的aretranslateUi()函数。

函数成功返回true,失败返回false。

参见removetranslator (),translate(),QTranslator::load()和动态翻译

instance

[static]
QCoreApplication *QCoreApplication::instance()

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

如果没有分配实例,则返回nullptr。

isSetuidAllowed

[static, since 5.3]
bool QCoreApplication::isSetuidAllowed()

如果允许应用程序在UNIX平台上运行setuid,则返回true。

Qt5.3中引入了此函数。

另请参见QCoreApplication::setSetuidAllowed()。

libraryPaths

[static]
QStringList QCoreApplication::libraryPaths()

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

创建QCoreApplication时,此函数的返回值可能会更改。不建议在创建QCoreApplication之前调用它。应用程序可执行文件的目录(不是工作目录)是列表的一部分(如果已知)。为了让大家知道,必须构造一个QCoreApplication,因为它将使用argv[0]来查找它。

Qt提供默认的库路径,但也可以使用qt.conf格式文件。此文件中指定的路径将覆盖默认值。注意,如果qt.conf格式文件位于应用程序可执行文件的目录中,在创建QCoreApplication之前可能找不到该文件。如果在调用此函数时找不到,将使用默认库路径。

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

如果要迭代列表,可以使用foreach伪关键字:

foreach (const QString &path, app.libraryPaths())
    do_something(path);

另请参见 setLibraryPaths(), addLibraryPath(), removeLibraryPath(), QLibrary, 和 How to Create Qt Plugins.

notify

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

将事件发送给接收方: receiver->event(event)。返回从接收方事件处理程序返回的值。注意,对于发送到任何线程中的任何对象的所有事件,都调用此函数。

对于某些类型的事件(例如鼠标和关键事件),如果接收方对事件不感兴趣(即返回false),则该事件将传播到接收方的父对象等,直至顶层对象。

可以处理事件有五种不同的方法;重新实现这个虚拟函数只是其中之一。所有五种方法如下:

  • 重新实现paintEvent()、MousePresseEvent()等。这是最常见、最简单、最不强大的方法。
  • 重新实现此功能。这非常强大,可以提供完全控制。但一次只能激活一个子类。
  • 在QCoreApplication::instance()上安装事件筛选器。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现notify()一样强大;此外,还可以有多个应用程序全局事件筛选器。全局事件过滤器甚至可以看到禁用小部件的鼠标事件。注意,应用程序事件过滤器只对主线程中的对象调用。
  • 重新实现QObject::event()(就像QWidget所做的那样)。如果这样做,您将得到Tab键,然后在任何特定于小部件的事件过滤器之前看到事件。
  • 在对象上安装事件筛选器。这样的事件过滤器可以获取所有事件,包括Tab和Shift+Tab键按下事件,只要它们不更改焦点小部件。

未来发展方向:不在Qt 6主线程之外的对象将不会调用此函数。需要该功能的应用程序应同时为其事件检查需要找到其他解决方案。该更改可能会扩展到主线程,从而导致不建议使用此功能。

警告:如果重写此功能,则必须确保在处理应用程序对象开始之前,所有处理事件的线程都停止这样做。这包括您可能正在使用的其他库启动的线程,但不适用于Qt自己的线程。

另请参见QObject :: event()和installNativeEventFilter()。

postEvent

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

将对象接收器作为事件接收器的事件添加到事件队列并立即返回。

必须在堆上分配事件,因为发布事件队列将获得事件的所有权,并在发布事件后将其删除。在事件发布后访问它是不安全的。

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

事件按优先级降序排序,即优先级高的事件在优先级低的事件之前排队。优先级可以是任意整数值,即介于INT_MAX和INT_MIN之间(包括这两个值);有关详细信息,请参见Qt::EventPriority。优先级相同的事件将按发布的顺序进行处理。

注意:此函数是线程安全的。

另请参见sendEvent()、notify()、sendPostedEvents()和Qt::EventPriority。

processEvents

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

根据指定的标志处理调用线程的一些挂起事件。

当程序忙于执行长操作(例如复制文件)时,可以偶尔调用此函数。

如果正在运行连续调用此函数的本地循环,而没有事件循环,则不会处理DeferredDelete事件。这可能会影响依赖deferredelete事件正常运行的小部件(例如QToolTip)的行为。另一种方法是从本地循环中调用sendPostedEvents()。

调用此函数仅处理调用线程的事件,并在处理完所有可用事件后返回。可用事件是在函数调用之前排队的事件。这意味着在函数运行时发布的事件将排队等待下一轮事件处理。

注意:此函数是线程安全的。

另请参见exec()、QTimer、QEventLoop::processEvents()和sendPostedEvents()。

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

此函数重载processEvents()。

处理调用线程的挂起事件达毫秒或直到没有更多的事件要处理,以较短的为准。

当程序忙于执行长操作(例如复制文件)时,可以偶尔调用此函数。

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

注意:与processEvents()重载不同,此函数还处理在函数运行时发布的事件。

注意:此函数是线程安全的。

另请参见exec()、QTimer和QEventLoop::processEvents()。

removeLibraryPath

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

从库路径列表中删除路径。如果路径为空或不在路径列表中,则列表不会更改。

当QCoreApplication的实例被破坏时,库路径被重置为默认路径。

另请参见addLibraryPath()、libraryPaths()和setLibraryPaths()。

removeNativeEventFilter

[since 5.0]void QCoreApplication::removeNativeEventFilter(QAbstractNativeEventFilter *filterObject)

从此对象中删除事件筛选器对象。如果尚未安装此类事件筛选器,则忽略该请求。

销毁此对象时,将自动删除此对象的所有事件筛选器。

删除事件筛选器总是安全的,即使是在激活事件筛选器期间(即从nativeEventFilter()函数中)。

这个函数是在qt5.0中引入的。

另请参见installNativeEventFilter()。

removePostedEvents

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

删除使用receiver的postEvent()发布的给定eventType的所有事件。

事件不会被调度,而是从队列中删除。您不需要调用此函数。若您确实调用了它,请注意终止事件可能会导致接收器中断一个或多个不变量。

如果receiver为nullptr,则删除所有对象的eventType事件。如果eventType为0,则删除接收器的所有事件。不应使用eventType为0调用此函数。

注意:此函数是线程安全的。

removeTranslator

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

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

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

另请参见installTranslator()、translate()和QObject::tr()。

sendEvent

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

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

发送事件后不会删除该事件。通常的方法是在堆栈上创建事件,例如:

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

另请参见 postEvent() 、notify().

sendPostedEvents

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

立即分派以前使用QCoreApplication::postEvent()排队的所有事件,这些事件是针对对象接收器的事件类型为event\ u类型。

窗口系统中的事件不是由此函数调度的,而是由processEvents()调度的。

如果receiver为nullptr,则为所有对象发送event类型的事件。如果事件类型为0,则向接收方发送所有事件。

注意:必须从其QObject参数receiver所在的线程调用此方法。

另请参见postEvent()。

setAttribute

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

如果on为true,则设置属性;否则清除属性。

注意:在创建QCoreApplication实例之前,必须设置一些应用程序属性。有关更多信息,请参阅Qt::ApplicationAttribute文档。

另请参见testAttribute()。

setEventDispatcher

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

将主线程的事件调度程序设置为eventDispatcher。这只有在没有安装事件调度器的情况下才可能。也就是说,在QCoreApplication被实例化之前。此方法获取对象的所有权。

另请参见eventDispatcher()。

setLibraryPaths

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

设置将带有QLibrary的插件加载到路径时要搜索的目录列表。所有现有路径都将被删除,路径列表将由路径中给定的路径和应用程序的路径组成。

当QCoreApplication的实例被破坏时,库路径被重置为默认路径。

另请参见LibraryPath()、addLibraryPath()、removeLibraryPath()和QLibrary。

setSetuidAllowed

[static, since 5.3]
void QCoreApplication::setSetuidAllowed(bool allow)

如果allow为true,则允许应用程序在UNIX平台上运行setuid。

如果allow为false(默认值),并且Qt检测到应用程序运行的有效用户id与实际用户id不同,则在创建QCoreApplication实例时,应用程序将被中止。

Qt不是setuid程序的合适解决方案,因为它的攻击面很大。但是,由于历史原因,某些应用程序可能需要以这种方式运行。当检测到此情况时,此标志将阻止Qt中止应用程序,并且必须在创建QCoreApplication实例之前设置此标志。

注意:强烈建议不要启用此选项,因为它会带来安全风险。

Qt5.3中引入了此函数。

另请参见isSetuidAllowed()。

startingUp

[static]
bool QCoreApplication::startingUp()

如果尚未创建应用程序对象,则返回true;否则返回false。

另请参见closingDown()。

testAttribute

[static]
bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute)

如果设置了属性,则返回true;否则返回false。

另请参见setAttribute()。

translate

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

通过查询已安装的翻译文件返回sourceText的翻译文本。翻译文件将从最近安装的文件搜索回第一个安装的文件。

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

上下文通常是类名(例如“MyDialog”),sourceText是英文文本或短标识文本。

消歧是一个标识字符串,用于在同一上下文中的不同角色中使用相同的源文本时。默认情况下,它是null ptr。

有关上下文、消歧和注释的详细信息,请参阅QTranslator和QObject::tr()文档。

n与%n一起使用,以支持复数形式。有关详细信息,请参见qoObject::tr()。

如果所有转换文件都不包含上下文中sourceText的转换,则此函数返回相当于sourceText的QString。

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

注意:此函数是线程安全的。

另请参见qoObject::tr()、installTranslator()、removeTranslator()和translate()。

相关非成员

qAddPostRoutine

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;
};

通过选择正确的父对象,通常可以在适当的时候清理模块的数据。

注意:此函数自Qt5.10以来一直是线程安全的。

注意:此函数是线程安全的。

另请参见qRemovePostRoutine()。

qRemovePostRoutine

[since 5.3]
void qRemovePostRoutine(QtCleanUpFunction ptr)

从QCoreApplication析构函数调用的例程列表中删除ptr指定的清理例程。该例程之前必须通过调用qaddpostproutine()添加到列表中,否则此函数无效。

注意:此函数自Qt5.10以来一直是线程安全的。

注意:此函数是线程安全的。

Qt5.3中引入了此函数。

另请参见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)

注意,startup函数将在QCoreApplication构造函数的末尾运行,在任何GUI初始化之前。如果函数中需要GUI代码,请使用计时器(或排队调用)稍后从事件循环执行初始化。

如果删除了QCoreApplication并创建了另一个QCoreApplication,则会再次调用startup函数。

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

注意:这个函数是可重入的。

这个函数是在qt5.1中引入的。

Q_DECLARE_TR_FUNCTIONS(context)

Q_DECLARE_TR_FUNCTIONS宏声明并实现具有以下签名的转换函数TR():

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

如果要在不继承自QObject的类中使用QObject :: tr(),则此宏很有用。

Q_DECLARE_TR_FUNCTIONS()必须出现在类定义的最顶部(在第一个public:或之前protected:)。例如:

class MyMfcView : public CView
{
    Q_DECLARE_TR_FUNCTIONS(MyMfcView)

public:
    MyMfcView();
    ...
};

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

另请参见Q_OBJECT和QObject::tr()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值