QApplication 类

QApplication 类管理 GUI 应用程序的流程控制和主要设置。 更多...

头文件 #include <QApplication>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承 QGuiApplication

属性

公共函数

QApplication(int &argc, char **argv)
virtual~QApplication()
boolautoSipEnabled() const
QStringstyleSheet() const

重新实现公共函数

virtual boolnotify(QObject *receiver, QEvent *e) override

公共槽

voidaboutQt()
voidcloseAllWindows()
voidsetAutoSipEnabled(const bool enabled)
voidsetStyleSheet(const QString &sheet)

信号

voidfocusChanged(QWidget *old, QWidget *now)

静态公共成员

QWidget *activeModalWidget()
QWidget *activePopupWidget()
QWidget *activeWindow()
voidalert(QWidget *widget, int msec = 0)
QWidgetListallWidgets()
voidbeep()
intcursorFlashTime()
intdoubleClickInterval()
intexec()
QWidget *focusWidget()
QFontfont()
QFontfont(const QWidget *widget)
QFontfont(const char *className)
boolisEffectEnabled(Qt::UIEffect effect)
intkeyboardInputInterval()
Qt::NavigationModenavigationMode()
QPalettepalette(const QWidget *widget)
QPalettepalette(const char *className)
voidsetCursorFlashTime(int)
voidsetDoubleClickInterval(int)
voidsetEffectEnabled(Qt::UIEffect effect, bool enable = true)
voidsetFont(const QFont &font, const char *className = nullptr)
voidsetKeyboardInputInterval(int)
voidsetNavigationMode(Qt::NavigationMode mode)
voidsetPalette(const QPalette &palette, const char *className = nullptr)
voidsetStartDragDistance(int l)
voidsetStartDragTime(int ms)
voidsetStyle(QStyle *style)
QStyle *setStyle(const QString &style)
voidsetWheelScrollLines(int)
intstartDragDistance()
intstartDragTime()
QStyle *style()
QWidget *topLevelAt(const QPoint &point)
QWidget *topLevelAt(int x, int y)
QWidgetListtopLevelWidgets()
intwheelScrollLines()
QWidget *widgetAt(const QPoint &point)
QWidget *widgetAt(int x, int y)

重新实现保护函数

virtual boolevent(QEvent *e) override

详细描述

QApplication是QGuiApplication的特化,它为QWidget-based应用程序提供了一些功能。它处理小部件特有的初始化和终止。

对于任何使用Qt的GUI应用程序,无论是否有0个、1个、2个或更多窗口,都恰好有一个QApplication对象。对于非QWidget-based的Qt应用程序,请使用QGuiApplication代替,因为它不依赖于QtWidgets库。

一些GUI应用程序提供了特殊的批量模式,即提供要执行的任务的命令行参数,而不需要手动干预。在这样的非GUI模式中,通常实例化一个简单的QCoreApplication足以避免初始化图形用户界面所需的资源。下面的示例显示了如何动态创建适当的应用程序实例

QCoreApplication* createApplication(int &argc, char *argv[])
{
    for (int i = 1; i < argc; ++i) {
        if (!qstrcmp(argv[i], "-no-gui"))
            return new QCoreApplication(argc, argv);
    }
    return new QApplication(argc, argv);
}

int main(int argc, char* argv[])
{
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv));

    if (qobject_cast<QApplication *>(app.data())) {
       // start GUI version...
    } else {
       // start non-GUI version...
    }

    return app->exec();
}

可以通过instance()函数访问QApplication对象,该函数返回一个与全局qApp指针等效的指针。

