QCoreApplication介绍
QCoreApplication
类是Qt框架中用于创建非GUI应用程序的基础类,它提供了全局的应用程序环境和事件循环。通过该类,我们能够创建一个命令行程序或后台服务,以响应各种输入和产生输出。
QCoreApplication
类封装了大量底层操作,包括处理事件、定时器、文件I/O和网络通信等。此外,它还提供了一组跨平台的API函数,能够实现进程控制、线程管理和异常处理等功能。在QCoreApplication
类的帮助下,我们可以轻松地创建不同类型的基于事件驱动的应用程序,并通过简单的事件处理机制响应这些事件。
与QGuiApplication
类不同,QCoreApplication
类并不包含任何GUI相关的操作,因此其适用于开发需要依赖于Qt框架进行开发,但不需要UI界面的程序。在实际开发中,我们通常会根据需求选择使用QGuiApplication
类或QCoreApplication
类来创建应用程序。
QCoreApplication
类通过提供完备的事件循环机制和底层操作,为我们创建非GUI应用程序提供了良好的支持。同时,由于Qt是一个跨平台的开发框架,因此也能够使得应用程序在不同的操作系统或设备上获得高度的可移植性和灵活性。
QGuiApplication介绍
QGuiApplication
类是Qt框架中用于创建GUI应用程序的基础类。它继承自QCoreApplication
类,封装了大量与窗口、显示和用户交互相关的操作,如打开对话框、处理键盘和鼠标事件、管理多窗口等。通过QGuiApplication
类,我们可以创建具有交互界面的应用程序。
在Qt中,要使用QGuiApplication
类创建GUI应用程序,只需要实例化该类并调用其成员函数即可。QGuiApplication
类提供了许多常用操作接口,如设置应用程序名称、获取所有窗口、设置事件循环以及处理输入法等。此外,为了在GUI界面中能够渲染出正确的字体、颜色、布局和动画效果等,QGuiApplication
还会自动加载并应用可定制的主题和样式表。
通过QGuiApplication
类,我们可以轻松地创建并管理一个GUI应用程序,实现各种交互功能和用户界面的设计。同时,由于Qt是一个跨平台的开发框架,因此也能够使得应用程序在不同的操作系统或设备上获得一致而且良好的用户体验。
常用接口
QGuiApplication
类是一个提供GUI功能的应用程序,它继承自QCoreApplication
类,提供了一组操作图形用户界面的接口函数。以下是QGuiApplication
类的常用接口函数和作用:
QGuiApplication(int& argc, char** argv)
:构造函数,创建一个GUI应用程序。void aboutQt()
:打开显示关于Qt的对话框。bool allWindowsClosed()
:检查是否所有窗口都已关闭。QString applicationDisplayName()
:获取应用程序显示名称。void setApplicationDisplayName(const QString& name)
:设置应用程序显示名称。Qt::LayoutDirection layoutDirection()
:获取当前布局方向(从左到右或从右到左)。void setLayoutDirection(Qt::LayoutDirection direction)
:设置布局方向。int exec()
:开始事件循环并阻塞当前线程,直到quit()
被调用或者所有窗口都已关闭。void quit()
:退出事件循环并结束应用程序。QWindowList allWindows()
:获取所有窗口的列表。QWindow* topLevelAt(const QPoint& pos)
:获取指定点位置最顶层的窗口。QWindow* focusWindow()
:获取当前拥有焦点的窗口。void setInputMethodHints(Qt::InputMethodHints hints)
:设置输入法提示,在使用输入法时会根据提示进行相应调整。QScreen* primaryScreen()
:获取主屏幕。QWindow* activeWindow()
:获取当前处于活动状态的窗口。void sendEvent(QObject* receiver, QEvent* event)
:向指定对象发送事件。void postEvent(QObject* receiver, QEvent* event, int priority = Qt::NormalEventPriority)
:将事件添加到接收对象的事件队列中。
QGuiApplication
类提供了封装在QCoreApplication
类中的大部分功能,并且添加了与GUI相关的操作,如处理窗口、显示对话框和设置布局方向等。要使用QGuiApplication
类创建一个GUI应用程序,只需要在主函数开始时实例化该类即可。应用程序能够响应窗口、菜单、标签和按钮等用户交互事件,以及打开其他窗口、对话框和文件等操作。可以通过这些接口函数进行各种操作,例如设置应用程序名称、查找所有窗口、处理输入法、向对象发送事件等等。
代码演示
以下代码演示了QCoreApplication和QGuiApplication的常用方法。主要是设置或获取获取应用程序工作路径、设置应用程序名称/版本/组织信息、事件循环等。
#include <QtGui/QGuiApplication>
#include <QtCore/QDebug>
#include <QtGui/QScreen>
#include <QtCore>
#include <QIcon>
#include <QWindow>
#include <QWidget>
#include <QDir>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv); // 实例化 QGuiApplication 对象,并传递命令行参数给它
//设置软件工作路径
QDir::setCurrent(QCoreApplication::applicationDirPath());
// 取应用程序名
QString appName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
qDebug() << "appName"<<appName;
//延时500ms,等待异步操作完成
QTime _Timer = QTime::currentTime().addMSecs(500);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 2);
// 设置应用程序名称、组织名称、版本,这些信息可以在对话框、标题栏等处显示
app.setApplicationName("MyApp");
app.setOrganizationName("MyOrganization");
app.setApplicationVersion("1.0.0");
// 设置应用程序的图标,这个图标可以在任务栏、窗体边框等处显示
app.setWindowIcon(QIcon(":/images/logo.ico"));
// 获取所有屏幕
QList<QScreen*> screens = QGuiApplication::screens();
// 显示所有屏幕信息:屏幕数量、几何形状及可用空间位置、PPI值等
qDebug() << "Number of screens: " << screens.size();
foreach (QScreen* screen, screens) {
qDebug() << "Screen geometry: " << screen->geometry();
qDebug() << "Screen available geometry: " << screen->availableGeometry();
qDebug() << "Screen DPI: " << screen->physicalDotsPerInch();
}
// 安装对应用程序界面语言翻译文件的翻译器, 以支持多语言翻译
app.installTranslator(new QTranslator());
qInfo() << "Current locale: " << QLocale::system().name(); // 显示本地化名称
// 监听窗口得到或失去焦点的事件
QObject::connect(&app, &QGuiApplication::focusWindowChanged, [&](QWindow*) {
qDebug() << "Focus window changed";
});
// 启动应用程序的事件循环,并在退出时返回一个退出码
int exitCode = app.exec();
qInfo() << "Exit code: " << exitCode;
return exitCode; // 完成操作,返回退出码
}
代码运行输出如下:
appName "GuiApplication"
Number of screens: 1
Screen geometry: QRect(0,0 1920x1080)
Screen available geometry: QRect(0,27 1920x1053)
Screen DPI: 95.1083
Current locale: "zh_CN"
注意事项
QGuiApplication 是 Qt 应用程序的主要入口,它提供了一些与应用程序无关的操作系统级服务,如事件循环、屏幕信息等。使用 QGuiApplication 时,需要注意以下几点:
- 在一个线程中只能使用一个 QGuiApplication 实例,否则会导致不可预期的行为。
- 在创建 GUI 物件之前必须实例化 QGuiApplication 对象。
- 如果没有使用 QApplication 的组件,可以在 main() 函数开头使用 QCoreApplication 进行初始化,这样无需引进 QWidget 组件。
- 如果需要处理命令行选项,请在 app.exec() 之前进行处理。
- 在其它线程或函数中调用 Gui 操作(例如界面更新)时,需要使用 QObject::thread 和 QObject::moveToThread 手动将执行环境切换到 GUI 线程才可以。
- 可以通过安装全局事件过滤器来拦截并处理 GUI 事件。
- 如果您使用的是 CMake 构建系统而不是 qmake,您可能需要在 CMakeLists.txt 文件中添加对 Qt5Gui 模块的引用。
总之,在使用 Qt 进行 GUI 开发时,QGuiApplication 是必不可少的组件,需要在合适的时候实例化,特别注意遵循 Qt 的线程模型。