【QT】窗口

🎬 个人主页艾莉丝努力练剑
专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • 导入
  • [1 ~> QT窗口预览](#1 ~> QT窗口预览)
    • [1.1 QMainWindow 与 QWidget 的区别](#1.1 QMainWindow 与 QWidget 的区别)
    • [1.2 QMainWindow 核心布局结构](#1.2 QMainWindow 核心布局结构)
    • [1.3 核心组件关系](#1.3 核心组件关系)
  • [2 ~> 菜单栏(QMenuBar)](#2 ~> 菜单栏(QMenuBar))
    • [2.1 基本特性](#2.1 基本特性)
    • [2.2 菜单栏创建流程](#2.2 菜单栏创建流程)
      • [2.2.1 基本创建步骤](#2.2.1 基本创建步骤)
      • [2.2.2 完整代码示例](#2.2.2 完整代码示例)
    • [2.3 高级功能](#2.3 高级功能)
      • [2.3.1 子菜单嵌套](#2.3.1 子菜单嵌套)
      • [2.3.2 添加图标](#2.3.2 添加图标)
      • [2.3.3 分割线](#2.3.3 分割线)
    • [2.4 内存泄漏注意事项](#2.4 内存泄漏注意事项)
  • [3 ~> 工具栏(QToolBar)](#3 ~> 工具栏(QToolBar))
    • [3.1 基本特性](#3.1 基本特性)
    • [3.2 工具栏创建流程](#3.2 工具栏创建流程)
      • [3.2.1 基本创建步骤](#3.2.1 基本创建步骤)
      • [3.2.2 完整代码示例](#3.2.2 完整代码示例)
    • [3.3 与菜单栏共享 QAction](#3.3 与菜单栏共享 QAction)
    • [3.4 多个工具栏与停靠控制](#3.4 多个工具栏与停靠控制)
      • [3.4.1 创建多个工具栏](#3.4.1 创建多个工具栏)
      • [3.4.2 停靠位置与属性控制](#3.4.2 停靠位置与属性控制)
  • [4 ~> 状态栏(QStatusBar)](#4 ~> 状态栏(QStatusBar))
    • [4.1 基本特性](#4.1 基本特性)
    • [4.2 状态栏基本使用](#4.2 状态栏基本使用)
      • [4.2.1 创建与显示临时消息](#4.2.1 创建与显示临时消息)
    • [4.3 向状态栏添加控件](#4.3 向状态栏添加控件)
      • [4.3.1 添加标签和进度条](#4.3.1 添加标签和进度条)
  • [5 ~> 浮动窗口(QDockWidget)](#5 ~> 浮动窗口(QDockWidget))
    • [5.1 基本特性](#5.1 基本特性)
    • [5.2 浮动窗口创建流程](#5.2 浮动窗口创建流程)
      • [5.2.1 基本创建步骤](#5.2.1 基本创建步骤)
      • [5.2.2 完整代码示例](#5.2.2 完整代码示例)
    • [5.3 停靠位置枚举值](#5.3 停靠位置枚举值)
  • [6 ~> 对话框(QDialog)](#6 ~> 对话框(QDialog))
    • [6.1 基本概念](#6.1 基本概念)
    • [6.2 对话框的内存管理](#6.2 对话框的内存管理)
    • [6.3 模态与非模态对话框](#6.3 模态与非模态对话框)
    • [6.4 自定义对话框](#6.4 自定义对话框)
      • [6.4.1 纯代码方式](#6.4.1 纯代码方式)
      • [6.4.2 图形化 ui 方式](#6.4.2 图形化 ui 方式)
    • [6.5 标准内置对话框](#6.5 标准内置对话框)
      • [6.5.1 消息对话框 QMessageBox](#6.5.1 消息对话框 QMessageBox)
      • [6.5.2 颜色对话框 QColorDialog](#6.5.2 颜色对话框 QColorDialog)
      • [6.5.3 文件对话框 QFileDialog](#6.5.3 文件对话框 QFileDialog)
      • [6.5.4 字体对话框 QFontDialog](#6.5.4 字体对话框 QFontDialog)
      • [6.5.5 输入对话框 QInputDialog](#6.5.5 输入对话框 QInputDialog)
  • [7 ~> QT窗口小结](#7 ~> QT窗口小结)
    • [7.1 核心组件总结](#7.1 核心组件总结)
    • [7.2 关键知识点回顾](#7.2 关键知识点回顾)
    • [7.3 开发流程总结](#7.3 开发流程总结)
    • [7.2 关键知识点回顾](#7.2 关键知识点回顾)
    • [7.3 开发流程总结](#7.3 开发流程总结)
  • 结尾


导入

思维导图

导入语

在 Qt 桌面应用开发中,QMainWindow 是构建完整应用程序的核心类。相比于基础的 QWidget,它提供了一套预定义的标准化窗口布局,包含了菜单栏、工具栏、浮动窗口、状态栏和中心部件五大核心区域。这些组件的有机组合,能够快速搭建出符合用户习惯的专业级应用界面,比如我们常用的文本编辑器、图片处理软件、IDE 开发环境等,都是基于 QMainWindow 架构构建的。

本笔记将系统梳理 Qt 窗口开发的全部核心知识点,从主窗口的基本结构入手,逐一详解菜单栏、工具栏、状态栏、浮动窗口的创建与使用方法,最后深入介绍对话框的自定义与标准内置对话框的应用。通过学习这些内容,你将掌握构建完整 Qt 桌面应用界面的全部技能,能够将零散的控件组合成一个功能完善、交互友好的应用程序。


1 ~> QT窗口预览

1.1 QMainWindow 与 QWidget 的区别

  • QWidget:所有用户界面对象的基类,更多作为窗口的组成部分使用,没有预定义的布局结构。
  • QMainWindow:继承自 QWidget,专门为主窗口程序设计,提供了一套完整的标准化布局,包含了开发桌面应用所需的所有标准组件。

1.2 QMainWindow 核心布局结构

QMainWindow 的布局分为六个固定区域,开发者不能直接向其添加布局,必须将内容填充到指定区域:

  • 标题栏(Window Title):系统自带,显示窗口标题和控制按钮。
  • 菜单栏(Menu Bar):位于窗口顶部,全局唯一,包含各功能菜单。
  • 工具栏(Tool Bar Area):位于菜单栏下方,可多个并存,支持停靠和浮动。
  • 浮动窗口区域(Dock Widget Area):围绕中心部件,可放置多个可停靠的子窗口。
  • 中心部件(Central Widget):窗口的核心区域,唯一且必填,用于展示主要内容。
  • 状态栏(Status Bar):位于窗口底部,全局唯一,用于显示程序状态信息。

1.3 核心组件关系

  • QAction:抽象动作类,是菜单和工具栏的核心操作单元。一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,支持设置文本、图标、快捷键和状态提示。
  • QMenu:单个下拉菜单,是菜单栏的子项,点击后展开下拉列表,承载具体的 QAction。
  • QMenuBar:菜单栏容器,管理所有的 QMenu。
  • QToolBar:工具栏容器,管理所有的快捷操作按钮。
  • QDockWidget:浮动窗口容器,可放置辅助功能面板。
  • QStatusBar:状态栏容器,管理状态信息和小控件。
  • QDialog:对话框基类,用于实现短期任务和简洁的用户交互。

2 ~> 菜单栏(QMenuBar)

2.1 基本特性

  • 一个主窗口最多只能有一个菜单栏,位于主窗口顶部、标题栏下方。
  • 菜单栏中包含多个菜单(QMenu),每个菜单中包含多个菜单项(QAction)。
  • 首次调用 QMainWindow::menuBar() 函数时,会自动创建一个菜单栏对象并返回。

2.2 菜单栏创建流程

2.2.1 基本创建步骤

  1. 获取或创建菜单栏对象
  2. 创建顶级菜单(QMenu)
  3. 向菜单中添加菜单项(QAction)
  4. 为菜单项绑定信号槽,实现交互功能

2.2.2 完整代码示例

cpp 复制代码
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void handleNew(); // 新建操作槽函数

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1. 获取菜单栏对象(不存在则自动创建)
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    // 2. 创建顶级菜单
    QMenu* menuFile = new QMenu("文件(&F)"); // &F 设置快捷键 Alt+F
    QMenu* menuEdit = new QMenu("编辑(&E)");
    QMenu* menuView = new QMenu("视图(&V)");

    // 将菜单添加到菜单栏
    menuBar->addMenu(menuFile);
    menuBar->addMenu(menuEdit);
    menuBar->addMenu(menuView);

    // 3. 创建菜单项(QAction)
    QAction* actionNew = new QAction("新建(&N)"); // &N 设置快捷键 Alt+N
    QAction* actionOpen = new QAction("打开(&O)");
    QAction* actionSave = new QAction("保存(&S)");
    QAction* actionExit = new QAction("退出(&X)");

    // 将菜单项添加到菜单
    menuFile->addAction(actionNew);
    menuFile->addAction(actionOpen);
    menuFile->addAction(actionSave);
    menuFile->addSeparator(); // 添加分割线
    menuFile->addAction(actionExit);

    // 4. 绑定信号槽
    connect(actionNew, &QAction::triggered, this, &MainWindow::handleNew);
    connect(actionExit, &QAction::triggered, this, &MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handleNew()
{
    qDebug() << "触发新建操作!";
}

2.3 高级功能

2.3.1 子菜单嵌套

QMenu 本身也可以添加子菜单,形成多级菜单结构:

cpp 复制代码
// 创建父菜单
QMenu* menuParent = new QMenu("父菜单");
menuBar->addMenu(menuParent);

// 创建子菜单
QMenu* menuChild = new QMenu("子菜单");
menuParent->addMenu(menuChild);

// 向子菜单添加菜单项
QAction* action1 = new QAction("菜单项1");
QAction* action2 = new QAction("菜单项2");
menuChild->addAction(action1);
menuChild->addAction(action2);

// 继续嵌套子菜单
QMenu* menuChild2 = new QMenu("子菜单2");
menuChild->addMenu(menuChild2);

2.3.2 添加图标

菜单项和菜单都可以添加图标,需要使用 Qt 的资源系统(qrc)管理图片文件:

cpp 复制代码
// 为菜单项添加图标
QAction* actionOpen = new QAction("打开(&O)");
actionOpen->setIcon(QIcon(":/open.png"));

// 为菜单添加图标
QMenu* menuFile = new QMenu("文件(&F)");
menuFile->setIcon(QIcon(":/file.png"));

注意:如果给菜单栏上的顶级菜单设置图标,文本会被图标覆盖;子菜单的图标和文本会同时显示。

2.3.3 分割线

使用 addSeparator() 函数在菜单中添加分割线,用于对功能相近的菜单项进行分组,提高菜单的可读性:

cpp 复制代码
menuFile->addAction(actionSave);
menuFile->addSeparator(); // 在保存和退出之间添加分割线
menuFile->addAction(actionExit);

2.4 内存泄漏注意事项

  • 如果项目勾选了自动生成 ui 文件,Qt 会自动创建一个 QMenuBar 对象。
  • 如果手动 new QMenuBar() 并调用 setMenuBar(),会导致原来的 QMenuBar 对象脱离 Qt 的对象树,无法被自动释放,造成内存泄漏。
  • 正确做法 :使用 this->menuBar() 获取已存在的菜单栏对象,不存在则自动创建。

3 ~> 工具栏(QToolBar)

3.1 基本特性

  • 工具栏是应用程序中集成各种功能实现快捷键使用的区域,不是必须存在的组件。
  • 一个窗口可以有多个工具栏,支持手动移动位置和浮动。
  • 工具栏元素通常以图标按钮的方式存在,本质上也是 QAction。

3.2 工具栏创建流程

3.2.1 基本创建步骤

  1. 创建 QToolBar 对象
  2. 使用 addToolBar() 将工具栏添加到主窗口
  3. 向工具栏添加 QAction 快捷项
  4. 为 QAction 设置图标和工具提示
  5. 绑定信号槽实现交互功能

3.2.2 完整代码示例

cpp 复制代码
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1. 创建工具栏
    QToolBar* toolBar = new QToolBar();
    this->addToolBar(toolBar); // 添加到主窗口,默认停靠在顶部

    // 2. 创建 QAction
    QAction* actionSave = new QAction("保存");
    QAction* actionOpen = new QAction("打开");

    // 3. 设置图标和工具提示
    actionSave->setIcon(QIcon(":/save.png"));
    actionOpen->setIcon(QIcon(":/open.png"));
    actionSave->setToolTip("点击这里保存文件");

    // 4. 将 QAction 添加到工具栏
    toolBar->addAction(actionSave);
    toolBar->addAction(actionOpen);

    // 5. 绑定信号槽
    connect(actionSave, &QAction::triggered, this, &MainWindow::handleSave);
    connect(actionOpen, &QAction::triggered, this, &MainWindow::handleOpen);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handleSave()
{
    qDebug() << "handleSave";
}

void MainWindow::handleOpen()
{
    qDebug() << "handleOpen";
}

3.3 与菜单栏共享 QAction

同一个 QAction 可以同时添加到菜单和工具栏中,实现功能复用,且触发效果完全一致:

cpp 复制代码
// 创建菜单栏和菜单
QMenuBar* menuBar = this->menuBar();
QMenu* menuFile = new QMenu("文件");
menuBar->addMenu(menuFile);

// 创建 QAction
QAction* actionSave = new QAction("保存");
actionSave->setIcon(QIcon(":/save.png"));

// 同时添加到菜单和工具栏
menuFile->addAction(actionSave);
toolBar->addAction(actionSave);

// 只需要绑定一次信号槽
connect(actionSave, &QAction::triggered, this, &MainWindow::handleSave);

注意:当一个 QAction 同时是 QMenu 和 QToolBar 的子元素时,释放时只会释放一次,不会造成重复释放问题。

3.4 多个工具栏与停靠控制

3.4.1 创建多个工具栏

cpp 复制代码
// 创建两个工具栏
QToolBar* toolBar1 = new QToolBar();
QToolBar* toolBar2 = new QToolBar();

// 添加到主窗口
this->addToolBar(toolBar1);
this->addToolBar(Qt::LeftToolBarArea, toolBar2); // 指定初始停靠在左侧

// 向工具栏添加 QAction
toolBar1->addAction(new QAction("动作1"));
toolBar1->addAction(new QAction("动作2"));
toolBar2->addAction(new QAction("动作3"));
toolBar2->addAction(new QAction("动作4"));

3.4.2 停靠位置与属性控制

cpp 复制代码
// 设置允许停靠的位置:只允许左侧和右侧
toolBar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);

// 设置不允许浮动
toolBar2->setFloatable(false);

// 设置不允许移动(完全固定)
toolBar2->setMovable(false);

停靠位置枚举值

  • Qt::LeftToolBarArea:停靠在左侧
  • Qt::RightToolBarArea:停靠在右侧
  • Qt::TopToolBarArea:停靠在顶部(默认)
  • Qt::BottomToolBarArea:停靠在底部
  • Qt::AllToolBarAreas:以上四个位置都可停靠

4 ~> 状态栏(QStatusBar)

4.1 基本特性

  • 状态栏是应用程序中输出简要信息的区域,一般位于主窗口的最底部。
  • 一个窗口中最多只能有一个状态栏。
  • 可以显示三种类型的消息:
    • 实时消息:如当前程序状态、操作提示
    • 永久消息:如程序版本号、机构名称
    • 进度消息:如进度条提示、百分比提示

4.2 状态栏基本使用

4.2.1 创建与显示临时消息

cpp 复制代码
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 获取状态栏对象(不存在则自动创建)
    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);

    // 显示临时消息,3000ms后自动消失
    statusBar->showMessage("这是一个状态消息", 3000);

    // 永久显示消息(不填第二个参数或填0)
    // statusBar->showMessage("永久显示的消息", 0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

4.3 向状态栏添加控件

状态栏支持添加任意 QWidget 控件,有两种添加方式:

  • addWidget():从左往右添加控件,会被临时消息覆盖
  • addPermanentWidget():从右往左添加控件,不会被临时消息覆盖

4.3.1 添加标签和进度条

cpp 复制代码
#include <QLabel>
#include <QProgressBar>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);

    // 添加标签(左侧)
    QLabel* label = new QLabel("这是一个QLabel");
    statusBar->addWidget(label, 1); // 第二个参数是拉伸系数

    // 添加进度条
    QProgressBar* progressBar = new QProgressBar();
    progressBar->setRange(0, 100);
    progressBar->setValue(50);
    statusBar->addWidget(progressBar);

    // 添加按钮(右侧,永久显示)
    QPushButton* button = new QPushButton("按钮");
    statusBar->addPermanentWidget(button);
}

注意:添加多个控件时,可以通过设置拉伸系数来控制控件的宽度比例。


5 ~> 浮动窗口(QDockWidget)

5.1 基本特性

  • 浮动窗口又称铆接部件或子窗口,是可以停靠在主窗口边缘或独立浮动的窗口。
  • 一个主窗口可以有多个浮动窗口,适合放置辅助功能面板,如日志面板、属性设置面板等。
  • 浮动窗口可以围绕中心部件停靠在四个方向,也可以拖出成为独立窗口。

5.2 浮动窗口创建流程

5.2.1 基本创建步骤

  1. 创建 QDockWidget 对象
  2. 使用 addDockWidget() 将浮动窗口添加到主窗口指定区域
  3. 设置浮动窗口标题
  4. 创建内容容器 QWidget,向其中添加控件
  5. 将内容容器设置到浮动窗口中

5.2.2 完整代码示例

cpp 复制代码
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDockWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1. 创建浮动窗口
    QDockWidget* dockWidget = new QDockWidget();
    // 2. 添加到主窗口左侧
    this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
    // 3. 设置标题
    dockWidget->setWindowTitle("这是浮动窗口");

    // 4. 创建内容容器和布局
    QWidget* container = new QWidget();
    QVBoxLayout* layout = new QVBoxLayout();
    container->setLayout(layout);

    // 向容器中添加控件
    QLabel* label = new QLabel("这是一个QLabel");
    QPushButton* button = new QPushButton("这是按钮");
    layout->addWidget(label);
    layout->addWidget(button);

    // 5. 将容器设置到浮动窗口
    dockWidget->setWidget(container);

    // 设置允许停靠的位置:只允许左侧和顶部
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}

MainWindow::~MainWindow()
{
    delete ui;
}

注意:QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建一个 QWidget,设置布局后再添加其他控件。

5.3 停靠位置枚举值

  • Qt::LeftDockWidgetArea:停靠在左侧
  • Qt::RightDockWidgetArea:停靠在右侧
  • Qt::TopDockWidgetArea:停靠在顶部
  • Qt::BottomDockWidgetArea:停靠在底部
  • Qt::AllDockWidgetAreas:以上四个位置都可停靠
  • Qt::NoDockWidgetArea:不允许停靠,只能浮动

6 ~> 对话框(QDialog)

6.1 基本概念

  • 对话框是 GUI 程序中不可或缺的组成部分,用于实现短期任务或者简洁的用户交互。
  • 对话框通常是一个顶层窗口,出现在程序最上层。
  • Qt 中使用 QDialog 类表示对话框,它继承自 QWidget。
  • Qt 提供了多种内置的标准对话框,也支持自定义对话框。

6.2 对话框的内存管理

每次点击按钮创建新的对话框时,如果不及时释放,会造成内存泄漏。正确的做法是设置对话框在关闭时自动释放:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("对话框的标题");
    dialog->resize(400, 300);
    dialog->show(); // 非模态显示

    // 设置关闭时自动释放
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

错误做法 :在 show() 之后直接 delete dialog,会导致对话框一闪而过。

6.3 模态与非模态对话框

  • 模态对话框 :弹出时用户无法操作父窗口,必须完成对话框内的操作并关闭后才能继续。使用 exec() 方法显示。
  • 非模态对话框 :弹出时用户可以同时操作父窗口。使用 show() 方法显示。
cpp 复制代码
// 模态对话框
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->exec(); // 代码会在这里阻塞,直到对话框关闭

// 非模态对话框
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show(); // 代码继续执行

6.4 自定义对话框

有两种方式可以自定义对话框:纯代码方式和图形化 ui 方式。

6.4.1 纯代码方式

  1. 创建一个继承自 QDialog 的类
  2. 在类的构造函数中创建控件和布局
  3. 绑定信号槽实现交互功能
cpp 复制代码
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget* parent = nullptr);

private slots:
    void handleClose();
};

#endif // DIALOG_H
// dialog.cpp
#include "dialog.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

Dialog::Dialog(QWidget* parent)
    : QDialog(parent)
{
    // 创建布局
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    // 创建控件
    QLabel* label = new QLabel("这是一个对话框", this);
    QPushButton* button = new QPushButton("关闭", this);

    // 添加到布局
    layout->addWidget(label);
    layout->addWidget(button);

    // 绑定信号槽
    connect(button, &QPushButton::clicked, this, &Dialog::handleClose);
}

void Dialog::handleClose()
{
    this->close();
}
// mainwindow.cpp 中调用
#include "dialog.h"

void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);
    dialog->resize(200, 100);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

6.4.2 图形化 ui 方式

  1. 在 Qt Creator 中新建 "Qt 设计师界面类"
  2. 选择 "Dialog without Buttons" 模板
  3. 在 ui 设计器中拖拽控件并布局
  4. 右键点击控件,转到槽函数实现交互功能

6.5 标准内置对话框

Qt 提供了多种常用的标准对话框,无需自定义即可直接使用。

6.5.1 消息对话框 QMessageBox

用于显示提示信息并让用户进行简单选择,支持多种图标和按钮组合。

cpp 复制代码
#include <QMessageBox>
#include <QDebug>

void MainWindow::on_pushButton_clicked()
{
    // 方式一:创建对象并设置属性
    QMessageBox* messageBox = new QMessageBox(this);
    messageBox->setWindowTitle("对话框窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setIcon(QMessageBox::Warning); // 设置图标
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel); // 设置按钮

    // 显示模态对话框,获取用户点击的按钮
    int result = messageBox->exec();
    if (result == QMessageBox::Ok) {
        qDebug() << "OK";
    } else if (result == QMessageBox::Save) {
        qDebug() << "Save";
    } else if (result == QMessageBox::Cancel) {
        qDebug() << "Cancel";
    }

    messageBox->setAttribute(Qt::WA_DeleteOnClose);

    // 方式二:使用静态函数(更简便)
    int result2 = QMessageBox::warning(this, "对话框标题", "对话框文本", QMessageBox::Ok | QMessageBox::Cancel);
    if (result2 == QMessageBox::Ok) {
        qDebug() << "Ok";
    } else if (result2 == QMessageBox::Cancel) {
        qDebug() << "Cancel";
    }
}

图标类型

  • QMessageBox::NoIcon:无图标
  • QMessageBox::Information:信息图标
  • QMessageBox::Warning:警告图标
  • QMessageBox::Critical:严重错误图标
  • QMessageBox::Question:询问图标

6.5.2 颜色对话框 QColorDialog

用于让用户选择颜色,返回 QColor 对象。

cpp 复制代码
#include <QColorDialog>
#include <QDebug>

void MainWindow::on_pushButton_clicked()
{
    // 弹出颜色选择对话框,默认绿色
    QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");
    qDebug() << color;

    // 基于选择的颜色修改窗口背景色
    char style[1024] = {0};
    sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());
    this->setStyleSheet(style);
}

6.5.3 文件对话框 QFileDialog

用于让用户选择文件或保存文件,返回文件路径。

cpp 复制代码
#include <QFileDialog>
#include <QDebug>

void MainWindow::on_pushButton_clicked()
{
    // 打开单个文件
    QString filePath = QFileDialog::getOpenFileName(this, "打开文件", "", "所有文件(*.*);;文本文件(*.txt)");
    qDebug() << "打开文件:" << filePath;

    // 保存文件
    QString savePath = QFileDialog::getSaveFileName(this, "保存文件", "", "所有文件(*.*);;文本文件(*.txt)");
    qDebug() << "保存文件:" << savePath;
}

6.5.4 字体对话框 QFontDialog

用于让用户选择字体,返回 QFont 对象。

cpp 复制代码
#include <QFontDialog>
#include <QDebug>

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    // 弹出字体选择对话框
    QFont font = QFontDialog::getFont(&ok, QFont("华文行楷", 36), this, "选择字体");

    if (ok) {
        qDebug() << "字体:" << font.family();
        qDebug() << "字号:" << font.pointSize();
        qDebug() << "加粗:" << font.bold();
        qDebug() << "倾斜:" << font.italic();

        // 将选择的字体应用到按钮
        ui->pushButton->setFont(font);
    }
}

6.5.5 输入对话框 QInputDialog

用于让用户输入数据,支持整数、浮点数和字符串(下拉选择)。

cpp 复制代码
#include <QInputDialog>
#include <QDebug>

void MainWindow::on_pushButton_clicked()
{
    // 输入整数
    int intValue = QInputDialog::getInt(this, "整数输入", "请输入一个整数:", 0, -100, 100, 1);
    qDebug() << "输入的整数:" << intValue;

    // 输入浮点数
    double doubleValue = QInputDialog::getDouble(this, "浮点数输入", "请输入一个浮点数:", 0.0, -100.0, 100.0, 2);
    qDebug() << "输入的浮点数:" << doubleValue;

    // 下拉选择字符串
    QStringList items;
    items << "选项1" << "选项2" << "选项3" << "选项4";
    QString item = QInputDialog::getItem(this, "条目选择", "请选择一个条目:", items, 0, false);
    qDebug() << "选择的条目:" << item;
}

7 ~> QT窗口小结

Qt 窗口开发的核心是 QMainWindow 类,它提供了一套完整的标准化布局,包含了构建专业桌面应用所需的所有标准组件。通过合理组合这些组件,可以快速搭建出功能完善、交互友好的应用程序。

7.1 核心组件总结

组件 对应类 数量限制 主要作用
菜单栏 QMenuBar 全局唯一 提供结构化的功能访问入口
工具栏 QToolBar 可多个 提供常用功能的快捷访问
浮动窗口 QDockWidget 可多个 放置辅助功能面板
状态栏 QStatusBar 全局唯一 显示程序状态信息
中心部件 QWidget 唯一且必填 展示应用程序的核心内容
对话框 QDialog 无限制 实现短期任务和用户交互

7.2 关键知识点回顾

  1. QAction 的统一作用:QAction 是菜单和工具栏的核心操作单元,一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,避免代码冗余。
  2. 内存管理
    1. 使用 this->menuBar()this->statusBar() 获取已存在的对象,避免手动 new 造成内存泄漏。
    2. 对话框必须设置 Qt::WA_DeleteOnClose 属性,确保关闭时自动释放。
  3. 模态与非模态
    1. 模态对话框使用 exec() 显示,会阻塞代码执行,适合需要用户立即处理的关键操作。
    2. 非模态对话框使用 show() 显示,不会阻塞代码执行,适合辅助功能。
  4. 组件嵌套规则
    1. QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建布局。
    2. 状态栏的 addPermanentWidget() 添加的控件不会被临时消息覆盖。

7.3 开发流程总结

  1. 创建 QMainWindow 主窗口
  2. 设置中心部件,实现核心功能
  3. 创建菜单栏,添加菜单和菜单项
  4. 创建工具栏,添加常用功能的快捷按钮
  5. 创建状态栏,添加状态信息和小控件
  6. 根据需要创建浮动窗口,放置辅助功能面板
  7. 实现对话框,处理用户交互和短期任务
  8. 为所有交互组件绑定信号槽,实现功能逻辑

tusBar | 全局唯一 | 显示程序状态信息 |

| 中心部件 | QWidget | 唯一且必填 | 展示应用程序的核心内容 |

| 对话框 | QDialog | 无限制 | 实现短期任务和用户交互 |

7.2 关键知识点回顾

  1. QAction 的统一作用:QAction 是菜单和工具栏的核心操作单元,一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,避免代码冗余。
  2. 内存管理
    1. 使用 this->menuBar()this->statusBar() 获取已存在的对象,避免手动 new 造成内存泄漏。
    2. 对话框必须设置 Qt::WA_DeleteOnClose 属性,确保关闭时自动释放。
  3. 模态与非模态
    1. 模态对话框使用 exec() 显示,会阻塞代码执行,适合需要用户立即处理的关键操作。
    2. 非模态对话框使用 show() 显示,不会阻塞代码执行,适合辅助功能。
  4. 组件嵌套规则
    1. QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建布局。
    2. 状态栏的 addPermanentWidget() 添加的控件不会被临时消息覆盖。

7.3 开发流程总结

  1. 创建 QMainWindow 主窗口
  2. 设置中心部件,实现核心功能
  3. 创建菜单栏,添加菜单和菜单项
  4. 创建工具栏,添加常用功能的快捷按钮
  5. 创建状态栏,添加状态信息和小控件
  6. 根据需要创建浮动窗口,放置辅助功能面板
  7. 实现对话框,处理用户交互和短期任务
  8. 为所有交互组件绑定信号槽,实现功能逻辑

通过掌握以上知识点,你已经具备了开发完整 Qt 桌面应用界面的能力。在实际开发中,可以根据应用程序的需求,灵活组合这些组件,打造出符合用户习惯的专业级应用。


结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!" "技术之路难免有困惑,但同行的人会让前进更有方向。" |

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【QT】常用控件(三)Qt布局管理器(网格/表单/间隔器)

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
想你依然心痛1 小时前
具身智能全景图:从符号主义到世界模型
microsoft·机器人·具身智能
meilindehuzi_a1 小时前
从零搭建本地 Mock 服务器与异步控制流(async/await)深度架构实践
运维·服务器·架构
程序员二叉1 小时前
【计算机网络】面试全解|OSI/TCPIP、HTTP全版本、HTTPS、DNS一站式梳理
计算机网络·http·面试
RisunJan1 小时前
Linux命令-ntsysv(集中管理系统的各种服务)
linux·运维·服务器
Championship.23.241 小时前
Linux 3.0 USB机制深度解析:USB 3.0支持与传统外设驱动架构
linux·运维·架构·usb
yyuuuzz1 小时前
aws亚马逊云服务的基础认知与常见场景
大数据·运维·服务器·网络·云计算·aws
鼎讯信通1 小时前
DLG-1 高压测试设备,补齐能源电缆运维检测短板
运维·能源
剑神一笑1 小时前
Linux lsblk 命令详解:块设备信息查看与磁盘管理实战
linux·运维·服务器
雪的季节1 小时前
Qt 下 UDP 丢包解决方案 + TCP 粘包完美解决方案
qt·tcp/ip·udp