在Qt中,创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围:
- MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序,需要这些额外的用户界面元素来提供丰富的功能和交互。
- Widget:这通常是一个简单的窗口,没有内置的菜单栏、工具栏或状态栏。它适合于更简单或专用 的应用程序,不需要复杂的用户界面组件。
MainWindow提供了更全面的框架,而Widget则更适合简单、专注的界面。
QApplication
#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();}
在Qt应用程序中, QApplication a(argc, argv); 这行代码的作用是创建一个 QApplication 类的 实例。这是几乎每个Qt应用程序必须做的第一步,因为它负责管理应用程序的许多核心功能。
下表总结了 QApplication 类在Qt框架中的主要功能和职责:
QApplication 是Qt应用程序的核心,它为应用程序提供了必要的环境和框架,确保GUI组件能够正常 工作并响应用户的操作。
简而言之, QApplication a(argc, argv); 用于初始化Qt应用程序的环境,设置事件循环,并准备应 用程序处理GUI事件。
GUI代表图形用户界面(Graphical User Interface)。它是一种用户界面,允许用户通过图形图标 和视觉指示器(如按钮、标签、窗口等)与电子设备交互,而不是仅仅使用文本命令。GUI使得软 件应用程序更加直观和易于使用,因为它提供了视觉导向的操作方式,用户可以通过点击、拖拽和 输入来操作界面元素,而不需要记忆和输入复杂的命令。GUI是现代计算机和移动应用程序的标准 用户界面类型。
return a.exec()
在Qt应用程序中, QApplication::exec() 函数是用来启动应用程序的事件循环的。当你调用这个函数 时,它会开始处理和分发事件,如用户的点击、键盘输入等。这个函数会一直运行,直到事件循环结 束,通常是因为调用了 QApplication::quit() 函数或者关闭了应用程序的主窗口。简而言之, exec() 是Qt程序中的主循环,负责监听和响应事件,保持应用程序运行直到用户决定退出。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Q_OBJECT
Q_OBJECT 宏是Qt框架中一个非常重要的宏,用于启用Qt对象的元对象系统。当你在Qt中定义一个类 时,如果这个类继承自 QObject 或其子类,并且你想使用Qt的信号和槽机制、国际化、属性系统或其他 Qt元对象系统提供的功能,就必须在类定义中包含 Q_OBJECT 宏。
这个宏允许Qt的元对象编译器(moc)识别并处理这个类,生成额外的代码,这些代码是实现信号和槽 机制以及其他元对象功能所必需的。简单地说, Q_OBJECT 宏为Qt类提供了额外的元数据,使得类能够 完全利用Qt框架的功能。
QT_BEGIN_NAMESPACE
QT_BEGIN_NAMESPACE 是Qt框架中用于支持命名空间的宏定义。Qt使用这些宏来确保其库中的类和函数不会与其他库中的同名类和函数冲突。 QT_BEGIN_NAMESPACE 宏在定义Qt类和函数之前使用,用来指定接下来的代码位于Qt的命名空间中。它通常与 QT_END_NAMESPACE 配对使用,后者标志着命名空间的结束。这种机制对于在大型项目中维护代码的清晰度和防止命名冲突非常重要。
namespace Ui { class Widget; }
在Qt框架中, namespace Ui { class Widget; } 是一种常见的用法,通常出现在使用Qt Designer设 计GUI时自动生成的代码中。这里的 Ui 是一个命名空间,而 class Widget 是一个向前声明,它声明了一个名为 Widget 的类。这种做法允许你在 class Widget 是一个前向声明,它声明 .cpp 源文件中引用由Qt Designer创建的UI界面,而不需 要在头文件中包含完整的UI类定义。这种分离的方法有助于减少编译依赖性并保持代码的清晰和组织。 在你的源文件中,你会创建一个 Ui::Widget 类型的对象来访问和操作UI组件。
简单来说就是,你使用了Qt Designer(用鼠标写代码),不再需要在.cpp中进行引入,可以直接使用按钮之类的(只需要ui->pushButton;)
#include "mainwindow.h"
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) //初始化列表构造
{ui->setupUi(this);//设置QT designer里面的ui关联到widget类的私有变量ui里面
}MainWindow::~MainWindow()
{delete ui;
}
Widget::Widget(QWidget *parent) : QWidget(parent),ui(new Ui::Widget)
代码 : QWidget(parent) 是初始化列表,用于调用基类 它。 ui(new Ui::Widget) 是初始化类内部的 QWidget 的构造函数,并将 parent 传递给 ui 成员变量,这是通过 new 关键字动态分配的。 Ui::Widget 是由Qt Designer工具生成的,用于处理用户界面。这种方式允许将用户界面的设计与后端 逻辑代码分离,有助于提高代码的可维护性和可读性。