QApplication类管理GUI应用程序的控制流和主设置。
头文件:
#include
cmake:
find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake:
QT += widgets
继承自:
QGuiApplication
QApplication专门为QGuiApplication提供基于QWidget 的应用程序所需的一些功能。它处理小部件特定的初始化和结束。
对于任何使用Qt的GUI应用程序,都只有一个QApplication对象,无论该应用程序在任何给定时间是否有0、1、2或更多窗口。对于非QWidget 的Qt应用程序,使用QGuiApplication代替,因为它不依赖于QtWidgets库。
一些GUI应用程序提供了一个特殊的批处理模式ie。提供命令行参数,以便在无需人工干预的情况下执行任务。在这种非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的主要职责是:
由于QApplication对象进行了大量初始化,因此必须在创建与用户界面相关的任何其他对象之前创建QApplication对象。QApplication还处理常见的命令行参数。因此,在应用程序本身对argv进行任何解释或修改之前创建它通常是一个好主意。
另请参见: QCoreApplication, QAbstractEventDispatcher, QEventLoop, QSettings.
切换SIP(软件输入面板)自动可见性
将此属性设置为true,以便在输入接受键盘输入的小部件时自动显示SIP。这个属性只影响设置了WA_InputMethodEnabled属性的小部件,通常用于在只有很少或没有键的设备上启动虚拟键盘。
该属性仅对使用软件输入面板的平台有影响。
默认值与平台相关。
该属性以毫秒为单位保存文本光标的闪烁时间
闪光时间是显示、反转和恢复插入符号显示所需要的时间。通常文本光标显示的时间是光标闪光时间的一半,然后隐藏的时间相同,但这可能会有所不同。
X11的默认值是1000毫秒。在Windows上,使用控制面板的值,设置此属性将为所有应用程序设置游标闪光时间。
我们建议小部件不要缓存这个值,因为它可能在用户更改全局桌面设置时随时更改。
注意:这个属性可能保持一个负数,例如当光标闪烁被禁用时。
此属性保留区分双击和连续两次鼠标单击的时间限制(以毫秒为单位)
X11的默认值是400毫秒。在Windows和Mac操作系统上,使用操作系统的值。
此属性保留区分一次按键和两次连续按键的时间限制(以毫秒为单位)
X11的默认值是400毫秒。在Windows和Mac操作系统上,使用操作系统的值。
此属性保存开始拖放操作所需的最小距离。
如果在应用程序中支持拖放,并希望在用户按住按钮将光标移动一定距离后开始拖放操作,则应该使用此属性的值作为所需的最小距离。
例如,如果鼠标点击的位置存储在startPos中,而当前位置(例如在鼠标移动事件中)是currentPos,你可以通过如下代码来判断是否应该开始拖动:
if ((startPos - currentPos).manhattanLength() >=
QApplication::startDragDistance())
startTheDrag();
Qt内部使用这个值,例如在QFileDialog中。
默认值(如果平台没有提供不同的默认值)是10像素。
另请参见:startDragTime(), QPoint::manhattanLength(), Drag and Drop.
此属性保存开始拖放操作前必须按住鼠标按钮的时间(以毫秒为单位)
如果在应用程序中支持拖放,并且希望在用户按住鼠标按钮一定时间后开始拖放操作,则应使用此属性的值作为延迟。
Qt也在内部使用这个延迟,例如在QTextEdit和QLineEdit中,用于开始拖动。
另请参见: startDragDistance() 、Drag and Drop.
此属性保存应用程序样式表
默认情况下,该属性返回一个空字符串,除非用户在运行应用程序时在命令行上指定-stylesheet选项。
另请参见: QWidget::setStyle() 、Qt Style Sheets.
此属性保存鼠标滚轮旋转时滚动小部件所需的行数。
如果该值超过小部件的可见行数,小部件应该将滚动操作解释为单页向上或单页向下。如果小部件是一个项目视图类,那么滚动一行的结果取决于小部件滚动模式的设置。滚动一行可以表示滚动一个项目或滚动一个像素。
默认情况下,此属性的值为3。
另请参见:QStyleHints::wheelScrollLines().
QApplication::QApplication(int &argc, char
**
argv)
初始化窗口系统并用argv中的argc命令行参数构造应用程序对象。
警告:argc和argv引用的数据必须在QApplication对象的整个生存期内保持有效。此外,argc必须大于零,并且argv必须至少包含一个有效字符串。
全局qApp指针引用此应用程序对象。只应创建一个应用程序对象。
此应用程序对象必须在任何绘制设备(包括小部件、pixmap、位图等)之前构造。
注意:argc和argv可能会随着Qt删除它识别的命令行参数而改变。
所有Qt程序都自动支持以下命令行选项:
另请参见QCoreApplication::arguments()。
[static slot]void QApplication::aboutQt()
显示一个关于Qt的简单消息框,该消息包括应用程序正在使用的Qt的版本号。
这对于包含在应用程序的帮助菜单中是很有用的,如菜单示例所示。
这个函数是QMessageBox::aboutQt()的一个方便插槽。
[static slot]void QApplication::closeAllWindows()
关闭所有顶级窗口。
这个函数对于具有许多顶级窗口的应用程序特别有用。
窗口按随机顺序关闭,直到其中一个窗口不接受关闭事件。当最后一个窗口被成功关闭时,应用程序将退出,除非quitOnLastWindowClosed被设置为false。要从菜单中触发应用程序终止,可以使用QCoreApplication::quit()来代替这个函数。
参见quitOnLastWindowClosed, lastWindowClosed(), QWidget::close(), QWidget::closeEvent(), lastWindowClosed(), QCoreApplication::quit(), topLevelWidgets(),和QWidget::isWindow()。
[signal]void QApplication::focusChanged(QWidget
*
old, QWidget*
now)
当拥有键盘焦点的小部件从原来变为现在时,即用户按下tab键、单击小部件或更改活动窗口时,就会发出这个信号。旧的和现在的都可以是nullptr。
在通过QFocusEvent通知两个小部件更改之后发出信号。
参见QWidget::setFocus(), QWidget::clearFocus()和Qt::FocusReason。
[virtual]QApplication::~QApplication()
清除此应用程序分配的任何窗口系统资源。设置全局变量qApp为nullptr。
[static]QWidget
*
QApplication::activeModalWidget()
返回激活的模态小部件。
模态小部件是一个特殊的顶级小部件,它是QDialog的子类,它将构造函数的模态参数指定为true。在用户继续使用程序的其他部分之前,必须关闭模态部件。
模态部件被组织在一个堆栈中。这个函数返回栈顶的活动模态小部件。
另请参阅activePopupWidget()和topLevelWidgets()。
[static]QWidget
*
QApplication::activePopupWidget()
返回活动的弹出窗口小部件。
popup小部件是一个特殊的顶级小部件,它设置Qt::WType_Popup小部件标志,例如QMenu小部件。当应用程序打开一个弹出窗口小部件时,所有的事件都被发送到弹出窗口。在弹出窗口小部件关闭之前,普通小部件和模态小部件不能被访问。
只有其他弹出窗口小部件可以在弹出窗口小部件显示时打开。弹出窗口小部件被组织在一个堆栈中。这个函数返回在堆栈顶部的活动的弹出窗口小部件。
另请参阅activeModalWidget()和topLevelWidgets()。
[static]QWidget
*
QApplication::activeWindow()
返回具有键盘输入焦点的应用程序顶级窗口,如果没有具有该焦点的应用程序窗口,则返回nullptr。即使没有focusWidget(),也可能存在一个activeWindow(),例如,如果该窗口中没有接受键事件的小部件。
参见setActiveWindow(), QWidget::setFocus(), QWidget::hasFocus()和focusWidget()。
[static]void QApplication::alert(QWidget
*
widget, int msec = 0)
如果窗口不是活动窗口,则会显示小部件的警告。警报以毫秒为单位显示。如果msec为0(默认值),则会无限期地显示警报,直到窗口再次激活。
目前,此函数在嵌入式Linux的Qt上没有任何作用。
在macOS上,这在应用程序级别更有效,并将导致应用程序图标在dock中反弹。
在Windows上,这会导致窗口的任务栏条目闪烁一段时间。如果msec为零,闪烁将停止,任务栏条目将变为不同的颜色(当前为橙色)。
在X11上,这将导致窗口标记为“需要注意”,因此,窗口不能隐藏(即未调用hide()但以某种方式可见),以便工作。
[static]
QWidgetList QApplication::allWidgets()
返回应用程序中所有小部件的列表。
如果没有小部件,则列表为空(QList::isEmpty())。
注意:一些小部件可能是隐藏的。
例子:
void updateAllWidgets()
{
const QWidgetList allWidgets = QApplication::allWidgets();
for (QWidget *widget : allWidgets)
widget->update();
}
另请参见topLevelWidgets()和QWidget::isVisible()。
[static]
void QApplication::beep()
铃声,使用默认的音量和声音。这个函数在嵌入式Linux的Qt中是不可用的。
[override virtual protected]bool QApplication::event(QEvent
*
e)
重新实现:QGuiApplication::event(QEvent *e).
[static]
int QApplication::exec()
进入主事件循环并等待,直到调用exit(),然后返回设置为exit()的值(如果通过quit()调用exit(),则返回0)。
需要调用这个函数来启动事件处理。主事件循环从窗口系统接收事件,并将这些事件分派给应用程序小部件。
一般来说,在调用exec()之前不会发生用户交互。作为一个特例,像QMessageBox这样的模态小部件可以在调用exec()之前使用,因为模态小部件会调用exec()来启动本地事件循环。
要让你的应用程序执行空闲处理,即在没有挂起事件时执行一个特殊函数,使用一个超时为0的QTimer。使用processEvents()可以实现更高级的空闲处理方案。
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中。这是因为,在某些平台上,QApplication::exec()调用可能不会返回。例如,在Windows平台上,当用户退出时,Qt关闭所有顶级窗口后,系统终止进程。因此,不能保证应用程序有时间退出事件循环,并在调用QApplication::exec()之后执行main()函数末尾的代码。
参见quitOnLastWindowClosed, QCoreApplication::quit(), QCoreApplication::exit(), QCoreApplication::processEvents(), QCoreApplication::exec()。
[static]QWidget
*
QApplication::focusWidget()
返回具有键盘输入焦点的应用程序小部件,如果该应用程序中没有小部件具有焦点,则返回nullptr。
参见QWidget::setFocus(), QWidget::hasFocus(), activeWindow()和focusChanged()。
[static]QFont QApplication::font()
返回默认的应用程序字体。
参见setFont(), fontMetrics()和QWidget::font()。
[static]QFont QApplication::font(const QWidget
*
widget)
这是一个重载函数。
返回小部件的默认字体。如果没有为小部件的类注册默认字体,它将返回与其最近的注册超类的默认字体。
参见fontMetrics(), setFont()和QWidget::setFont()。
[static]QFont QApplication::font(const char
*
className)
这是一个重载函数。
返回给定类名的部件的字体。
另请参阅setFont()和QWidget::font()。
[static]bool QApplication::isEffectEnabled(Qt::UIEffect effect)
如果启用了效果,则返回true;否则返回false。
默认情况下,Qt将尝试使用桌面设置。要防止这种情况发生,可以调用setDesktopSettingsAware(false)。
注意:在少于16位色深的屏幕上,所有的效果都是禁用的。
参见setEffectEnabled()和Qt::UIEffect。
[static]Qt::NavigationMode QApplication::navigationMode()
返回Qt使用的焦点导航类型。
该特性仅在嵌入式Linux的Qt中可用。
参见setNavigationMode()。
[override virtual]bool QApplication::notify(QObject
*
receiver, QEvent*
e)
重新实现:QGuiApplication::notify(QObject *object, QEvent *event).
定义一个c++类:MyApplication
MyApplication.h
#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H
#include
class MyApplication:public QApplication
{
public:
MyApplication(int argc, char*argv[]):QApplication(argc, argv)
{
}
bool notify(QObject *, QEvent *);
};
#endif // MYAPPLICATION_H
MyApplication.cpp
#include "myapplication.h"
#include
#include
#include
bool MyApplication::notify(QObject *object, QEvent *event){
if(this->topLevelWidgets().count()>0)
{
QWidget* mainWnd = this->topLevelWidgets().at(0);
if(object==(QObject*)mainWnd && event->type() == QEvent::Move)
{
// do ...
qDebug() << "mainwnd is clicked";
}
}
return QApplication::notify(object, event);
}
main.cpp
#include "widget.h"
#include "myapplication.h"
#include
int main(int argc, char *argv[])
{
MyApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
[static]QPalette QApplication::palette(const QWidget
*
widget)
如果传递了小部件,则返回小部件类的默认选项板。这可能是也可能不是应用程序调色板。在大多数情况下,对于某些类型的小部件没有特殊的调色板,但是一个值得注意的例外是Windows下的弹出菜单,如果用户在显示设置中为菜单定义了特殊的背景颜色的话。
另请参阅setPalette()和QWidget::palette()。
[static]QPalette QApplication::palette(const char
*
className)
这是一个重载函数。
返回给定类名的小部件的面板。
另请参阅setPalette()和QWidget::palette()。
[static]void QApplication::setActiveWindow(QWidget
*
active)
将活动窗口设置为活动小部件以响应系统事件。该函数从特定于平台的事件处理程序中调用。
警告:此功能没有将键盘焦点设置为活动小部件。叫QWidget:: activateWindow()。
它设置activeWindow()和focusWidget()属性,并将适当的WindowActivate/WindowDeactivate和FocusIn/FocusOut事件发送给所有适当的小部件。然后,窗口将被绘制在活动状态(例如,行编辑中的游标将闪烁),并且它将启用工具提示。
参见activeWindow()和QWidget::activateWindow()。
[static]void QApplication::setEffectEnabled(Qt::UIEffect effect, bool enable = true)
如果enable为true,则启用UI效果效果,否则该效果将不会被使用。
注意:在少于16位色深的屏幕上,所有的效果都是禁用的。
参见isEffectEnabled(), Qt::UIEffect,和setDesktopSettingsAware()。
[static]void QApplication::setFont(const QFont &font, const char
*
className = nullptr)
将应用程序的默认字体更改为字体。如果className被传递,这个变化只适用于继承className的类(如QObject::inherits()所报告的)。
在应用程序启动时,默认字体取决于窗口系统。它可以根据窗口系统版本和区域设置而变化。这个函数让你覆盖默认字体;但是重写可能不是一个好主意,因为,例如,一些地区需要额外的大字体来支持它们的特殊字符。
警告:不要将此函数与Qt样式表一起使用。应用程序的字体可以使用“font”样式表属性来定制。要为所有QPushButton设置粗体字体,将应用程序样式表()设置为"QPushButton {font: bold}"
参见font()、fontMetrics()和QWidget::setFont()。
[static]void QApplication::setNavigationMode(Qt::NavigationMode mode)
设置Qt应该用于模式的焦点导航类型。
该特性仅在嵌入式Linux的Qt中可用。
参见navigationMode()。
[static]void QApplication::setPalette(const QPalette &palette, const char
*
className = nullptr)
将应用程序Palette更改为Palette
如果className被传递,那么更改只会应用于继承className的部件(如QObject::inherits()所报告的那样)。如果className保留为0,则更改将影响所有小部件,从而覆盖以前设置的特定于类的调色板。
在QStyle::polish()中,面板可能会根据当前GUI的样式而改变。
警告:不要将此函数与Qt样式表一起使用。当使用样式表时,小部件的调色板可以使用“color”、“background-color”、“selection-color”、“selection-background-color”和“alternate-background-color”来定制。
注意:有些样式不会在所有的绘图中使用调色板,例如,如果它们使用本地主题引擎的话。这就是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)
这是一个重载函数。
从QStyleFactory请求一个QStyle对象来获取样式。
字符串必须是QStyleFactory::keys()之一,通常是"windows", “windowsvista”, “fusion”,或"macos"之一。样式名称不区分大小写。
如果传递了未知的样式,则返回nullptr,否则返回的QStyle对象被设置为应用程序的GUI样式。
警告:为了确保正确设置了应用程序的样式,如果可能的话,最好在QApplication构造函数之前调用这个函数。
[static]QStyle
*
QApplication::style()
返回应用程序的样式对象。
另请参阅setStyle()和QStyle。
[static]QWidget
*
QApplication::topLevelAt(const QPoint &point)
返回给定点的顶级小部件;如果没有这样的小部件,则返回nullptr。
[static]QWidget
*
QApplication::topLevelAt(int x, int y)
这是一个重载函数。
返回点(x, y)处的顶级小部件;如果没有这样的小部件,则返回0。
[static]QWidgetList QApplication::topLevelWidgets()
返回应用程序中顶级小部件(windows)的列表。
注意:一些顶级小部件可能被隐藏,例如一个工具提示,如果当前没有显示工具提示。
例子:
void showAllHiddenTopLevelWidgets()
{
const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();
for (QWidget *widget : topLevelWidgets) {
if (widget->isHidden())
widget->show();
}
}
参见:allWidgets(), QWidget::isWindow(), and QWidget::isHidden().
[static]QWidget
*
QApplication::widgetAt(const QPoint &point)
返回全局屏幕位置的小部件,如果没有Qt小部件,则返回nullptr。
这个功能可能比较慢。
参见QCursor::pos(), QWidget::grabMouse()和QWidget::grabKeyboard()。
[static]QWidget
*
QApplication::widgetAt(int x, int y)
这是一个重载函数。
返回全局屏幕位置(x, y)的小部件,如果没有Qt小部件,则返回nullptr。
一个全局指针,指向唯一的应用程序对象。它等价于QCoreApplication::instance(),但转换为QApplication指针,因此只有当唯一的应用程序对象是QApplication时才有效。
参见QCoreApplication::instance()和qGuiApp。