【QT】项目介绍与入门

项目创建

创建项目

选择路径

选择核心类

QWindow

定位:QWindow 是 Qt 中最底层的窗口类,直接与操作系统的原生窗口(Native Window)交互,属于 Qt GUI 模块(而非 Widgets 模块)。
特点:
轻量级,不依赖 QWidget,适合需要直接操作 OpenGL、Vulkan 或其他图形 API 的场景。
没有内建的控件(如按钮、文本框等),仅提供基础的窗口管理(如尺寸、位置、标题等)。
通常用于高性能图形渲染(如游戏、3D 应用)。

QWidget

定位:QWidget 是 Qt Widgets 模块的基础类,用于构建传统的桌面应用程序界面。它是 QWindow 的封装,提供了更高级的功能(如布局、事件处理、样式等)。
特点:
支持丰富的控件(按钮、标签、输入框等)和布局管理。
可以是顶级窗口(如主窗口),也可以是子控件(嵌入其他 QWidget 中)。
依赖 Qt Widgets 模块,适用于复杂的交互式界面。

QDialog

定位:QDialog 是 QWidget 的子类,专为对话框设计(如模态/非模态对话框、消息框等)。
特点:
默认提供对话框特有的行为(如按钮盒、返回值处理)。
可以是模态(阻塞父窗口)或非模态(与父窗口并行)。
通常用于短期交互(如设置、确认、文件选择等)。

选择wiget

项目文件介绍

以下是生成的项目文件

CMakeLists.txt

作用:项目的构建配置文件,用于 CMake 构建系统。

Forms/widget.ui

作用:Qt Designer 生成的 UI 文件(XML 格式),定义窗口的界面布局(如按钮、文本框等)。

Header Files/widget.h

作用:声明窗口类(如 Widget)的成员变量和函数。

Source Files/widget.cpp

作用:实现 Widget 类的逻辑。

Source Files/main.cpp

作用:程序入口,创建主窗口并启动事件循环。
如何编辑:
使用 Qt Designer 工具可视化编辑,或直接修改 XML。

first_zh_CN.ts

作用:Qt 的翻译文件(中文),用于国际化(i18n)。
生成与使用:
在代码中用 tr() 包裹需要翻译的字符串。
使用 lupdate 工具提取字符串到 .ts 文件:

widget.h

头文件保护宏

作用:防止头文件被重复包含,避免编译错误。
宏名称通常与文件名一致(如 WIDGET_H 对应 widget.h)。

包含必要的 Qt 头文件

作用:引入 Qt 的基础窗口类 QWidget,作为当前类的父类。

命名空间声明

Ui::Widget 是一个前置声明(forward declaration),表示存在一个名为 Widget 的类在 Ui 命名空间中。
这个类由 Qt Designer 自动生成(对应 widget.ui 文件),实际定义在编译后生成的 ui_widget.h 中。
为什么不用 #include "ui_widget.h"?
使用前置声明可以加快编译速度,减少头文件依赖。

主类定义

Q_OBJECT 宏
必须出现在所有使用 信号槽(Signals/Slots) 或 Qt 元对象系统 的类中。
作用:启用动态属性、信号槽、国际化(tr())等功能。
构造函数
参数 parent 指定父窗口(默认为 nullptr,表示顶级窗口)。
初始化时会通过 ui->setupUi(this) 加载关联的 .ui 文件(在 widget.cpp 中实现)。
私有成员 ui
类型为 Ui::Widget*,指向由 widget.ui 生成的界面类实例。
在析构函数中需要手动释放(delete ui)。

main.cpp

头文件

main函数

QApplication a(argc, argv):必须第一个创建,处理命令行参数(如 -style 设置主题)。
a.exec():启动事件循环,阻塞直到窗口关闭。

加载翻译文件

创建并显示主窗口

Widget 是自定义的窗口类(继承自 QWidget)。
show() 使窗口可见。如果是模态对话框,需用 exec() 替代。

widget.cpp

头文件包含

ui_widget.h:
由 widget.ui 文件通过编译过程(如 uic 工具)自动生成。
包含 Ui::Widget 类的定义,其中声明了 UI 中的所有控件(如按钮、标签等)。

构造函数

QWidget(parent), ui(new Ui::Widget)初始化列表
new Ui::Widget
动态创建 Ui::Widget 对象,该对象管理从 widget.ui 中定义的所有控件。
ui->setupUi(this)
将 UI 文件中的布局和控件实例化,并挂载到当前窗口(this)。
内部会递归创建所有子控件(如 QPushButton、QLabel),并设置它们的属性和布局。

析构函数

设计师界面

双击widget.ui进入

Layouts(布局管理器)

作用:自动管理控件的位置和大小,确保窗口缩放时界面保持合理排列。

vertical Layout:垂直排列控件。
Horizontal Layout:水平排列控件。
GridLayout:网格形式排列控件。
FormLayout:表单式布局(标签 + 输入框)。

Spacers(间隔器)

作用:在布局中填充空白空间,调整控件间的间距。

