百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

QCoreApplication

liebian365 2024-11-22 17:15 5 浏览 0 评论

一、描述

非 GUI 应用程序使用此类来提供它们的事件循环。对于使用 Qt 的非 GUI 应用程序,应该只有一个 QCoreApplication 对象。

对于 GUI 应用程序,使用 QGuiApplication。对于使用 Qt Widgets 模块的应用程序,使用 QApplication。

QCoreApplication 包含主事件循环,来自操作系统的所有事件和其他源都在其中被处理和调度。它还处理应用程序的初始化和完成,以及系统范围和应用程序范围的设置。

二、属性成员

1、applicationName : QString

应用程序的名称。如果未设置,则应用程序名称默认为可执行名称。

2、applicationVersion : QString

应用程序的版本。

3、organizationDomain : QString

编写此应用程序的组织的 Internet 域。

4、organizationName : QString

编写此应用程序的组织的名称。

5、quitLockEnabled : bool

此属性保存使用 QEventLoopLocker 功能是否会导致应用程序退出。默认为 true。

三、成员函数

1、QCoreApplication(int &argc, char **argv)

构造一个 Qt core 应用程序。core 应用程序是没有图形用户界面的应用程序。此类应用程序用于控制台或服务器进程。

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

2、【private signal】void aboutToQuit()

当应用程序即将退出主事件循环时发出此信号。

如果应用程序必须在最后一秒进行清理,则该信号特别有用。

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

3、【static】void exit(int returnCode = 0)

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

调用此函数后,应用程序离开主事件循环并从对 exec() 的调用中返回。exec() 函数返回 returnCode。如果事件循环没有运行,这个函数什么也不做。

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

始终使用 Qt::QueuedConnection 将信号连接到此槽是一种很好的做法。如果在控制进入主事件循环之前(例如在“int main()”调用 exec() 之前)发出连接(非 Qt::QueuedConnection 方式)到该槽的信号,则该槽无效并且应用程序不会退出。使用 Qt::QueuedConnection 连接可确保在控制进入主事件循环之前不会调用槽。

与同名的 C 库函数不同,此函数确实返回给调用者。

此函数不是线程安全的。它应该只从主线程(QCoreApplication 对象正在处理事件的线程)调用。要让应用程序从另一个线程退出,可以使用 QCoreApplication::quit() 或者使用 QMetaMethod::invokeMethod() 从主线程调用此函数。

4、【static】void quit()

要求应用程序退出。

如果应用程序阻止退出,则该请求可能会被忽略,例如,如果它的一个窗口无法关闭。应用程序可以通过处理应用程序级别的 QEvent::Quit 事件或单个窗口的 QEvent::Close 事件来影响这一点。

如果退出没有中断,应用程序将退出并返回代码 0(成功)。

要退出应用程序而不会被中断,请直接调用 exit()。

始终使用 Qt::QueuedConnection 将信号连接到此槽是一种很好的做法。如果在控制进入主事件循环之前(例如在“int main()”调用 exec() 之前)发出连接(非 Qt::QueuedConnection 方式)到该槽的信号,则该槽无效并且应用程序不会退出。使用 Qt::QueuedConnection 连接可确保在控制进入主事件循环之前不会调用槽。

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

可以从任何线程调用此函数以线程安全地导致当前运行的主应用程序循环退出。但是,如果同时销毁 QCoreApplication 对象,则无法保证线程安全。

5、【static】void addLibraryPath(const QString &path)

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

默认路径列表由数个条目组成。 第一个是插件的安装目录,即 INSTALL/plugins,其中 INSTALL是Qt的安装目录。 第二个是应用程序自己的目录(不是当前目录)。

当 QCoreApplication 的实例被销毁时,库路径将重置为默认值。

【static】QStringList libraryPaths()

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

创建 QCoreApplication 时,此函数的返回值可能会发生变化。不建议在创建 QCoreApplication 之前调用它。

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

该列表将包括插件的安装目录(如果存在)(插件的默认安装目录是 INSTALL/plugins,其中 INSTALL 是安装 Qt 的目录)。

