【QT5 Widgets示例】记事本:(一)项目创建
文章目录
- 记事本:(一)项目创建
- main.cpp
- notepad.ui
- notepad.h
- notepad.cpp
- notepad.pro
这一系列博客将通过使用C++和Qt Widgets(控件)模块实现一个简单的记事本应用程序。该应用程序的功能包括:新建文件,打开文件,保存文件,另存为,打印;复制,剪切,粘贴;加粗,斜体,下划线,字体;撤回,取消撤回;关于,退出x。
记事本:(一)项目创建
首先,打开QT Creactor,创建记事本项目。选择文件>新建文件或项目>Application(QT)>Qt Widgets Application>choose,然后按照向导的说明进行操作即可。
在“类信息”对话框中,键入Notepad作为类名,并选择QMainWindow作为基类。
Qt Widgets Application向导创建了一个项目,其中包含一个主源文件和一组指定用户界面的文件:
- notepad.pro:这个文件是 Qt Creator 或 qmake 工具用于构建项目的核心配置文件。它包含了项目名称、源文件列表、依赖的库、编译选项等关键信息。
- main.cpp:应用程序的主源文件。main.cpp 是程序的入口点,包含了 main 函数。这个函数负责初始化 QApplication 对象,创建并显示主窗口(在这个项目中是 Notepad 类的实例),并进入事件循环。
- notepad.cpp:Notepad类的源文件。这个文件包含了 Notepad 类的成员函数的具体实现,用于实现记事本应用的各种功能。
- notepad.h:Notepad类的头文件。notepad.h 声明了 Notepad 类及其成员变量和成员函数。
- notepad.ui:这个文件是由 Qt Designer 创建的,用于定义记事本的图形用户界面。
这些文件都附带了必要的代码,以便构建和运行项目。运行后效果如下:
下面将对各个文件进行介绍。
main.cpp
//以下行包括Notepad widget和QApplication的头文件。所有Qt类都有一个对应的头文件。
#include "notepad.h"
#include <QApplication>
// 定义了主函数,它是所有基于C和C++的应用程序的入口点:
int main(int argc, char *argv[])
{
QApplication EditorApp(argc, argv);
Notepad Editor;
Editor.show();
return EditorApp.exec();
}
QApplication EditorApp(argc, argv);
创建了一个QApplication对象。此对象管理应用程序范围内的资源,是运行任何使用Qt widget的Qt程序所必需的。
Notepad Editor;
创建Notepad对象。向导已经为这个对象创建了相应的类头文件,源文件和UI文件。Qt中用户界面所包含的视觉元素被称为widget (控件),例如文本编辑框、滚动条、标签和按钮等等。
Editor.show();
会在屏幕上的窗口中显示记事本widget。widget默认是不可见的;show()
函数可以使小部件变得可见。
return EditorApp.exec();
使 QApplication 进入其事件循环。当Qt应用程序运行时,会生成事件并将其发送到应用程序的widget。事件的示例包括鼠标按下和键盘按键。
notepad.ui
Qt Designer是一款可视化UI设计工具,用于快速创建Qt程序的用户界面,而这些界面都被保存为XML格式的文件,文件扩展名为.ui。当你在Qt Creator中打开notepad.ui文件时,它会自动在集成的Qt Designer中打开。
在这个文件上可以设计应用程序的界面。
可以在代码编辑器中查看生成的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="Notepad">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
包含XML声明,该声明指定了文档中使用的XML版本和字符编码:
<ui version="4.0">
指的是该UI文件遵循的Qt Designer UI文件格式版本。
文件的其余部分指定了一个定义记事本部件的ui元素:
当你构建应用程序时,Qt Creator会启动Qt用户界面编译器(uic),该编译器会读取notepad.ui
文件并创建一个对应的C++头文件,即ui_notepad.h
,用于与Notepad
类进行交互。
notepad.h
向导为记事本类生成了一个头文件,其中包含了必要的#include指令、一个构造函数、一个析构函数以及一个Ui对象。该文件看起来如下:
// 防止头文件的内容在同一个编译单元中被多次include
#ifndef NOTEPAD_H
#define NOTEPAD_H
#include <QMainWindow>
// 在Ui命名空间中声明了Notepad类,这是uic工具从.Ui文件生成的Ui类的标准命名空间
QT_BEGIN_NAMESPACE
namespace Ui { class Notepad; }
QT_END_NAMESPACE
class Notepad : public QMainWindow
{
// 这个宏为普通的C++类增加了多种功能,常用的是信号与槽(Signals & Slots)功能。
Q_OBJECT
public:
// 构造函数,`parent = nullptr`表示该部件没有父级(它是顶级部件)。
Notepad(QWidget *parent = nullptr);
~Notepad(); // 析构函数
private:
Ui::Notepad *ui; // 指向记事本UI类的指针
};
#endif // NOTEPAD_H
notepad.cpp
向导为Notepad 类生成的源文件如下:
// 包含由向导生成的Notepad类头文件和由uic工具生成的UI头文件
#include "notepad.h"
#include "ui_notepad.h"
// 定义构造函数
Notepad::Notepad(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Notepad)
{
ui->setupUi(this);
}
// 定义析构函数
Notepad::~Notepad()
{
delete ui; // 删除ui
}
QMainWindow(parent),
调用了QMainWindow
构造函数,QMainWindow
是Notepad
类的基类:
ui(new Ui::Notepad)
创建了UI类实例,并将其赋值给ui成员:
ui->setupUi(this);
将由Qt Designer创建的UI布局和控件初始化并应用到当前的窗口或对话框实例(Notepad实例)上。
notepad.pro
向导为我们生成以下项目文件notepad.pro,这个文件是qmake项目文件,用于定义如何构建和部署Qt应用程序。
# 指定项目模板为应用程序
TEMPLATE = app
# 设置目标应用程序的名称
TARGET = notepad
# 添加所需的Qt模块
# core模块提供非GUI功能,如字符串处理、文件访问等
# gui模块提供窗口系统集成、事件处理、2D图形等功能
QT += core gui
# 如果Qt的主版本号大于4,则额外添加widgets模块
# widgets模块提供了一套UI元素来创建经典桌面风格的用户界面
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 配置项目以使用C++11标准
CONFIG += c++11
# 你可以让使用了已弃用API的代码无法编译通过
# 为了实现这一点,可以取消注释以下行
# DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # 禁用Qt 6.0.0之前弃用的所有API
# 指定源文件
SOURCES += \
main.cpp \
notepad.cpp
# 指定头文件
HEADERS += \
notepad.h
# 指定Qt Designer表单文件
FORMS += \
notepad.ui
# 默认部署规则
# 对于qnx平台,将目标文件放置在/tmp/$${TARGET}/bin目录下
qnx: target.path = /tmp/$${TARGET}/bin
# 对于非Android的Unix平台,将目标文件放置在/opt/$${TARGET}/bin目录下
else: unix:!android: target.path = /opt/$${TARGET}/bin
# 如果target.path不为空,则添加安装目标
!isEmpty(target.path): INSTALLS += target
参考:
https://doc.qt.io/qt-5/qtwidgets-tutorials-notepad-example.html