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) |
此特性保持区分键按下和 2 次连续键按下的时间限制 (以毫秒为单位)
在 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 ().
[虚拟]
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
()
关闭所有顶层窗口。
此函数对于具有很多顶层窗口的应用程序,尤其有用。
窗口按随机次序关闭,直到某个窗口不接受关闭事件为止。应用程序离开当成功关闭最后一个窗口时,除非 quitOnLastWindowClosed 被设为 false。要触发应用程序终止 (如:从菜单),使用 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
.
默认情况下,Qt 会试着使用桌面设置。要阻止这种情况,调用 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 调色板。
注意: 某些风格不使用调色板对于所有绘制 (例如:若它们使用本机主题引擎)。这是针对 Windows Vista 和 macOS 风格的情况。
另请参阅 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 .