【static】void removeLibraryPath(const QString &path)

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

当 QCoreApplication 的实例被销毁时,库路径将重置为默认值。

【static】void setLibraryPaths(const QStringList &paths)

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

当 QCoreApplication 的实例被销毁时,库路径将重置为默认值。

6、【static】QString applicationDirPath()

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

在 macOS 和 iOS 上,将指向实际包含可执行文件的目录,该目录可能位于应用程序包中。

7、【static】QString applicationFilePath()

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

8、【static】qint64 applicationPid()

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

9、【static】QStringList arguments()

返回命令行参数列表。

通常 arguments().at(0) 是程序名称,arguments().at(1) 是第一个参数,arguments().last() 是最后一个参数。

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

10、【static】bool closingDown()

应用程序对象是否正在被销毁。

【static】bool startingUp()

应用程序对象是否正在创建。

11、【static】QAbstractEventDispatcher *eventDispatcher()

返回指向主线程的事件分派器对象的指针。

【static】void setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)

将主线程的事件分派器设置为 eventDispatcher。在 QCoreApplication 被实例化之前才有用。此方法获取对象的所有权。

12、【static】int exec()

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

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

要使应用程序执行空闲处理(通过在没有未决事件时执行特殊功能),请使用具有 0 超时的 QTimer。使用 processEvents() 可以实现更高级的空闲处理方案。

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

13、void installNativeEventFilter(QAbstractNativeEventFilter *filterObj)

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

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

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

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

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

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

【static】void removeNativeEventFilter(QAbstractNativeEventFilter *filterObject)

移除事件过滤器。如果尚未安装此类事件过滤器,则忽略该请求。

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

即使在事件过滤器激活期间(即执行 nativeEventFilter()时),删除事件过滤器也是安全的。

14、【static】bool installTranslator(QTranslator *translationFile)

将翻译文件 translationFile 添加到要用于翻译的翻译文件列表中。返回是否成功添加。

可以添加多个翻译文件。翻译按添加时的相反顺序搜索,因此首先搜索最近添加的翻译文件,最后搜索添加的第一个翻译文件。一旦找到包含匹配字符串的翻译,搜索就会停止。

安装或移除 QTranslator,或更改已添加的 QTranslator 会为 QCoreApplication 实例生成 QEvent::LanguageChange 事件。QApplication 实例会将该事件传播到所有顶级小部件,重新实现changeEvent() 可以通过将用户可见的字符串通过 tr() 函数传递给相应的属性设置器来重新转换用户界面。Qt Designer 生成的用户界面类提供了一个可以调用的 retranslateUi() 函数。

注意:QCoreApplication 不获取 translationFile 的所有权。

【static】bool removeTranslator(QTranslator *translationFile)

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

返回是否成功移除。

15、【static】QCoreApplication * instance()

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

16、【static】bool isSetuidAllowed()

是否允许应用程序在 UNIX 平台上运行 setuid。

【static】void setSetuidAllowed(bool allow)

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

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

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

17、bool notify(QObject *receiver, QEvent *event)

向接收者 receiver 发送事件:receiver->event(event)。返回从接收者的事件处理程序返回的值。

对于发送到任何线程中的任何对象的所有事件,都会调用此函数。

对于某些类型的事件(例如鼠标和按键事件),如果接收者对该事件不感兴趣(即返回 false),则该事件将传播到接收者的父对象,依此类推直到顶级对象。

有五种不同的方式可以处理事件,重新实现这个虚函数只是其中之一。下面列出了所有五种方法:

重新实现 paintEvent()、mousePressEvent() 等。这是最常见、最简单、最不强大的方法。

重新实现此函数。这是非常强大的,提供完全的控制;但一次只能激活一个子类。

在 QCoreApplication::instance() 上安装事件过滤器。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现 notify() 一样强大;此外,可以有多个应用程序全局事件过滤器。请注意,应用程序事件过滤器仅对存在于主线程中的对象调用。

重新实现 QObject::event() 。

在对象上安装事件过滤器。这样的事件过滤器获取所有事件。

