QApplication

一、描述

QApplication 专门为 QGuiApplication 提供了一些基于 QWidget 的应用程序所需的功能。

一些 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() 提供对用户可见的字符串的本地化。
  • 它提供了一些神奇的对象,例如 clipboard()。
  • 它知道应用程序的窗口。可以使用 widgetAt() 来询问哪个小部件在某个位置,获取topLevelWidgets() 和 closeAllWindows() 的列表等。
  • 它管理应用程序的鼠标光标处理。

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

二、属性成员

1、autoSipEnabled : bool

切换自动 SIP(软件输入面板)可见性。默认值取决于平台。

将此属性设置为 true 以在输入接受键盘输入的小部件时自动显示 SIP。此属性仅影响具有 WA_InputMethodEnabled 属性集的小部件,通常用于在键很少或没有键的设备上启动虚拟键盘。

该属性仅对使用软件输入面板的平台有影响。

2、cursorFlashTime : int

文本光标的闪烁时间(以毫秒为单位)

闪烁时间是显示、反转和恢复插入符号显示所需的时间。通常文本光标会显示一半的光标闪烁时间,然后隐藏相同的时间。

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

如果禁用了光标闪烁则此属性可能为负值。

3、doubleClickInterval : int

以毫秒为单位的时间限制,用于区分双击和连续两次鼠标单击。

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

4、keyboardInputInterval : int

以毫秒为单位的将按键与两次连续按键区分开来的时间限制。

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

5、startDragDistance : int

开始拖放操作所需的最小距离。

如果应用程序支持拖放,并且希望在用户按住按钮将光标移动一定距离后开始拖放操作,则应使用此属性的值作为所需的最小距离。

例如,如果单击的鼠标位置存储在 startPos 中,并且当前位置(例如在鼠标移动事件中)是 currentPos,可以使用如下代码确定是否应该开始拖动:

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

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

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

6、startDragTime : int

在拖放操作开始之前必须按住鼠标按钮的时间(以毫秒为单位)。默认值为 500 毫秒。

如果应用程序支持拖放,并且希望在用户按住鼠标按钮一定时间后开始拖放操作,则应该使用此属性的值作为延迟。

Qt 也在内部使用这种延迟,例如 在 QTextEdit 和 QLineEdit 中,用于开始拖动。

7、styleSheet : QString

应用程序样式表。

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

8、wheelScrollLines : int

当鼠标滚轮旋转时,此属性保存滚动小部件的行数。默认为 3。

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

三、成员函数

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

初始化窗口系统并使用 argv 中的 argc 命令行参数构造一个应用程序对象。

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

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

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

2、【static】void aboutQt()

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

这对于包含在应用程序的帮助菜单中很有用,

这个函数是 QMessageBox::aboutQt() 的一个便利槽。

3、【static】void closeAllWindows()

关闭所有顶层窗口。

窗口以随机顺序关闭,直到一个窗口不接受关闭事件。应用程序在最后一个窗口成功关闭时退出,除非 quitOnLastWindowClosed 设置为 false。

4、【信号】void focusChanged(QWidget *old, QWidget *now)

当具有键盘焦点的小部件从 old 更改为 now 时,会发出此信号,如用户按下了 tab 键,单击了小部件或更改了活动窗口。old 和 now 都可以是 nullptr。

在通过 QFocusEvent 通知两个小部件有关更改后发出信号。

    【static】QWidget *focusWidget()

返回具有键盘输入焦点的应用程序小部件。

5、【static】QWidget * activeModalWidget()

返回活动的模态小部件。

模态小部件组织在一个堆栈中。此函数返回堆栈顶部的活动模态小部件。

6、【static】QWidget * activePopupWidget()

返回活动的弹出窗口小部件。

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

显示弹出窗口小部件时,只能打开其他弹出窗口小部件。 弹出窗口小部件组织在一个堆栈中。 此函数返回堆栈顶部的活动弹出窗口小部件。

7、【static】QWidget * activeWindow()

返回具有键盘输入焦点的应用程序顶级窗口,如果没有应用程序窗口具有焦点,则返回 nullptr。 即使没有 focusWidget(),也可能存在 activeWindow(),例如,如果该窗口中没有小部件接受键事件。

      【static】void setActiveWindow(QWidget *active)

将活动窗口设置为活动小部件以响应系统事件。该函数从平台特定的事件处理程序中调用。

此函数不会将键盘焦点设置为活动小部件,应调用 QWidget::activateWindow() 。

它设置 activeWindow() 和 focusWidget() 属性,并向所有适当的小部件发送适当的 WindowActivate/WindowDeactivate FocusIn/FocusOut 事件。然后窗口将被绘制为活动状态(例如,行编辑中的光标将闪烁),并且将启用工具提示。

8、【static】void alert(QWidget *widget, int msec = 0)

如果窗口不是活动窗口,则为小部件显示警报。警报显示为 msec 毫秒。 如果毫秒为零(默认值),则警报将无限期显示,直到窗口再次变为活动状态。