Horizontal Spacer:水平间隔。
Vertical Spacer:垂直间隔。
示例场景:
让一组按钮靠右对齐,左侧留空。

Buttons(按钮类控件)

PushButton:普通按钮。
ToolButton:工具按钮(常用于工具栏)。
RadioButton:单选按钮。
CheckBox:复选框。
CommandLinkButton(命令链接按钮),Windows Vista 风格按钮,用于向导或设置界面。
QDialogButtonBox(对话框按钮盒)标准化对话框按钮布局(如 OK/Cancel)。

Item Widgets

QListView(列表视图)
作用:以一维列表形式显示数据(如文件列表)。
QTreeView(树形视图)
作用:以层次化树形结构显示数据(如文件目录)。
QTableView(表格视图)
作用:以二维表格形式显示数据(如 Excel 表格)。
QColumnView(列视图)
作用:类似 macOS Finder 的多列导航视图,每列显示一个层级的数据。
QUndoView(撤销视图)
作用:可视化显示 QUndoStack 中的撤销/重做操作历史。

Model和Item核心区别数据与显示的分离

(1) Model-Based 控件(模型-视图架构)
设计理念:
数据(Model) 和 显示(View) 完全分离,通过 Delegate 控制渲染和编辑。
一个模型(QAbstractItemModel)可以绑定到多个视图(如同时用 QTableView 和 QTreeView 显示同一数据)。
为什么需要 Model?
灵活性:模型可以动态生成数据(如数据库查询、网络请求),无需预先加载所有内容。
性能:仅处理当前可见区域的数据(适合大规模数据,如 100 万行表格)。
标准化接口:所有视图通过统一的 QAbstractItemModel API 访问数据,与具体实现解耦。

(2) Item-Based 控件(项控件)
设计理念:
每个控件(如 QListWidget)内置一个默认的项模型,直接操作项(QListWidgetItem)。
数据与显示强耦合,适合简单场景。
为什么不需要显式 Model?
易用性:控件内部已经封装了模型(如 QListWidget 内部使用 QStandardItemModel),开发者无需关心模型细节。
快速开发:直接通过 addItem()、item() 等方法操作项,适合静态或少量数据。

对比表格