在 Qt 6 主线程之外的对象将不会调用此函数。需要该功能的应用程序应同时寻找其他解决方案来满足其事件检查需求。更改可能会扩展到主线程,导致此功能被弃用。

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

18、【static】void postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)

将事件 event 以作为 receiver 接收者,添加到事件队列并立即返回。

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

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

事件按优先级降序排列,即优先级高的事件排在优先级低的事件之前。优先级可以是任何整数值,即介于 INT_MAX 和 INT_MIN 之间,包括 INT_MAX 和 INT_MIN。具有相同优先级的事件将按照发布的顺序进行处理。

这个函数是线程安全的。

enum Qt::EventPriority:此枚举可用于指定事件优先级。

  • Qt::HighEventPriority:具有此优先级的事件在具有 NormalEventPriority 或 LowEventPriority 的事件之前发送。
  • Qt::NormalEventPriority:具有此优先级的事件在具有 HighEventPriority 的事件之后发送,但在具有 LowEventPriority 的事件之前发送。
  • Qt::LowEventPriority:具有此优先级的事件在具有 HighEventPriority 或 NormalEventPriority 的事件之后发送。

提供这些值纯粹是为了方便,因为事件优先级可以是 INT_MAX 和 INT_MIN 之间的任何值。例如,可以将自定义优先级定义为彼此相关:

enum CustomEventPriority
{
ImportantEventPriority = Qt::HighEventPriority,
MoreImportantEventPriority = ImportantEventPriority + 1,
CriticalEventPriority = 100 * MoreImportantEventPriority,
StatusEventPriority = Qt::LowEventPriority,
IdleProcessingDoneEventPriority = StatusEventPriority - 1
};
【static】void removePostedEvents(QObject *receiver, int eventType = 0)

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

事件将从队列中移除。一般不需要调用此函数。如果调用它,请注意杀死事件可能会导致receiver 破坏一个或多个不变量。

如果 receiver 为 nullptr,则删除所有对象的 eventType 事件。 如果 eventType 为 0,则为接收者删除所有事件。永远不应该用 eventType 为 0 来调用这个函数。

这个函数是线程安全的。

19、【static】void processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)

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

不建议使用此功能。建议将长操作从 GUI 线程移到辅助线程中,并完全避免嵌套事件循环处理。如果确实需要事件处理,应考虑改用 QEventLoop。

这个函数是线程安全的。

【static】void processEvents(QEventLoop::ProcessEventsFlags flags, int ms)

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

不鼓励使用此功能。

调用此函数仅为调用线程处理事件。这个函数是线程安全的。

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

无论需要多长时间,都将处理在超时之前排队的所有事件。

20、【static】bool sendEvent(QObject *receiver, QEvent *event)

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

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

QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);

QApplication::sendEvent(mainWindow, &event);

21、【static】void sendPostedEvents(QObject *receiver = nullptr, int event_type = 0)

立即分派先前已使用 postEvent() 排队的所有事件,这些事件接收者为 receiver 且具有事件类型 event_type。

来自窗口系统的事件不是由这个函数分派的,而是由 processEvents() 分派的。

如果 receiver 为nullptr,则为所有对象发送event_type 的事件。 如果 event_type 为 0,则所有事件都发送给 receiver。

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

22、【static】void setAttribute(Qt::ApplicationAttribute attribute,bool on = true)

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