9、【static】QWidgetList allWidgets()

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

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

      【static】QWidgetList topLevelWidgets()

返回应用程序中顶级小部件(窗口)的列表。 

10、【static】void beep()

使用默认音量和声音响铃。

11、【static】int exec()

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

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

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

要使的应用程序执行空闲操作(当没有正在排队等待执行的事件才会处理的操作)请使用具有 0 超时的 QTimer。使用 processEvents() 可以实现更高级的空闲处理方案。

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

12、【static】QFont font()

返回默认的应用程序字体。

       【static】QFont font(const QWidget *widget)

返回小部件的默认字体。如果没有为小部件的类注册默认字体,它将返回其最近注册的超类的默认字体。

       【static】QFont font(const char *className)

返回给定类名的小部件的字体。

      【static】void setFont(const QFont &font, const char *className = nullptr)

设置默认应用程序字体。如果传递了 className,则更改仅适用于继承 className 的类(由 QObject::inherits() 报告)。

在应用程序启动时,默认字体取决于窗口系统。它可能因窗口系统版本和语言环境而异。 此功能可覆盖默认字体;但是覆盖可能不是一个好主意,比如某些语言环境需要超大字体来支持其特殊字符。

警告:不要将此函数与 Qt 样式表一起使用。

13、【static】bool isEffectEnabled(Qt::UIEffect effect)

        【static】void setEffectEnabled(Qt::UIEffect effect, bool enable = true)

是否启用UI效果。

enum Qt::UIEffect:此枚举描述了可用的 UI 效果。

  • Qt::UI_AnimateMenu:显示动画菜单。
  • Qt::UI_FadeMenu:显示褪色菜单。
  • Qt::UI_AnimateCombo:显示动画组合框。
  • Qt::UI_AnimateTooltip:显示工具提示动画。
  • Qt::UI_FadeTooltip:显示工具提示渐变效果。
  • Qt::UI_AnimateToolBox:保留

默认情况下,Qt 将尝试为每个效果使用平台特定的桌面设置。 使用 setDesktopSettingsAware(false) 来防止这种情况,使用 setEffectEnabled(true) 来启用或禁用特定效果。

在低于 16 位色深的屏幕上会禁用所有效果。

14、【static】Qt::NavigationMode navigationMode()

        【static】void setNavigationMode(Qt::NavigationMode mode)

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

enum Qt::NavigationMode:此枚举类型描述了移动焦点的模式。

  • Qt::NavigationModeNone:仅使用触摸屏。
  • Qt::NavigationModeKeypadTabOrderQt::Key_Up Qt::Key_Down 用于改变焦点。
  • Qt::NavigationModeKeypadDirectionalQt::Key_UpQt::Key_DownQt::Key_LeftQt::Key_Right 用于改变焦点。
  • Qt::NavigationModeCursorAuto:鼠标光标用于改变焦点,它只显示在非触摸屏设备上。 键盘用于实现虚拟光标,除非设备具有模拟鼠标类型的输入设备(例如触摸板)。 对于需要在触摸和非触摸设备上进行指针控制的应用程序(例如 Web 浏览器),这是推荐的设置。
  • Qt::NavigationModeCursorForceVisible:鼠标光标用于改变焦点,无论设备类型如何都会显示。键盘用于实现虚拟光标,除非设备具有模拟鼠标类型的输入设备(例如触摸板)

15、【static】QPalette palette(const QWidget *widget)

返回该小部件的默认调色板。

      【static】QPalette palette(const char *className)

返回给定类名的小部件的调色板。

      【static】void setPalette(const QPalette &palette, const char *className = nullptr)

设置应用程序调色板。

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

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

警告:不要将此函数与 Qt 样式表一起使用。

16、【static】void setStyle(QStyle *style) / 【static】QStyle * style()

设置应用程序的 GUI 样式。样式对象的所有权转移给 QApplication,因此 QApplication 将在应用程序退出或设置新样式并且旧样式仍然是应用程序对象的父对象时删除样式对象。

示例用法:

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

切换应用程序样式时,调色板设置回初始颜色或系统默认值。这是必要的,因为某些样式必须调整调色板以完全符合样式指南。

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

      【static】QStyle * setStyle(const QString &style)

QStyleFactory 请求一个 QStyle 对象的样式。

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

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

为确保应用程序的样式设置正确,最好在 QApplication 构造函数之前调用此函数。

17、【static】QWidget * topLevelAt(const QPoint &point)

        【static】QWidget * topLevelAt(int x, int y)

返回给定点的顶级小部件。

18、【static】QWidget * widgetAt(const QPoint &point)

        【static】QWidget * widgetAt(int x, int y)

返回全局屏幕位置点的小部件。此功能可能很慢。

四、宏成员

1、qApp

指向唯一应用程序对象的全局指针。 它等价于 QCoreApplication::instance(),但转换为 QApplication 指针,因此仅在唯一应用程序对象是 QApplication 时有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值