QApplication的主要职责包括

  • 它以用户的桌面设置初始化应用程序,如palette()、font()和doubleClickInterval()。如果用户通过某种控制面板全局更改这些设置,它会跟踪这些属性。
  • 它执行事件处理,即从底层窗口系统中接收事件并将它们调度到相关的窗口小部件。通过使用sendEvent()和postEvent()你可以向小部件发送自己的事件。
  • 它解析常见的命令行参数并根据需要设置其内部状态。有关详细信息,请参阅下面的构造函数文档。
  • 它定义应用程序的外观和感受,这被封装在一个QStyle对象中。这可以通过setStyle()在运行时进行更改。
  • 它通过translate() 提供对用户可见的字符串的本地化。
  • 它还提供一些神奇的对象,例如 剪贴板
  • 它了解应用程序的窗口。您可以使用 widgetAt() 查询某个位置上的小部件,获取 topLevelWidgets() 和 closeAllWindows() 的列表等。
  • 它管理应用程序的鼠标光标处理,见 setOverrideCursor()。

由于 QApplication 对象进行了大量初始化,它必须在创建与用户界面相关的任何其他对象之前创建。QApplication 还处理常见的命令行参数。因此,在应用程序中本身对 argv 进行任何解释或修改之前创建 QApplication 通常是一个好主意。

另请参阅QCoreApplicationQAbstractEventDispatcherQEventLoopQSettings

属性文档

autoSipEnabled : bool

切换自动 SIP(软件输入板)的可见性

将此属性设置为true,以自动显示SIP,当进入接受键盘输入的小部件时。此属性仅影响设置了WA_InputMethodEnabled属性的部件,通常用于在几乎没有按键的设备上启动虚拟键盘。

此属性仅影响使用软件输入板的平台。

默认值取决于平台。

访问函数

boolautoSipEnabled() const
voidsetAutoSipEnabled(const bool enabled)

cursorFlashTime : int

此属性保存文本光标的闪烁(闪烁)时间(毫秒)

闪烁时间是指显示、反转和恢复插入符显示的时间。通常文本光标显示为光标闪烁时间的一半,然后隐藏相同的时间,但这也可能有所不同。

X11的默认值为1000毫秒。在Windows中,使用的是控制面板值,并设置此属性将设置所有应用程序的光标闪烁时间。

我们建议小部件不要缓存此值,因为如果用户更改全局桌面设置,它可能随时更改。

注意:此属性可能包含负值,例如在禁用光标闪烁时。

访问函数

intcursorFlashTime()
voidsetCursorFlashTime(int)

doubleClickInterval : int

此属性保存将双击与连续鼠标单击区分开的时间限制(毫秒)

X11的默认值为400毫秒。在Windows和Mac OS上使用操作系统值。

访问函数

intdoubleClickInterval()
voidsetDoubleClickInterval(int)

keyboardInputInterval : int

此属性保存将一次按键与连续按键区分开的时间限制(毫秒)

X11的默认值为400毫秒。在Windows和Mac OS上使用操作系统值。

访问函数

intkeyboardInputInterval()
voidsetKeyboardInputInterval(int)

startDragDistance : int

此属性保存启动拖放操作所需的最小距离。

如果您支持您的应用程序中的拖放,并希望用户按下按钮并移动鼠标一定距离后启动拖放操作,请使用此属性值作为所需的最低距离。

例如,如果单击的鼠标位置存储在startPos中,并且当前位置(例如,在鼠标移动事件中)是currentPos,则可以使用如下代码检查是否应启动拖放

if ((startPos - currentPos).manhattanLength() >=
        QApplication::startDragDistance())
    startTheDrag();

Qt内部使用此值,例如在QFileDialog中使用。

默认值(如果平台没有提供不同的默认值)为10像素。

访问函数

intstartDragDistance()
voidsetStartDragDistance(int l)

另请参阅:startDragTime(),QPoint::manhattanLength(),以及拖放

startDragTime : int

此属性保存在开始拖放操作之前必须按下鼠标按钮的时间(毫秒)

如果您支持您的应用程序中的拖放,并希望在用户按下鼠标按钮一段时间后启动拖放操作,则应使用此属性的值作为延迟。

Qt还内部使用此延迟,例如在QTextEditQLineEdit中开始拖放。