enum Qt::ApplicationAttribute:此枚举描述了改变应用程序范围特性行为的属性。

  • Qt::AA_DontShowIconsInMenus:具有 Icon 属性的 QAction 不会显示在任何菜单中,除非由 QAction::iconVisibleInMenu 特别设置。当前打开的菜单或已在本机 macOS 菜单栏中创建的菜单可能不会对该属性进行更改。
  • Qt::AA_DontShowShortcutsInContextMenus:具有 Shortcut 属性的 QAction 不会显示在任何快捷菜单中,除非由 QAction::shortcutVisibleInContextMenu 属性特别设置。应在实例化 QCoreApplication 后设置此属性。
  • Qt::AA_NativeWindows:确保小部件具有系统原生风格的窗口。
  • Qt::AA_DontCreateNativeWidgetSiblings:确保原生小部件的兄弟窗口保持非原生,除非 Qt::WA_NativeWindow 属性特别设置。
  • Qt::AA_PluginApplication:表示用于编写插件。根据操作系统,它会抑制在插件情况下不一定有意义的特定初始化。将此属性设置为 true 也会将 AA_DontUseNativeMenuBar 属性设置为 true。它还禁用本机事件过滤器。该属性必须在 QGuiApplication 构造之前设置。
  • Qt::AA_DontUseNativeMenuBar:当此属性设置为 true 时创建的所有菜单栏都不会用作本机菜单栏(例如,macOS 上主屏幕顶部的菜单栏)。
  • Qt::AA_MacDontSwapCtrlAndMeta:macOS 上的键盘快捷键通常基于 Command(或 Cmd)键盘修饰符,由 ? 符号表示。例如,“复制”操作是 Command+C (?+C)。为了简化跨平台开发,Qt 默认将 Command 重新映射到 Qt::ControlModifier,以与其他平台保持一致。这允许创建键盘快捷键,例如“Ctrl+J”,然后在 macOS 上将映射到 Command+J,正如 macOS 用户所期望的那样。当此属性为 true 时,Qt 不会进行重新映射,按下 Command 修饰符将即触发 Qt::MetaModifier,而按下 Control 修饰符即触发 Qt::ControlModifier。
  • Qt::AA_Use96Dpi:假设屏幕的分辨率为 96 DPI,而不是使用操作系统提供的分辨率。这将导致字体渲染在设备上的每点像素中保持一致,而不是将 1 点定义为 1/72 英寸。
  • Qt::AA_SynthesizeTouchForUnhandledMouseEvents:所有未被应用程序接受的鼠标事件将被转换为触摸事件。
  • Qt::AA_SynthesizeMouseForUnhandledTouchEvents:应用程序不接受的所有触摸事件将被转换为鼠标左键事件。默认情况下启用此属性。
  • Qt::AA_ForceRasterWidgets:使顶级小部件使用纯光栅表面,并且不支持基于非原生 GL 的子小部件。
  • Qt::AA_UseDesktopOpenGL:在使用动态加载 OpenGL 实现的平台上强制使用桌面 OpenGL(例如,opengl32.dll 或 libGL.so)。必须在构造 QGuiApplication 之前设置此属性。
  • Qt::AA_UseOpenGLES:在使用动态加载 OpenGL 实现的平台上强制使用 OpenGL ES 2.0 或更高版本。必须在构造 QGuiApplication 之前设置此属性。
  • Qt::AA_UseSoftwareOpenGL:强制在使用 OpenGL 实现动态加载的平台上使用基于软件的 OpenGL 实现。必须在构造 QGuiApplication 之前设置此属性。
  • Qt::AA_ShareOpenGLContexts:启用 QOpenGLWidget 和 QQuickWidget 等类使用的 OpenGL 上下文之间的资源共享。这允许在属于不同顶级窗口的 QOpenGLWidget 实例之间共享 OpenGL 资源,如纹理。必须在构造 QGuiApplication 之前设置此属性。
  • Qt::AA_SetPalette:指示是否在 QGuiApplication 上明确设置了调色板。
  • Qt::AA_UseStyleSheetPropagationInWidgetStyles:默认情况下,Qt 样式表禁用常规 QWidget 调色板和字体传播。启用此标志后,字体和调色板更改会传播,就像用户手动调用了相应的 QWidget 方法一样。
  • Qt::AA_DontUseNativeDialogs:当此属性设置为 true 时创建的所有对话框都不会使用平台提供的原生对话框。
  • Qt::AA_SynthesizeMouseForUnhandledTabletEvents:应用程序不接受的所有平板事件将被转换为鼠标事件。默认情况下启用此属性。
  • Qt::AA_CompressHighFrequencyEvents:启用某些频繁事件的压缩。在 X11 窗口系统上,默认值为 true,这意味着当 QEvent::MouseMove、QEvent::TouchUpdate 以及窗口大小和位置的变化发生的频率超过应用程序处理它们的频率时,它们将被合并,因此它们不会不要在以后积累和压倒应用程序。在 Windows 8 及更高版本上,默认值也是 true,但它仅适用于触摸事件。鼠标和窗口事件不受此标志的影响。在其他平台上,默认值为 false。
  • Qt::AA_CompressTabletEvents:启用来自平板设备的输入事件压缩。请注意,要启用事件压缩,AA_CompressHighFrequencyEvents 必须为 true,并且此标志将前者扩展到平板电脑事件。目前支持 X11 窗口系统、Windows 8 及更高版本。默认值为 false。
  • Qt::AA_DontCheckOpenGLContextThreadAffinity:当使用 QOpenGLContext 使上下文变为当前时,不要检查 QOpenGLContext 对象的 QObject 线程亲和性是否与调用 makeCurrent() 的线程相同。
  • Qt::AA_DisableShaderDiskCache:禁用磁盘上着色器程序二进制文件的缓存。
  • Qt::AA_DisableSessionManager:禁用 QSessionManager。 默认情况下,Qt 将连接到支持平台上的 GUI 应用程序的运行会话管理器,使用会话管理器对于系统服务可能是多余的。 必须在构造 QGuiApplication 之前设置此属性。
  • Qt::AA_DisableNativeVirtualKeyboard:设置此属性后,当文本输入小部件在没有物理键盘的系统上获得焦点时,不会自动显示本机屏幕虚拟键盘。目前仅支持 Windows 平台。

