Qt中的QApplication和qApp的关系

第一章 QApplication

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);  // 创建 QApplication 对象,用于整个Qt应用的时间管理
    Widget w;                    // 创建一个 Widget 窗口
    w.show();                    // 显示 Widget 窗口
    return a.exec();             // 启动应用程序的事件循环
}

1. QApplication 的作用

QApplication 是所有 Qt GUI 应用程序的基础类,它管理应用程序的控制流和事件处理机制。在每个 Qt GUI 应用程序中,都必须创建一个 QApplication 实例,这是应用程序的事件循环的核心。具体作用如下:

  • 事件循环QApplication 负责启动应用程序的事件循环,这个循环持续运行,直到用户关闭应用程序。事件循环会捕获来自操作系统的输入事件(如鼠标点击、键盘输入等),并将这些事件分发给应用程序的各个窗口和控件处理。
  • 资源管理:它还负责管理应用程序的资源,比如窗口管理、平台相关的资源加载等。
  • 全局应用程序级操作QApplication 提供了一些全局操作方法,比如设置应用程序名称、样式、事件处理、退出等。

2. Widget 的作用

Widget 是 Qt 中用户界面的一个基本组件,它通常继承自 QWidgetQWidget 是所有可视化窗口部件的基类,所有界面元素如按钮、标签、窗口等都直接或间接继承自 QWidget

  • 窗口部件Widget 是一个窗口部件,它表示应用程序界面中的一个窗口或控件。在你的代码中,Widget w; 表示你创建了一个自定义的 Widget,它可能包含其他控件或是一个独立的窗口。
  • QApplication 的关系Widget 作为 GUI 窗口,依赖 QApplication 来处理事件。Widget 自身不会处理系统事件,而是通过 QApplication 的事件循环将事件传递给它。比如,当用户点击窗口时,操作系统会将事件传递给 QApplication,然后 QApplication 再将事件发送给相关的 Widget 进行处理。

3. 两者的关系

  • 应用程序的入口QApplication 是应用程序的入口,必须在创建任何 QWidget 对象(如 Widget w)之前创建 QApplication 实例,因为 Qt 依赖 QApplication 来管理和处理所有窗口部件的事件。
  • 事件传递机制QApplication 是事件处理的核心,所有的用户输入(如鼠标点击、键盘事件等)都会先通过 QApplication,再传递给具体的 Widget(如 w)来处理。
  • 生命周期管理QApplication 控制应用程序的生命周期,a.exec() 启动事件循环,在事件循环结束时,应用程序的所有 Widget 都会被销毁。

第二章 qApp

#define qApp QCoreApplication::instance()

在每一个 Qt 应用程序中,你都会创建一个 QApplication(或 QGuiApplicationQCoreApplication)实例。qApp 是 Qt 中提供的一个全局宏,它实际上指向当前应用程序的实例对象。它等价于调用 QCoreApplication::instance() 来获取这个应用程序实例。

小结

  • qAppQApplication 实例的全局指针:它指向当前创建的 QApplication 实例,方便在程序的任何地方访问应用程序对象。
  • 全局访问应用程序对象:使用 qApp 可以简化代码,因为你不需要每次都手动传递 QApplication 实例。

例如,在任何地方你可以用 qApp 来操作 QApplication 的一些方法:

  •  创建样式表
/* 正常状态或者鼠标松开按钮的状态,按钮颜色 */
QPushButton
{
    background-color:rgb(240,255,255);
    color: rgb(0, 0, 2);
    border-style: outset;
    border-color: beige;
    border-radius: 10px;
}

/* hover按钮悬浮,鼠标悬浮在按钮上的状态,按钮颜色 */
 QPushButton:hover 
{
    background-color:rgb(14, 220, 0);
    border-radius: 10px;
    color: rgb(0, 0, 0);
}

 /* 鼠标按下按钮时的状态,按钮颜色 */
QPushButton:checked 
{
    background-color:rgb(14, 170, 79);
    border-radius: 10px;
    color: rgb(255, 255, 0);
}
  • 使用样式表
#include "mainwindow.h"
#include <QApplication>
#include <QFile>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*****************************************/
    QString qss;
    QFile qssFile(":/myQss.qss");
    qssFile.open(QFile::ReadOnly);
    if(qssFile.isOpen())
    {
      qss = QLatin1String(qssFile.readAll());
      qApp->setStyleSheet(qss);                        // 使用全局管理对象加载样式表
      qssFile.close();
    }
    /*****************************************/
    Widget w;                                          // Widget 中的所有按钮都会被渲染
    w.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值