默认值为500毫秒。

访问函数

intstartDragTime()
voidsetStartDragTime(int ms)

另请参阅:startDragDistance()和拖放

styleSheet : QString

此属性持有应用程序样式表

默认情况下,除非用户在运行应用程序时指定了命令行上的-stylesheet选项,否则此属性返回空字符串。

访问函数

QStringstyleSheet() const
voidsetStyleSheet(const QString &sheet)

另请参阅QWidget::setStyle()和Qt样式表

wheelScrollLines : int

当鼠标滚轮旋转时,此属性持有滚动小部件的行数。

如果值超过小部件的可见行数,则小部件应将滚动操作解释为单一的向上翻页向下翻页。如果小部件是项视图类,则滚动一的结果取决于小部件的滚动模式设置。滚动一可能意味着滚动一个项滚动一个像素

默认情况下,此属性值为3。

访问函数

intwheelScrollLines()
voidsetWheelScrollLines(int)

另请参阅QStyleHints::wheelScrollLines

成员函数文档

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

初始化窗口系统和使用argc命令行参数在argv中构建应用程序对象。

警告:引用argcargv的数据必须在QApplication对象整个生存期内有效。此外,argc必须大于零,且argv必须包含至少一个有效的字符字符串。

全局qApp指针指向此应用程序对象。应只创建一个应用程序对象。

必须在创建任何绘图设备(包括小部件、位图、位图等)之前构建此应用程序对象。

注意:argcargv可能会更改,因为Qt删除了它识别的命令行参数。

所有Qt程序自动支持以下命令行选项

  • -style= style,设置应用程序GUI样式。可能值取决于您的系统配置。如果您与附加样式编译了Qt或具有作为插件的附加样式,则这些样式将作为-style命令行选项可用。您还可以通过设置QT_STYLE_OVERRIDE环境变量为所有Qt应用程序设置样式。
  • -style style,与上面列出的一样。
  • -stylesheet= stylesheet,设置应用程序样式表。值必须是包含样式表的文件路径。

    注意:样式表文件中的相对URL相对于样式表文件的路径。

  • -stylesheet stylesheet,与上面列出的一样。
  • -widgetcount,在结束时打印有关未销毁的小部件数量和同一时间存在的小部件最大数量的调试信息
  • -reverse,将应用程序的布局方向设置为Qt::RightToLeft
  • -qmljsdebugger=,使用指定的端口激活QML/JS调试器。值必须是格式为port:1234[,block]的格式,其中block是可选的,将使应用程序等待直到调试器连接到它。

另请参阅:QCoreApplication::arguments.

[虚函数 noexcept] QApplication::~QApplication()

清理由该应用程序分配的任何窗口系统资源。将全局变量 qApp 设置为 nullptr

[静态槽] void QApplication::aboutQt()

显示有关 Qt 的简单消息框。消息包括应用程序正在使用的 Qt 版本号。

这对于包括在应用程序的 帮助 菜单中很有用,如 菜单 示例所示。

该函数是 QMessageBox::aboutQt 的便利槽。

[静态] QWidget *QApplication::activeModalWidget()

返回活动模态控件。

模态控件是一种特殊的顶层控件,是其构造函数中指定模态参数为 True 的 QDialog 子类。在使用其他程序部分之前,必须在关闭模态控件之后才能继续。

模态控件以堆栈形式组织。此函数返回堆栈顶部的活动模态控件。

另请参阅:activePopupWidget() 以及 topLevelWidgets.

[静态] QWidget *QApplication::activePopupWidget()

返回活动弹出控件。

弹出控件是一种特殊的顶层控件,它设置了 Qt::WType_Popup 控件标志,例如 QMenu 控件。当应用程序打开弹出控件时,所有事件都发送到弹出控件。在关闭弹出控件之前,无法访问普通控件和模态控件。

