QApplication 类管理 GUI 应用程序的控制流和主要设置。 更多...
头: | #include <QApplication> |
CMake: |
find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
继承: | QGuiApplication |
|
|
QApplication (int & argc , char ** argv ) | |
virtual | ~QApplication () |
bool | autoSipEnabled () const |
QString | styleSheet () const |
virtual bool | notify (QObject * receiver , QEvent * e ) override |
void | aboutQt () |
void | closeAllWindows () |
void | setAutoSipEnabled (const bool enabled ) |
void | setStyleSheet (const QString & sheet ) |
void | focusChanged (QWidget * old , QWidget * now ) |
QWidget * | activeModalWidget () |
QWidget * | activePopupWidget () |
QWidget * | activeWindow () |
void | alert (QWidget * widget , int msec = 0) |
QWidgetList | allWidgets () |
void | beep () |
int | cursorFlashTime () |
int | doubleClickInterval () |
int | exec () |
QWidget * | focusWidget () |
QFont | font () |
QFont | font (const QWidget * widget ) |
QFont | font (const char * className ) |
bool | isEffectEnabled (Qt::UIEffect effect ) |
int | keyboardInputInterval () |
Qt::NavigationMode | navigationMode () |
QPalette | palette (const QWidget * widget ) |
QPalette | palette (const char * className ) |
void | setCursorFlashTime (int) |
void | setDoubleClickInterval (int) |
void | setEffectEnabled (Qt::UIEffect effect , bool enable = true) |
void | setFont (const QFont & font , const char * className = nullptr) |
void | setKeyboardInputInterval (int) |
void | setNavigationMode (Qt::NavigationMode mode ) |
void | setPalette (const QPalette & palette , const char * className = nullptr) |
void | setStartDragDistance (int l ) |
void | setStartDragTime (int ms ) |
void | setStyle (QStyle * style ) |
QStyle * | setStyle (const QString & style ) |
void | setWheelScrollLines (int) |
int | startDragDistance () |
int | startDragTime () |
QStyle * | style () |
QWidget * | topLevelAt (const QPoint & point ) |
QWidget * | topLevelAt (int x , int y ) |
QWidgetList | topLevelWidgets () |
int | wheelScrollLines () |
QWidget * | widgetAt (const QPoint & point ) |
QWidget * | widgetAt (int x , int y ) |
virtual bool | event (QEvent * e ) override |
qApp |
QApplication 专攻 QGuiApplication 具有一些所需功能对于 QWidget 基应用程序。它处理 Widget 特定初始化、定稿。
对于使用 QT 的任何 GUI 应用程序,准确存在 one QApplication 对象,无论应用程序在任何给定时间是否拥有 0 个、1 个、2 个或更多个窗口。对于非 QWidget 基 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(); }
QApplication 对象可访问透过 instance () 函数返回的指针等效于全局 qApp 指针。
QApplication 主要负责的领域:
由于 QApplication 对象会做如此多的初始化,它
must
被创建,在创建用户界面相关的任何其它对象之前。QApplication 还处理常见命令行自变量。因此,创建它通常是一个好主意
before
任何解释或修改对于
argv
的履行在应用程序本身。
函数组 | |
---|---|
系统设置 | desktopSettingsAware (), setDesktopSettingsAware (), cursorFlashTime (), setCursorFlashTime (), doubleClickInterval (), setDoubleClickInterval (), setKeyboardInputInterval (), wheelScrollLines (), setWheelScrollLines (), palette (), setPalette (), font (), setFont (), fontMetrics(). |
事件处理 | exec (), processEvents (), exit (), quit (). sendEvent (), postEvent (), sendPostedEvents (), removePostedEvents (), notify (). |
GUI 样式 | style (), setStyle (). |
文本处理 | installTranslator (), removeTranslator () translate (). |
小部件 | allWidgets (), topLevelWidgets (), activePopupWidget (), activeModalWidget (), clipboard (), focusWidget (), activeWindow (), widgetAt (). |
高级光标处理 | overrideCursor (), setOverrideCursor (), restoreOverrideCursor (). |
杂项 | closeAllWindows (), startingUp (), closingDown (). |
另请参阅 QCoreApplication , QAbstractEventDispatcher , QEventLoop ,和 QSettings .
切换自动 SIP (软件输入面板) 可见性
把此特性设为
true
以自动显示 SIP 当整个 Widget 接受键盘输入时。此特性仅影响有设置 WA_InputMethodEnabled 属性的 Widget,且通常用于在拥有很少键 (或没有键) 的设备中发起虚拟键盘。
此特性仅对使用软件输入面板的平台有影响。
默认从属平台。
访问函数:
bool | autoSipEnabled () const |
void | setAutoSipEnabled (const bool enabled ) |
此特性保持文本光标的刷新 (眨眼) 时间,以毫秒为单位
闪烁时间是显示、反转和还原插入符号显示要求的时间。通常,文本光标的显示为光标闪烁时间的一半,接着隐藏为相同时间数,但这可能有所不同。
在 X11 默认值为 1000 毫秒。在 Windows, Control Panel 值被使用且设置此特性将设置所有应用程序的光标闪烁时间。
推荐 Widget 不要缓存此值,因为它可能随时更改,若用户更改全局桌面设置。
注意: 此特性可以保持负值,例如:若光标眨眼被禁用。
访问函数:
int | cursorFlashTime () |
void | setCursorFlashTime (int) |
此特性保持的时间限制 (以毫秒为单位) 用于区分双击和连续 2 次鼠标点击
在 X11 默认值为 400 毫秒。在Windows 和 Mac OS 使用操作系统的值。
访问函数:
int | doubleClickInterval () |
void | setDoubleClickInterval (int) |
此特性以毫秒为单位保持 (区分键按下和两次连续键按下的) 时间限制
在 X11 默认值为 400 毫秒。在Windows 和 Mac OS 使用操作系统的值。
访问函数:
int | keyboardInputInterval () |
void | setKeyboardInputInterval (int) |
此特性保持开始拖放操作要求的最小距离。
若应用程序支持拖放,且想要开始拖放操作在用户有按下按钮将光标移动一定距离后,应使用此特性值作为最小要求距离。
例如,若将点击鼠标位置存储在
startPos
且当前位置 (如:在鼠标移动事件中) 为
currentPos
, 可以找出是否应采用像这样的代码启动拖曳:
if ((startPos - currentPos).manhattanLength() >= QApplication::startDragDistance()) startTheDrag();
Qt 使用此值在内部,如在 QFileDialog .
默认值 (若平台没有提供不同默认值) 为 10 像素。
访问函数:
int | startDragDistance () |
void | setStartDragDistance (int l ) |
另请参阅 startDragTime (), QPoint::manhattanLength (),和 拖放 .
此特性保持必须保持鼠标按钮按下的时间 (以毫秒为单位),在开始拖放操作之前
若应用程序支持拖放,且想要开始拖放操作在用户有按下鼠标按钮一定时间后,应使用此特性值作为延迟。
Qt 内部也使用此延迟,如在 QTextEdit and QLineEdit ,为开始拖曳。
默认值为 500 毫秒。
访问函数:
int | startDragTime () |
void | setStartDragTime (int ms ) |
另请参阅 startDragDistance () 和 拖放 .
此特性保持应用程序样式表
默认情况下,此特性返回空字符串除非用户指定
-stylesheet
选项在命令行当运行应用程序时。
访问函数:
QString | styleSheet () const |
void | setStyleSheet (const QString & sheet ) |
另请参阅 QWidget::setStyle () 和 Qt 样式表 .
此特性保持 Widget 要卷动的行数,当鼠标滚轮旋转时。
若值超过 Widget 可见行数,Widget 应将卷动操作解释成单 page up or page down 。若 Widget 是 项视图类 ,那么导致卷动一 line 从属小部件的设置 卷动模式 。卷动一 line 可以意味着 卷动 1 项 or 卷动 1 像素 .
默认情况下,此属性拥有 3 值。
访问函数:
int | wheelScrollLines () |
void | setWheelScrollLines (int) |
另请参阅 QStyleHints::wheelScrollLines ().
初始化窗口系统并构造应用程序对象采用 argc 命令行自变量在 argv .
警告: 数据引用通过 argc and argv 必须保持有效对于整个生命周期 QApplication 对象。此外, argc 必须大于 0 且 argv 必须包含至少一有效字符串。
全局
qApp
指针引用此应用程序对象。只应创建一个应用程序对象。
此应用程序对象必须被构造先于任何 描绘设备 (包括小部件、像素图、位图等)。
注意: argc and argv 可能改变当 Qt 移除它识别的命令行自变量时。
所有 Qt 程序自动支持以下命令行选项:
-style
命令行选项。还可以设置所有 Qt 应用程序的风格,通过设置
QT_STYLE_OVERRIDE
环境变量。
注意: 样式表文件中的相对 URL 相对于样式表文件路径。
另请参阅 QCoreApplication::arguments ().
[virtual]
QApplication::
~QApplication
()
清理由此应用程序分配的任何窗口系统资源。设置全局变量
qApp
to
nullptr
.
[static slot]
void
QApplication::
aboutQt
()
显示关于 Qt 的简单消息框。消息包括应用程序正使用的 Qt 版本号。
这很有用,对于包括 Help 菜单的应用程序,如展示在 菜单 范例。
此函数是方便槽对于 QMessageBox::aboutQt ().
[static]
QWidget
*QApplication::
activeModalWidget
()
返回活动的模态 Widget。
模态 Widget 是特殊顶层 Widget 是子类化的 QDialog 将构造函数的模态参数指定为 true。必须关闭模态 Widget 在用户可以继续程序的其它部分之前。
模态 Widget 被组织在堆栈中。此函数返回堆栈顶部的活动模态 Widget。
另请参阅 activePopupWidget () 和 topLevelWidgets ().
[static]
QWidget
*QApplication::
activePopupWidget
()
返回活动弹出 Widget。
弹出 Widget 是特殊顶层 Widget 有设置
Qt::WType_Popup
小部件标志,如
QMenu
小部件。当应用程序打开弹出 Widget 时,所有事件会被发送给弹出 Widget。正常 Widget 和模态 Widget 无法访问,在关闭弹出 Widget 之前。
只能打开其它弹出 Widget,当展示弹出 Widget 时。弹出 Widget 被组织在堆栈中。此函数返回在堆栈顶部的活动弹出 Widget。
另请参阅 activeModalWidget () 和 topLevelWidgets ().
[static]
QWidget
*QApplication::
activeWindow
()
返回拥有键盘输入聚焦的应用程序顶层窗口,或
nullptr
若应用程序窗口不拥有聚焦。可能存在 activeWindow(),即使没有
focusWidget
(),例如:若该窗口的 Widget 不接受键事件。
另请参阅 setActiveWindow (), QWidget::setFocus (), QWidget::hasFocus (),和 focusWidget ().
[static]
void
QApplication::
alert
(
QWidget
*
widget
,
int
msec
= 0)
导致展示警报 widget 若窗口不是活动窗口。展示警报 msec 毫秒。若 msec 为 0 (默认),则无限期展示警报,直到窗口再次变为活动为止。
目前,此函数在 Qt for Embedded Linux 什么都不做。
在 macOS,这更多地是工作于应用程序级别,且导致应用程序图标会在停放中跳动。
在 Windows,这导致窗口的任务栏条目会闪烁一段时间。若 msec 为 0,闪烁会停止,且任务栏条目将变成不同颜色 (目前为橙色)。
在 X11,这导致窗口会被标记成 "要求关注",窗口不得隐藏 (即:没有对它调用 hide(),但以某种方式可见) 为让这能工作。
[static]
QWidgetList
QApplication::
allWidgets
()
返回应用程序的所有 Widget 的列表。
列表是空的 ( QList::isEmpty ()) 若没有 Widget。
注意: 某些 Widget 可能被隐藏。
范例:
void updateAllWidgets() { const QWidgetList allWidgets = QApplication::allWidgets(); for (QWidget *widget : allWidgets) widget->update(); }
另请参阅 topLevelWidgets () 和 QWidget::isVisible ().
[static]
void
QApplication::
beep
()
响铃声,使用默认音量和声音。函数 not 可用于 Qt for Embedded Linux。
[static slot]
void
QApplication::
closeAllWindows
()
关闭所有顶层窗口。
This function is particularly useful for applications with many top-level windows.
The windows are closed in random order, until one window does not accept the close event. The application quits when the last window was successfully closed, unless quitOnLastWindowClosed is set to false. To trigger application termination from e.g. a menu, use QCoreApplication::quit () 而不是此函数。
另请参阅 quitOnLastWindowClosed , lastWindowClosed (), QWidget::close (), QWidget::closeEvent (), lastWindowClosed (), QCoreApplication::quit (), topLevelWidgets (),和 QWidget::isWindow ().
[override virtual protected]
bool
QApplication::
event
(
QEvent
*
e
)
重实现: QGuiApplication::event (QEvent *e).
[static]
int
QApplication::
exec
()
进入主事件循环并等待,直到 exit () 被调用,然后将设置值返回给 exit () (为 0 若 exit () 被调用凭借 quit ()).
有必要调用此函数以启动事件处理。主事件循环从窗口系统接收事件,并将其分派给应用程序 Widget。
一般来说,在调用 exec() 之前不会发生用户交互。作为特殊情况,模态 Widget 像 QMessageBox 可以在调用 exec() 之前使用,因为模态 Widget 会调用 exec() 以启动本地事件循环。
要使应用程序履行空闲处理 (即:执行特殊函数,每当没有待决事件时),使用 QTimer 采用 0 超时。更高级空闲处理方案可以达成使用 processEvents ().
推荐把清理代码连接到
aboutToQuit
() 信号,而不是将它放入应用程序的
main()
函数。这是因为,在某些平台调用 QApplication::exec() 可能不返回。例如,在 Windows 平台,当用户注销时,系统会在 Qt 关闭所有顶层窗口后终止进程。因此,
不保证
应用程序会有时间退出其事件循环并执行代码结束
main()
函数,在调用 QApplication::exec() 后。
另请参阅 quitOnLastWindowClosed , QCoreApplication::quit (), QCoreApplication::exit (), QCoreApplication::processEvents (),和 QCoreApplication::exec ().
[signal]
void
QApplication::
focusChanged
(
QWidget
*
old
,
QWidget
*
now
)
此信号被发射当 Widget 键盘聚焦的改变是从
old
to
now
,即,由于用户按下 tab 键、点击 Widget,或改变活动窗口。两者
old
and
now
可以是
nullptr
.
信号被发射后于 2 小部件被通知即将改变透过 QFocusEvent .
另请参阅 QWidget::setFocus (), QWidget::clearFocus (),和 Qt::FocusReason .
[static]
QWidget
*QApplication::
focusWidget
()
返回拥有键盘输入聚焦的应用程序 Widget,或
nullptr
若此应用程序的 Widget 不拥有聚焦。
另请参阅 QWidget::setFocus (), QWidget::hasFocus (), activeWindow (),和 focusChanged ().
[static]
QFont
QApplication::
font
()
返回应用程序的默认字体。
另请参阅 setFont (), fontMetrics (),和 QWidget::font ().
[static]
QFont
QApplication::
font
(const
QWidget
*
widget
)
这是重载函数。
返回默认字体,为 widget 。若未注册默认字体为 widget 类,它返回其最近注册超类的默认字体。
另请参阅 fontMetrics (), setFont (),和 QWidget::setFont ().
[static]
QFont
QApplication::
font
(const
char
*
className
)
这是重载函数。
返回 Widget 字体为给定 className .
另请参阅 setFont () 和 QWidget::font ().
[static]
bool
QApplication::
isEffectEnabled
(
Qt::UIEffect
effect
)
返回
true
if
effect
被启用;否则返回
false
.
By default, Qt will try to use the desktop settings. To prevent this, call setDesktopSettingsAware(false).
注意: 所有效果被禁用,当运行在低于 16 位颜色深度的屏幕。
另请参阅 setEffectEnabled () 和 Qt::UIEffect .
[static]
Qt::NavigationMode
QApplication::
navigationMode
()
返回 Qt 使用哪种聚焦导航。
此特征只可用于 Qt for Embedded Linux。
另请参阅 setNavigationMode ().
[override virtual]
bool
QApplication::
notify
(
QObject
*
receiver
,
QEvent
*
e
)
重实现: QGuiApplication::notify (QObject *object, QEvent *event).
[static]
QPalette
QApplication::
palette
(const
QWidget
*
widget
)
若 widget 有传递,返回 Widget 类的默认调色板。这可能 (或不可能) 是应用程序调色板。在大多数情况下,某些类型的 Widget 没有特殊调色板,但值得注意的一例外是 Windows 下的弹出菜单,若用户有为显示菜单,设置定义了特殊背景颜色。
另请参阅 setPalette () 和 QWidget::palette ().
[static]
QPalette
QApplication::
palette
(const
char
*
className
)
这是重载函数。
返回用于 Widget 的调色板为给定 className .
另请参阅 setPalette () 和 QWidget::palette ().
[static]
void
QApplication::
setEffectEnabled
(
Qt::UIEffect
effect
,
bool
enable
= true)
启用 UI 效果 effect if enable 为 True,否则效果将不会被使用。
注意: 所有效果被禁用,当运行在低于 16 位颜色深度的屏幕。
另请参阅 isEffectEnabled (), Qt::UIEffect ,和 setDesktopSettingsAware ().
[static]
void
QApplication::
setFont
(const
QFont
&
font
, const
char
*
className
= nullptr)
将应用程序默认字体改为 font 。若 className 有传递,改变仅适用的类继承 className (如报告通过 QObject::inherits ()).
当应用程序启动时,默认字体从属窗口系统。它可能因窗口系统版本和区域设置两者而异。此函数让您覆盖默认字体;但覆盖可能是坏主意,因为,例如:某些区域设置需要特大字体以支持它们的特殊字符。
警告: 不要使用此函数结合 Qt 样式表 。可以使用 font 样式表特性定制应用程序字体。要为所有 QPushButton 设置粗体字体,设置应用程序 styleSheet () 如 " QPushButton { font: bold }"
另请参阅 font (), fontMetrics (),和 QWidget::setFont ().
[static]
void
QApplication::
setNavigationMode
(
Qt::NavigationMode
mode
)
将聚焦导航 Qt 应使用的种类设为 mode .
此特征只可用于 Qt for Embedded Linux。
另请参阅 navigationMode ().
[static]
void
QApplication::
setPalette
(const
QPalette
&
palette
, const
char
*
className
= nullptr)
将应用程序调色板更改为 palette .
若 className 有传递,改变仅应用于 Widget 有继承 className (如报告通过 QObject::inherits ())。若 className 为 0,改变影响所有 Widget,从而覆盖任何先前设置的类特定调色板。
调色板可能根据当前 GUI 样式改变在 QStyle::polish ().
警告: 不要使用此函数结合 Qt 样式表 。当使用样式表时,可以使用 color、background-color、selection-color、selection-background-color 及 alternate-background-color 定制 Widget 调色板。
注意: Some styles do not use the palette for all drawing, for instance, if they make use of native theme engines. This is the case for the Windows Vista and macOS styles.
另请参阅 QWidget::setPalette (), palette (),和 QStyle::polish ().
[static]
void
QApplication::
setStyle
(
QStyle
*
style
)
将应用程序的 GUI 风格设为 style 。将风格对象的所有权转移给 QApplication ,所以 QApplication 会在应用程序退出时删除风格对象,或者当有设置新风格且旧风格仍是应用程序对象的父级时。
用法范例:
QApplication::setStyle(QStyleFactory::create("Fusion"));
当切换应用程序风格时,颜色调色板被设回初始颜色 (或系统默认)。这有必要,由于某些风格必须适配颜色调色板,以完全兼容风格指南。
设置风格在设置调色板之前,即先于创建 QApplication ,将导致应用程序使用 QStyle::standardPalette () 对于调色板。
警告: Qt 样式表目前不支持自定义 QStyle 子类。计划在某些未来发行中解决此问题。
另请参阅 style (), QStyle , setPalette (),和 desktopSettingsAware ().
[static]
QStyle
*QApplication::
setStyle
(const
QString
&
style
)
这是重载函数。
请求 QStyle 对象为 style 从 QStyleFactory .
字符串必须是某一 QStyleFactory::keys (),通常是 windows、windowsvista、fusion 或 macos 之一。样式名不区分大小写。
返回
nullptr
若未知
style
被传递,否则
QStyle
返回对象被设为应用程序的 GUI 样式。
警告: 要确保应用程序样式设置正确,最好调用此函数先于 QApplication 构造函数,若可能的话。
[static]
QStyle
*QApplication::
style
()
[static]
QWidget
*QApplication::
topLevelAt
(const
QPoint
&
point
)
返回顶层 Widget 按给定
point
;返回
nullptr
若没有这种 Widget。
[static]
QWidget
*QApplication::
topLevelAt
(
int
x
,
int
y
)
这是重载函数。
返回顶层 Widget 按 point ( x , y );返回 0 若没有这种 Widget。
[static]
QWidgetList
QApplication::
topLevelWidgets
()
返回应用程序顶层 Widget (窗口) 的列表。
注意: 可能隐藏某些顶层 Widget,例如:工具提示若目前未展示工具提示。
范例:
void showAllHiddenTopLevelWidgets() { const QWidgetList topLevelWidgets = QApplication::topLevelWidgets(); for (QWidget *widget : topLevelWidgets) { if (widget->isHidden()) widget->show(); } }
另请参阅 allWidgets (), QWidget::isWindow (),和 QWidget::isHidden ().
[static]
QWidget
*QApplication::
widgetAt
(const
QPoint
&
point
)
返回 Widget 按全局屏幕位置
point
,或
nullptr
若那里没有 Qt Widget。
此函数可能很慢。
另请参阅 QCursor::pos (), QWidget::grabMouse (),和 QWidget::grabKeyboard ().
[static]
QWidget
*QApplication::
widgetAt
(
int
x
,
int
y
)
这是重载函数。
返回 Widget 按全局屏幕位置 (
x
,
y
),或
nullptr
若那里没有 Qt Widget。
引用唯一应用程序对象的全局指针。它相当于 QCoreApplication::instance (),但铸造作为 QApplication 指针,因此才有效当唯一应用程序对象为 QApplication .
另请参阅 QCoreApplication::instance () 和 qGuiApp .