特性 Model-Based 控件 Item-Based 控件
数据量 适合动态/大规模数据 适合静态/少量数据
灵活性 高(自定义模型、多视图同步) 低(功能固定)
性能 更优(懒加载数据) 较差(需预先加载所有项
代码复杂度 较高(需理解模型架构) 较低(直接操作项)
典型控件 QListView + QAbstractItemModel QListWidget + QListWidgetItem

Containers(容器类控件)

QGroupBox
带标题的分组框,用于逻辑归类相关控件(如设置选项)。
QScrollArea
滚动区域,为超出显示范围的内容(如图片、列表)添加滚动条。
QToolBox
折叠式工具箱,以垂直抽屉形式组织多组工具或控件。
QTabWidget
多标签页容器,通过标签切换不同内容界面(如浏览器标签)。
QStackedWidget
堆叠式容器,同一时间只显示一个子控件(如向导页面)。
QFrame
基础框架,可设置边框样式(如分隔线、面板效果)。
QWidget
所有控件的基类,可作为空白容器或自定义界面的画布。
QMdiArea
多文档界面区域,支持子窗口(如 IDE 的多文件编辑)。
QDockWidget
可停靠窗口,允许用户拖动并吸附到主窗口边缘(如 IDE 的工具面板)。
QAxWidget
ActiveX 控件容器,用于嵌入 Windows 平台的 COM 组件(如 WebBrowser 控件)。

Input Widgets(输入类控件)

下拉选择类
QComboBox:下拉选择框(单选)
QFontComboBox:字体选择下拉框

文本输入类
QLineEdit:单行文本输入框
QTextEdit:支持富文本的多行编辑器
QPlainTextEdit:纯文本多行编辑器

数字输入类
QSpinBox:整数输入框(带增减按钮)
QDoubleSpinBox:浮点数输入框

时间日期类
QTimeEdit:时间选择输入框
QDateEdit:日期选择输入框
QDateTimeEdit:日期时间选择输入框

调节控件类
QDial:圆形旋钮调节器
QScrollBar:滚动条(分水平/垂直)
QSlider:滑块调节器(分水平/垂直)

特殊输入
QKeySequenceEdit:快捷键输入框

Display Widgets(显示类控件)

基础显示
QLabel:文本/图片显示标签
QTextBrowser:只读富文本显示框(支持超链接)

图形显示
QGraphicsView:2D图形显示画布(需配合QGraphicsScene使用)
QOpenGLWidget:OpenGL渲染窗口

特殊显示
QCalendarWidget:日历显示组件
QLCDNumber:LCD数字显示屏(类似电子表样式)
QProgressBar:进度条显示(支持水平/垂直方向)

分隔与嵌入
QFrame(Horizontal/Vertical Line):水平/垂直分隔线
QOpenGLWidget(OpenGL 窗口控件)用于在 Qt Widgets 应用程序中嵌入 OpenGL 渲染,支持 2D/3D 图形绘制。
QQuickWidget:用于在Widgets应用中嵌入QML界面

简易的页面

用设计师界面创建一个简单的页面

各组件在代码中都有对应的对象和类
点击组件会高亮显示对应

修改名称便于写代码

右下角是对象的属性,如大小、位置等

信号与槽

在QT界面中,信号与槽完成界面的相应。比如当点击按钮时,会发出一个信号,槽会接收对应的信号并执行相应的函数

实现一:右键转到槽

右键转到槽

选择信号

1.QAbstractButton(按钮类信号)
clicked()
按钮被点击时触发(无状态参数)。
示例:普通按钮的点击响应。
clicked(bool checked)
按钮被点击时触发,并传递当前选中状态(适用于可选中按钮如 QRadioButton)。
pressed()
按钮被按下(鼠标/触摸未释放)时触发。
released()
按钮被释放时触发。
toggled(bool checked)
按钮的选中状态改变时触发(如复选框勾选/取消勾选)。

  1. QWidget(窗口控件信号)
    customContextMenuRequested(QPoint pos)
    请求上下文菜单时触发(通常右键点击控件),pos 为点击位置的坐标。
    windowIconChanged(const QIcon &icon)
    窗口图标变更时触发。
    windowIconTextChanged(const QString &text)
    窗口图标文本变更时触发(罕见使用)。
    windowTitleChanged(const QString &title)
    窗口标题变更时触发。
  1. QObject(基础对象信号)
    destroyed()
    对象被销毁时触发(无参数)。
    destroyed(QObject *obj)
    对象被销毁时触发,并传递对象指针(可用于日志记录)。
    objectNameChanged(const QString &name)
    对象的 objectName 属性变更时触发。

选择点击信号,会自动创建一些函数
声明

private slots: 是一个访问修饰符和槽函数声明区域的组合,用于在类的头文件中声明私有槽函数。

定义

引入一个多线程头文件

我希望输入框中输入后,点击确定可以完成相应命令

auto program = ui->cmdLine->text();
从 Qt 用户界面中获取用户输入的文本内容
ui->cmdLine是文本框->text()是将文本框中的转换为text
然后存入program中,自动推导类型为QString

QProcess *myProcess = new QProcess(this);
创建一个 QProcess 对象,用于启动和管理外部进程。
QProcess:Qt 提供的类,用于启动和控制外部程序。
new QProcess(this):动态分配内存创建对象。
this:指定父对象为当前类(通常是 QWidget 或 QMainWindow),当父对象销毁时自动清理 QProcess 对象,避免内存泄漏。

myProcess->start(program);
用线程对象启动program对象。
start():尝试执行 program 中的命令或程序路径。
如果 program 是:
可执行文件路径(如 "C:/Windows/notepad.exe"):直接启动该程序。
系统命令(如 "ls -l"):需结合 shell 调用(Windows 用 cmd /C,Linux/macOS 用 /bin/sh -c)。

运行程序

输入notepad启动记事本,成功打开

实现二:不右键,而是直接代码

记住组件对应的对象

在析构中连接信号与槽

connect(谁发出信号,发出什么信号,谁处理信号,如何处理)
再该代码中,界面的文本框发出信号,发出的信号是回车,this指针指向基类Widget处理信号,用widget中的on_commitButton_clicked()函数处理

SIGNAL() 和 SLOT()是预处理宏,用于传输信号和函数

在QT5+中,新语法取代了宏的编译。
旧式语法在编译时不会检查信号/槽是否存在或参数匹配,容易隐藏错误。新式语法更安全。

&QLineEdit::returnPressed
&QLineEdit::returnPressed 表示获取 QLineEdit 类中 returnPressed函数
并使用该类中的on_commitButton_clicked

运行代码,在文本框中回车后就会运行刚刚写好的on_commitButton_clicked函数启动对应对象

声明一个函数

定义

该函数直接将Widget关闭实现了窗口的关闭

连接

运行,点击取消后自动关闭

简单的功能直接使用lambda表达式

对于以上实现的功能太过简单,而代码写起来这里声明这里定义太过兴师动众
直接使用lambda表达式在connect中就可以完成目标

connect(谁发出信号,发出什么信号,lambda)
在lambda中捕捉谁处理,函数体中负责如何处理

我希望点击浏览出现一个弹窗
先调用一个头文件

include 用于引入 QMessageBox 类。QMessageBox 是一个常用的对话框组件,用于向用户显示提示信息、警告、错误消息或询问用户选择(如“确定”或“取消”)。

函数体代码如下

QMessageBox::information(QWidget *parent, const QString &title, const QString &text);
parent:父窗口指针(可选,通常为 this 或 nullptr)。
title:对话框标题。
text:对话框显示的消息内容。

运行点击浏览

posted @ 2025-05-02 20:59  plusu  阅读(246)  评论(0)    收藏  举报