在显示弹出控件时,只能打开其他弹出控件。弹出控件以堆栈形式组织。此函数返回堆栈顶部的活动弹出控件。

另请参阅:activeModalWidget() 以及 topLevelWidgets.

[静态] QWidget *QApplication::activeWindow()

返回具有键盘输入焦点的应用程序顶层窗口,或者如果没有应用程序窗口有焦点,则为 nullptr。即使没有 focusWidget(),可能也会存在 activeWindow(),例如,如果该窗口中的控件不接受按键事件。

另请参阅:QWidget::setFocus(),QWidget::hasFocus() 以及 focusWidget

[静态] void QApplication::alert(QWidget *widget, int msec = 0)

如果窗口不是活动窗口,则导致显示 widget 的警告。警告显示 msec 毫秒。如果 msec 为零(默认值),则警告将无限期显示,直到窗口再次变为活动窗口。

当前该函数在 Qt for Embedded Linux 上不执行任何操作。

在 macOS 上,该功能更多地工作在应用程序级别,将导致应用程序图标在 dock 中跳动。

在Windows上,这将导致窗口任务栏条目闪烁一段时间。如果 msec 为零,闪烁将停止,任务栏条目将变为不同的颜色(目前为橙色)。

在X11上,这将导致窗口被标记为“需要注意”,窗口必须不可见(即不可调用 hide(),但以某种方式可见)才能正常工作。

[静态] QWidgetList QApplication::allWidgets()

返回应用程序中所有小部件的列表。

如果没有小部件,列表为空(《QList::isEmpty》)。

注意:一些小部件可能是隐藏的。

示例

void updateAllWidgets()
{
    const QWidgetList allWidgets = QApplication::allWidgets();
    for (QWidget *widget : allWidgets)
        widget->update();
}

另请参阅:topLevelWidgets() 和 QWidget::isVisible

[静态] void QApplication::beep()

以默认音量和声音发出铃声。该函数在Qt for Embedded Linux中不可用。

[静态槽] void QApplication::closeAllWindows()

关闭所有顶层窗口。

此函数特别适用于具有许多顶层窗口的应用程序。

窗口将以随机顺序关闭,直到有一个窗口不接受关闭事件。当最后一个窗口成功关闭时,应用程序退出,除非将 quitOnLastWindowClosed 设置为 false。要从菜单等触发应用程序终止,请使用 QCoreApplication::quit() 而不是此函数。

另请参阅:quitOnLastWindowClosedlastWindowClosedQWidget::closeQWidget::closeEventlastWindowClosedQCoreApplication::quittopLevelWidgetsQWidget::isWindow

[重写虚受保护] bool QApplication::event(QEvent *e)

重写: QGuiApplication::event(QEvent *e)。

[静态] int QApplication::exec()

进入主事件循环,直到调用 exit() 后返回之前设置的 exit() 值(如果通过 quit() 调用,则为 0)。

调用此函数是处理事件所必需的。主事件循环从窗口系统接收事件并将这些事件分发给应用程序小部件。

通常,在调用 exec() 之前,不能进行用户交互。作为一个特殊情况,在调用 exec() 之前可以使用的模态小部件(如《QMessageBox》)可以调用 exec() 来启动本地事件循环。

要使您的应用程序执行空闲处理,即在没有任何挂起事件时执行特殊功能,请使用超时为 0 的 QTimer。更高级的空闲处理方案可以使用 processEvents 实现。

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

另请参阅 quitOnLastWindowClosedQCoreApplication::quitQCoreApplication::exitQCoreApplication::processEventsQCoreApplication::exec

[signal] void QApplication::focusChanged(QWidget *old, QWidget *now)

当具有键盘焦点的控件从 old 变为 now 时,将发出此信号,即用户按了制表键、点击了控件或切换了活动窗口。这两个 oldnow 都可以是 nullptr

信号在通知两个控件通过 QFocusEvent 发生变化之后发出。

另请参阅 QWidget::setFocusQWidget::clearFocusQt::FocusReason

[static] QWidget *QApplication::focusWidget()

返回具有键盘输入焦点的应用程序控件,如果没有控件在此应用程序中具有焦点,则返回 nullptr

另请参阅 QWidget::setFocusQWidget::hasFocusactiveWindowfocusChanged

[static] QFont QApplication::font()

返回默认应用程序字体。

另请参阅 setFontfontMetricsQWidget::font

[static] QFont QApplication::font(const QWidget *widget)

这是一个重载函数。

返回 widget 的默认字体。如果没有为 widget 的类注册默认字体,则返回它最近注册的超级类的默认字体。

另请参阅 fontMetricssetFontQWidget::setFont

[static] QFont QApplication::font(const char *className)

这是一个重载函数。

返回给定 className 控件的字体。

另请参阅 setFont() 和 QWidget::font

[static] bool QApplication::isEffectEnabled(Qt::UIEffect effect)

如果 效果 已启用,则返回 true;否则返回 false

默认情况下,Qt 会尝试使用桌面设置。为了防止这种情况,请调用 setDesktopSettingsAware(false)。

注意:在运行位深小于 16 位的屏幕上,所有效果都被禁用。

另请参阅:setEffectEnabled() 和 Qt::UIEffect

返回 Qt 所使用的焦点导航类型。

此功能仅适用于 Qt for Embedded Linux。

另请参阅:setNavigationMode

[重写虚拟] bool QApplication::notify(QObject *receiver, QEvent *e)

重实现: QGuiApplication::notify(QObject *object, QEvent *event)。

[静态] QPalette QApplication::palette(const QWidget *widget)

如果传递了 小部件,则返回该小部件类的默认调色板。这可能或可能不是应用程序调色板。在大多数情况下,没有针对特定类型的小部件的特殊调色板,但一个值得注意的例外是在 Windows 下,如果用户在显示设置中已为菜单定义了特殊背景颜色,则弹出菜单。

另请参阅:setPaletteQWidget::palette

[静态] QPalette QApplication::palette(const char *className)

这是一个重载函数。

返回给定 className 的控件调色板。

另请参阅:setPaletteQWidget::palette

[静态] void QApplication::setEffectEnabled(Qt::UIEffect effect, bool enable = true)

如果 enable 为真,则启用 UI 效果 effect,否则不会使用该效果。

注意:在运行位深小于 16 位的屏幕上,所有效果都被禁用。

另请参阅:isEffectEnabledQt::UIEffectsetDesktopSettingsAware

[静态] void QApplication::setFont(const QFont &font, const char *className = nullptr)

将默认应用程序字体更改为 font。如果传递了 className,则更改仅适用于继承自 className(如QObject::inherits)的类。

在应用程序启动时,默认字体取决于窗口系统。它可以根据窗口系统版本和区域设置而变化。此函数允许您覆盖默认字体;但覆盖可能不是一个好主意,因为例如,某些区域设置需要较大的字体来支持其特殊字符。

警告:请勿将此函数与 Qt 样式表 一起使用。应用程序的字体可以通过使用 "font" 样式表属性进行自定义。要为所有 QPushButtons 设置粗体字体,将应用程序 styleSheet() 设置为 "QPushButton { font: bold }"。

另请参阅 font()、fontMetrics() 和 QWidget::setFont()。

[静态] void QApplication::setNavigationMode(Qt::NavigationMode mode)

设置Qt应使用的焦点导航类型为mode

此功能仅适用于 Qt for Embedded Linux。

另请参阅 navigationMode()。

[静态] void QApplication::setPalette(const QPalette &palette, const char *className = nullptr)

将应用程序调色板更改为palette

如果传递了className,则更改仅应用于继承自className(如QObject::inherits()所报告的)的小部件。如果将className留下为0,则更改会影响所有小部件,从而覆盖任何之前设置的类特定调色板。