【static】bool testAttribute(Qt::ApplicationAttribute attribute)

检测是否设置了属性。

23、【static】QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1)

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

  • QObject::tr() 更方便地提供了这个功能。
  • context 通常是类名,sourceText 是英文文本或简短的标识文本。
  • disambiguation 是一个标识字符串,用于在同一上下文中以不同角色使用相同 sourceText 时。

如果没有翻译文件在上下文中包含 sourceText 的翻译,则此函数返回与 sourceText 等效的 QString。

这个函数是线程安全的。

四、相关非成员

1、void qAddPostRoutine(QtCleanUpFunction ptr)

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

清理例程以它们添加的相反顺序被调用。

ptr 指定的函数不应接受任何参数,也不应返回任何内容。


例如:



对于应用程序或模块范围的清理,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()
{
// 在这里清理
}

private:
MyPrivateInitStuff(QObject *parent)
: QObject(parent)
{
// 在这里初始化
}

MyPrivateInitStuff *p;
};

这个函数是线程安全的。

2、void qRemovePostRoutine(QtCleanUpFunction ptr)

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

这个函数是线程安全的。

五、宏成员

1、Q_COREAPP_STARTUP_FUNCTION(QtStartUpFunction ptr)

添加将从 QCoreApplication 构造函数调用的全局函数。该宏通常用于为程序范围的功能初始化库,而不需要应用程序调用库进行初始化。

ptr 指定的函数不应接受任何参数,也不应返回任何内容。

例如:

// 一旦 QCoreApplication 存在就调用
static void preRoutineMyDebugTool()
{
MyDebugTool* tool = new MyDebugTool(QCoreApplication::instance());
QCoreApplication::instance()->installEventFilter(tool);
}

Q_COREAPP_STARTUP_FUNCTION(preRoutineMyDebugTool)

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

如果删除 QCoreApplication 并创建另一个 QCoreApplication ,将再次调用启动函数。

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

这个函数是可重入的。

2、Q_DECLARE_TR_FUNCTIONS(context)

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

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

如果想在不继承自 QObject 的类中使用 QObject::tr(),这个宏很有用。

此宏必须出现在类定义的最顶部。例如:

class MyMfcView : public CView
{
Q_DECLARE_TR_FUNCTIONS(MyMfcView)

public:
MyMfcView();
...
};

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

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:Qt资料领取(视频教程+文档+代码+项目实战)


原文链接:https://blog.csdn.net/kenfan1647/article/details/123468808

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: