Qt:QCoreApplication 拼搏现实的明天。 2022-11-18 13:43 405阅读 0赞 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,[信号量示例][Link 1]和[等待条件示例][Link 2]。 # 属性文档 # ## applicationName : QString ## 此属性保存此应用程序的名称 当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。 如果没有设置,应用程序名称默认为可执行名称(自5.0以来)。 ![在这里插入图片描述][20210413140501868.png] 另请参见 organizationName, organizationDomain, applicationVersion, applicationFilePath(). ## applicationVersion : QString ## 此属性保存此应用程序的版本 如果没有设置,应用程序版本默认为平台特定的值,从主要应用程序可执行文件或包(从Qt 5.9开始)确定: <table> <thead> <tr> <th>平台</th> <th>来源</th> </tr> </thead> <tbody> <tr> <td>Windows(经典台式机)</td> <td>VERSIONINFO资源的PRODUCTVERSION参数</td> </tr> <tr> <td>macOS,iOS,tvOS,watchOS</td> <td>信息属性列表的CFBundleVersion属性</td> </tr> <tr> <td>安卓</td> <td>AndroidManifest.xml清单元素的android:versionName属性</td> </tr> </tbody> </table> ![在这里插入图片描述][20210413140745319.png] 另请参阅applicationName,organizationName和organizationDomain。 ## organizationDomain : QString ## 此属性持有编写此应用程序的组织的Internet域 当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。 在Mac上,如果organizationDomain不是一个空字符串, QSettings使用organizationDomain()作为组织;否则它使用organizationName()。在所有其他平台上,QSettings使用organizationName()作为组织。 ![在这里插入图片描述][20210413140848562.png] 另请参阅:organizationName, applicationName, applicationVersion. ## organizationName : QString ## 此属性保存编写此应用程序的组织的名称 当QSettings类使用空构造函数构造该值时,它将被使用。这样就不必在每次创建QSettings对象时重复此信息。 在Mac上,QSettings使用organizationDomain()作为组织,如果它不是一个空字符串;否则它使用organizationName()。在所有其他平台上,QSettings使用organizationName()作为组织。 ![在这里插入图片描述][20210413141004432.png] 另请参阅: organizationDomain 和applicationName. ## quitLockEnabled : bool ## 此属性保存使用QEventLoopLocker特性是否会导致应用程序退出。 默认为true。 ![在这里插入图片描述][20210413141037603.png] 另请参阅: 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()和[动态翻译][Link 3]。 ## 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()。 [Link 1]: https://doc.qt.io/qt-6/qtcore-threads-semaphores-example.html [Link 2]: https://doc.qt.io/qt-6/qtcore-threads-waitconditions-example.html [20210413140501868.png]: /images/20221022/de1ee405abf548ecbc5214c062796d4b.png [20210413140745319.png]: /images/20221022/923e942feff84bbfa16b639e20c99074.png [20210413140848562.png]: /images/20221022/2842c1f75a2d44d3b200cc36338f4441.png [20210413141004432.png]: /images/20221022/feb0fa1cb40441c9be5b2e68aa4e9e2f.png [20210413141037603.png]: /images/20221022/09784f71f05b4487b8023b4ed2604290.png [Link 3]: https://doc.qt.io/qt-6/internationalization.html#dynamic-translation
还没有评论,来说两句吧...