第一章 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 中用户界面的一个基本组件,它通常继承自 QWidget
。QWidget
是所有可视化窗口部件的基类,所有界面元素如按钮、标签、窗口等都直接或间接继承自 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
(或 QGuiApplication
、QCoreApplication
)实例。qApp
是 Qt 中提供的一个全局宏,它实际上指向当前应用程序的实例对象。它等价于调用 QCoreApplication::instance()
来获取这个应用程序实例。
小结
qApp
是QApplication
实例的全局指针:它指向当前创建的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();
}