调色板可以根据当前GUI样式在QStyle::polish()中更改。

警告: 不要与Qt样式表一起使用此函数。在使用样式表时,可以使用“color”、“background-color”、“selection-color”、“selection-background-color”和“alternate-background-color”来定制小部件的调色板。

注意: 某些样式不使用调色板进行所有绘图,例如,如果它们使用原生主题引擎。Windows Vista和macOS样式就是这种情况。

另请参阅 QWidget::setPalette()、palette() 和 QStyle::polish()。

[静态] QStyle *QApplication::setStyle(QStyle *style)

将应用程序的GUI样式设置为style。样式对象的所属权转移到QApplication,因此当应用程序退出或设置新样式而旧样式仍然是应用程序对象的父级时,QApplication将删除样式对象。

示例用法

QApplication::setStyle(QStyleFactory::create("Fusion"));

在切换应用程序样式时,颜色调色板将恢复到初始颜色或系统默认值。由于某些样式需要调整颜色调色板以符合样式指南,因此这是必要的。

在设置调色板之前设置样式,即在新QApplication创建之前,将导致应用程序使用QStyle::standardPalette()作为调色板。

警告: 当前不支持自定义QStyle子类的Qt样式表。我们计划在未来某个版本中解决这个问题。

另请参阅 style()、QStylesetPalette() 和 desktopSettingsAware()。

[静态] QStyle *QApplication::setStyle(const QString &style)

这是一个重载函数。

QStyleFactory请求用于styleQStyle对象。

该字符串必须是QStyleFactory::keys之一,通常是"windows"、"windowsvista"、"fusion"或"macos"。样式名称不区分大小写。

如果传递了未知style,则返回nullptr,否则返回的QStyle对象将设置为应用程序的GUI样式。

警告: 为确保应用程序的样式设置正确,如果可能,最好在QApplication构造函数之前调用此函数。

[静态] QStyle *QApplication::style()

返回应用程序的样式对象。

另请参阅 setStyle()和QStyle

[静态] QWidget *QApplication::topLevelAt(const QPoint &point)

返回给定处的顶层窗口;如果没有这样的窗口,则返回nullptr

[静态] QWidget *QApplication::topLevelAt(int x, int y)

这是一个重载函数。

返回点(《i translate="no">x,y)处的顶层窗口;如果没有这样的窗口,则返回0。

[静态] QWidgetList QApplication::topLevelWidgets()

返回应用程序中所有顶层窗口(窗口)的列表。

注意: 某些顶层窗口可能已被隐藏,例如,如果没有显示工具提示,则隐藏工具提示。

示例

void showAllHiddenTopLevelWidgets()
{
    const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();
    for (QWidget *widget : topLevelWidgets) {
        if (widget->isHidden())
            widget->show();
    }
}

另请参阅 allWidgets(),QWidget::isWindow()和QWidget::isHidden

[静态] QWidget *QApplication::widgetAt(const QPoint &point)

返回全局屏幕位置point处的窗口,或如果没有面对Qt窗口,则返回nullptr

此函数可能较慢。

另请参阅 QCursor::pos(),QWidget::grabMouse()和QWidget::grabKeyboard

[静态] QWidget *QApplication::widgetAt(int x, int y)

这是一个重载函数。

返回全局屏幕位置(xy)处的窗口,或如果没有面对Qt窗口,则返回nullptr

宏文档

qApp

一个全局指针,指向唯一的对象。它与QCoreApplication::instance()等效,但作为QApplication指针转换为,因此仅在唯一的对象是一个QApplication时才有效。

另请参阅 QCoreApplication::instance()和qGuiApp

© 2024 Qt公司有限公司。本文件中包含的文档贡献属于他们各自的所有权。提供的文档受GNU自由文档许可协议版本1.3的条款约束,由自由软件基金会发布。Qt及其徽标是芬兰和/或全球其他地区的商标,所有其他商标均归其各自所有者所有。