QGuiApplication类的使用

news/2024/6/17 14:00:30 标签: qt, 开发语言

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 时,需要注意以下几点:

  1. 在一个线程中只能使用一个 QGuiApplication 实例,否则会导致不可预期的行为。
  2. 在创建 GUI 物件之前必须实例化 QGuiApplication 对象。
  3. 如果没有使用 QApplication 的组件,可以在 main() 函数开头使用 QCoreApplication 进行初始化,这样无需引进 QWidget 组件。
  4. 如果需要处理命令行选项,请在 app.exec() 之前进行处理。
  5. 在其它线程或函数中调用 Gui 操作(例如界面更新)时,需要使用 QObject::thread 和 QObject::moveToThread 手动将执行环境切换到 GUI 线程才可以。
  6. 可以通过安装全局事件过滤器来拦截并处理 GUI 事件。
  7. 如果您使用的是 CMake 构建系统而不是 qmake,您可能需要在 CMakeLists.txt 文件中添加对 Qt5Gui 模块的引用。

总之,在使用 Qt 进行 GUI 开发时,QGuiApplication 是必不可少的组件,需要在合适的时候实例化,特别注意遵循 Qt 的线程模型。


http://www.niftyadmin.cn/n/409679.html

相关文章

自由培训师想实现年入百万,你需要5种能力!

哈喽&#xff0c;大家好&#xff0c;我是海哥&#xff0c;知识付费变现创业教练&#xff0c;教育公司培训总监&#xff0c;从事知识付费变现咨询10年&#xff0c;已助力3000人实现知识付费变现。 现在很多培训机构&#xff0c;培训师朋友蠢蠢欲动&#xff0c;计划脱离机构&…

【LeetCode】240. 搜索二维矩阵 II

240. 搜索二维矩阵 II&#xff08;中等&#xff09; 这道题和 74. 搜索二维矩阵 基本一致&#xff0c;可以放在一起做。 方法一&#xff1a;变形的二叉搜索树 思路 这种做法和 74. 搜索二维矩阵完全一致。 我们可以将二维矩阵抽象成「以右上角为根的 BST」&#xff1a; 那…

Threejs,InstancedMesh变换操作

Threejs,InstancedMesh 在项目中加载一个道路的模型树,结果加载出来是水平的 期望是: 仔细分析: 打印模型元素,模型是两个交叉的InstancedMesh ,每个InstancedMesh 里面有566重复的mesh,形成566棵树。那么现在的期望就变成这两个交叉的InstancedMesh 各自旋转下角度 c…

JavaSE06_面向对象之封装

JavaSE-06 [面向对象OOP 封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是…

vue 最基础的响应式实现

vue 最基础的响应式实现 //拦截属性 function defineObj(obj) {for (let key in obj) {// 赋值let tempValue obj[key]// 收集依赖的函数let funcs []Object.defineProperty(obj, key, {get: function () {if (window.__func) {funcs.push(window.__func)}return tempValue}…

python内存

在python中&#xff0c;一切都是对象。Python从设计之初就是一门面向对象的语言&#xff0c;它有一个重要的概念&#xff0c;即一切皆对象。 Java虽然也是面向对象编程的语言&#xff0c;但是血统没有Python纯正。比如Java的八种基本数据类型之一int&#xff0c;在持久化的时候…

基于SpringBoot+Vue的学生考勤管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Linux异步和非阻塞

概念 对于linux来说&#xff0c;异步和非阻塞是两个概念。可以概述如下 异步: 使得拥有文件指针的进程或者进程组能够立刻收到内核的SIGIO信号 非阻塞: 使得对于文件指针的读写操作不会阻塞于buffer为空的情况 区别及使用说明 ioctl和FIOASYNC等价于fcntl和O_ASYNC。 ioc…