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()。