在之前的学习中,我们都是基于 QWidget(控件)展开的。QWidget 既可以作为独立窗口,更多时候则是作为其他窗口的组成部分。接下来,我们将学习一个完整的 Qt 窗口具体形态 ------ QMainWindow。当创建 Qt 项目时,我们可在 QWidget、QMainWindow、QDialog 三者中任选其一作为基础,而 Qt 窗口的实现,主要依赖 QMainWindow 类。
QMainWindow 是为用户提供主窗口程序的类,它继承自 QWidget 类,并且自带一个预定义布局。该类包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件,dock widgets)、一个状态栏(status bar)和一个中心部件(central widget),是文本编辑器、图片编辑器等众多应用程序的开发基础。如下图所示,为 QMainWindow 中各组件的具体位置。

下面,我将一一介绍Qt窗口中的这些布局!
一:菜单栏
1.1:添加菜单栏/菜单/菜单项
在 Qt 中,菜单栏(Menu Bar)是 QMainWindow 窗口的重要组成部分,由 QMenuBar 类实现,一个主窗口最多只能有一个,位于窗口顶部、标题栏下方。它是一组下拉菜单的集合,其中包含菜单,菜单下又有具体菜单项,用于组织和呈现应用程序的各类功能操作,方便用户快速访问和执行命令。例如文本编辑器类应用中,菜单栏通常有 "文件""编辑""格式""工具""帮助" 等菜单,每个菜单下包含 "新建""打开""保存""复制""粘贴" 等操作选项,让用户能直观、有条理地使用功能。具体如下所示:

下面我们就通过具体的代码来认识菜单栏/菜单/菜单项,如同前面学习的控件一样,我们一般我们有两种方式来实现,具体如下所示:

在可视化 UI 界面中创建菜单的方式,能帮助开发者快速构建具有层级结构的功能导航,是 Qt 界面开发中高效组织应用功能的常用手段。但这种方式也存在不足,比如只能输入字母而无法输入汉字,因此通过代码创建会更便于我们控制。接下来将通过代码进行创建,具体如下所示:
cpp
#include "my_mainwindow.h"
#include "ui_my_mainwindow.h"
#include <QDebug>
#include <QMenuBar>
My_MainWindow::My_MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::My_MainWindow)
{
ui->setupUi(this);
//创建菜单栏,并把菜单栏放入到窗口
QMenuBar*my_menubar= new QMenuBar();
this->setMenuBar(my_menubar);
//创建菜单
QMenu* my_menu_1 = new QMenu("文件");
QMenu* my_menu_2 = new QMenu("编辑");
QMenu* my_menu_3 = new QMenu("视图");
//创建菜单后我们还需要将其设置进菜单栏中
my_menubar->addMenu(my_menu_1);
my_menubar->addMenu(my_menu_2);
my_menubar->addMenu(my_menu_3);
//创建菜单项,设置进某一个菜单
QAction*action1=new QAction("新建");
QAction*action2=new QAction("保存");
QAction*action3=new QAction("另存为");
QAction*action4=new QAction("关闭");
//将创建好的菜单项加入到指定菜单
my_menu_1->addAction(action1);
//在菜单项一和菜单项二之间画上分隔符
my_menu_1->addSeparator();
my_menu_1->addAction(action2);
my_menu_1->addAction(action3);
//在菜单项三和菜单项四之间画上分隔符
my_menu_1->addSeparator();
my_menu_1->addAction(action4);
//给菜单项绑定槽函数,可以使用回调函数/lambda表达式,也可以使用内置方法,
connect(action1,&QAction::triggered,this,&My_MainWindow::handle);
connect(action2,&QAction::triggered,this,[](){qDebug()<<"lambda:保存!!!";});
connect(action4,&QAction::triggered,this,&My_MainWindow::close);
}
void My_MainWindow::handle()
{
qDebug()<<"handle():新建!!!";
}
My_MainWindow::~My_MainWindow()
{
delete ui;
}

如上图所示,菜单栏的创建可借助 QMainWindow 类提供的 menuBar () 函数实现,再通过 setMenuBar 将菜单栏放到窗口中。创建菜单则可通过 QMenu 提供的 addMenu () 函数来添加。在 Qt 中没有专门的菜单项类,而是通过 QAction 类抽象出公共动作,用于在菜单中添加菜单项。需要注意的是,QAction 既可以供菜单栏使用,也可以供工具栏使用。此外,在菜单项之间可添加分割线,这是通过 QMenu 类的 addSeparator () 函数实现的。
但是在 Qt 中创建菜单栏需要注意:
若项目未勾选自动生成 ui 文件,可直接新建 QMenuBar 并通过 setMenuBar 放入窗口;但如果勾选了自动生成 ui 文件,Qt 会默认生成一个 QMenuBar,此时若再新建并设置,会导致旧的 QMenuBar 脱离对象树,引发内存泄露。尽管如今计算机内存充裕,这种内存泄露影响不大,但在服务器程序等对内存要求严格的场景(服务器需处理大量请求且长期运行,内存泄露容易积累成严重问题),规范代码就显得尤为重要。规范的做法是使用 this->menuBar () 函数,该函数会判断 QMenuBar 是否存在:若存在则直接获取返回,若不存在则新建后返回。这样既能避免内存泄露,又能保证对象始终在 Qt 的对象树上,使代码更规范。

1.2:设置菜单快捷键
和给常用控件设置快捷键类似,我们也能为菜单和菜单项设置快捷键。日常中,打开文件等操作常可通过 ALT + 符号使用菜单或菜单项的快捷键,下面我们就来为菜单和菜单项设置快捷键,具体如下所示:

在 Qt 中,为菜单或菜单项设置快捷键可通过 QAction 类实现,主要有两种方式:一是构造 QAction 时指定,即创建菜单项对应的 QAction 时,直接在构造函数中通过 & 符号指定(& 后的字母会作为 Alt 组合键);二是通过 setShortcut () 函数设置,即对已创建的 QAction,使用该函数明确指定,且支持 Ctrl、Shift 等组合键。我们这里使用的是第一种方式,相较于第二种方式更方便简洁,第二种方式在前面给控件设置快捷键使用过,这里就不介绍了!
1.3:添加子菜单/图标
刚才上述我们展示的是菜单栏->菜单->菜单项,但是有时候菜单里面我们也需要添加子菜单,形成
菜单栏->菜单->子菜单->菜单项这样的形式,而在 Qt 中,为菜单添加子菜单可通过 QMenu 的 addMenu() 函数实现,本质是在一个菜单中嵌套另一个菜单,形成层级结构。具体如下所示;

这样,我们就可以通过添加子菜单/菜单项从而形成层状结构,同时我们也可以为这些菜单/菜单项设置图标,具体如下所示:

基本上和之前控件设置图标一样,使用resource文件来管理图标,然后通过setIcon方法设置,具体如上所示!
二:工具栏
2.1:添加工具栏以及设置图标
在 Qt 中,工具栏(QToolBar)是一种可停靠的窗口部件,主要用于提供快速访问常用命令或功能的便捷入口。它通常包含一系列工具按钮(QToolButton)、下拉菜单、分隔符等元素,外观上类似简化的菜单栏,但其灵活性更高。
它是应用程序中集成各种功能实现快捷键使用的⼀个区域。可以有多个,也可以没有,它并不是 应⽤程序中必须存在的组件。它是⼀个可移动的组件,它的元素可以是各种窗⼝组件,它的元素通常 以图标按钮的⽅式存在。
总之,Qt 的工具栏是提升用户操作效率的重要部件,尤其适合放置高频使用的功能,其灵活的停靠特性也让界面设计更具适应性。如下图为⼯具栏的⽰意图:

cpp
#include "my_mainwindow.h"
#include "ui_my_mainwindow.h"
#include <QDebug>
#include <QToolBar>
My_MainWindow::My_MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::My_MainWindow)
{
ui->setupUi(this);
//创建菜单栏
QMenuBar*my_menubar1=this->menuBar();
this->setMenuBar(my_menubar1);
//创建菜单
QMenu*my_menu=new QMenu("菜单一");
my_menubar1->addMenu(my_menu);
//创建两个工具栏
QToolBar*my_toolbar1= new QToolBar();
this->addToolBar(my_toolbar1);
QToolBar*my_toolbar2= new QToolBar();
this->addToolBar(my_toolbar2);
//创建菜单项
QAction*action_1=new QAction("菜单项一");
QAction*action_2=new QAction("菜单项二");
QAction*action_3=new QAction("菜单项三");
//把菜单项设置进工具栏中
my_toolbar1->addAction(action_1);
my_toolbar1->addAction(action_2);
my_toolbar2->addAction(action_3);
//把菜单项也设置进菜单中
my_menu->addAction(action_1);
my_menu->addAction(action_2);
my_menu->addAction(action_3);
//绑定槽函数,点击菜单中的菜单项和点击工具栏中的菜单项都是一个相同的回应
connect(action_1,&QAction::triggered,this,&My_MainWindow::handle1);
connect(action_2,&QAction::triggered,this,&My_MainWindow::handle2);
connect(action_3,&QAction::triggered,this,&My_MainWindow::handle3);
}

如上所示,以上便是工具栏的基本创建与使用方法。在 Qt 中,菜单栏通过 setMenuBar 方法添加,一个应用程序只能有一个菜单栏,若重复设置,新的菜单栏会替换旧的;而工具栏通过 addToolBar 方法添加,支持存在多个,重复设置时会新增工具栏而非替换已有。此外,菜单项 QAction 既可以添加到菜单中,也能添加到工具栏里,点击时它们会绑定同一个槽函数,产生相同的响应效果。同时,每个工具栏前都带有标识符,将鼠标放在上面即可拖拽,以此设置其停靠位置或使其成为浮动窗口。不仅如此,工具栏中的菜单项我们也可以为其设置图标,具体如下所示:

如上所述,设置工具栏图标的方式与设置菜单图标相同,仍是通过 QIcon 对象和 setIcon 方法来实现。设置图标后,工具栏中相应元素将只显示图标而不再显示文本,但这并不意味着原本设置的菜单项文本消失了 ------ 当鼠标放置在图标上时,会出现基于 tooltip 属性的提示信息,而该提示信息正来源于之前设置的文本内容。
2.2:设置停靠、浮动。移动
前面我们提到,工具栏可通过拖拽改变停靠或浮动位置,而其停靠位置的设置有两种方式:一种是在创建工具栏时直接指定,另一种是通过 QToolBar 类的 setAllowedAreas () 函数进行设置。
方式一为在创建工具栏的同时指定停靠位置。创建时可直接设置工具栏的位置,默认情况下它会显示在窗口最上方。
可设置的位置包括:Qt::LeftToolBarArea(停靠在左侧) Qt::RightToolBarArea(停靠在右侧)
Qt::TopToolBarArea(停靠在顶部)Qt::BottomToolBarArea(停靠在底部)
Qt::AllToolBarAreas(以上四个位置均可停靠);
具体如下所示:

如前所述,我们可以设置工具栏的初始位置,但这仅为初始状态,工具栏仍可被拖拽到上下左右各位置或成为浮动窗口。接下来,可通过 setAllowedAreas () 函数指定其允许停靠的位置,以此限制它在上下左右方向的拖拽移动。同时,工具栏的浮动属性可通过 QToolBar 类的 setFloatable () 函数设置,该函数原型为 void setFloatable (bool floatable),借助它能限制工具栏浮动;此外,工具栏的移动属性可通过 QToolBar 类的 setMovable () 函数设置,其原型为 void setMovable (bool movable),通过该函数可限制工具栏移动。具体情况如下所示:
cpp
ui->setupUi(this);
//创建两个工具栏
QToolBar*my_toolbar1= new QToolBar();
QToolBar*my_toolbar2= new QToolBar();
//在设置工具栏时设置其初始位置,
this->addToolBar(Qt::LeftToolBarArea,my_toolbar1);//初始位置在左侧
this->addToolBar(Qt::RightToolBarArea,my_toolbar2);//初始位置在右侧
//指定工具栏能够停靠的位置
my_toolbar1->setAllowedAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea);//只允许停靠在顶部和左侧
my_toolbar2->setAllowedAreas(Qt::TopToolBarArea | Qt::RightToolBarArea);//只允许停靠在顶部和右侧
//设置工具栏是否可以浮动
my_toolbar1->setFloatable(false);
my_toolbar2->setFloatable(false);
//设置不允许移动
// my_toolbar1->setMovable(false);
// my_toolbar2->setMovable(false);
//创建菜单项
QAction*action_1=new QAction("菜单项一");
QAction*action_2=new QAction("菜单项二");
//把菜单项设置进工具栏中
my_toolbar1->addAction(action_1);
my_toolbar2->addAction(action_2);
}
这些内容都很好理解,但有一点需要说明:如果将工具栏设置为不可移动状态,那么设置其停靠位置的操作将不会生效。因此,工具栏的移动属性设置类似于一个总开关,决定着停靠位置设置能否生效。
三:状态栏
在应用程序中,状态栏是用于输出简要信息的区域,通常位于主窗口的最底部,且一个窗口最多只能有一个状态栏。在 Qt 中,状态栏通过 QStatusBar 类实现,可显示的消息类型包括:实时消息:如当前程序的运行状态。 永久消息:如程序版本号、机构名称等。 进度消息:如进度条提示、百分比显示等!简单来说,状态栏是应用程序向用户传递实时状态或辅助信息的重要区域,提升了操作的透明度和用户体验。
同时由于在UI界面默认生成了状态栏对象,所以状态栏对象的创建和菜单栏的创建一样,为了防止内存泄漏,规范的做法是使用 this->statusBar () 函数,该函数会判断状态栏是否存在:若存在则直接获取返回,若不存在则新建后返回。这样既能避免内存泄露,又能保证对象始终在 Qt 的对象树上,使代码更规范。具体如下所示:

四:浮动窗口
在 Qt 中,浮动窗口(也称为铆接部件)是指能脱离主窗口独立存在、可自由移动的窗口组件,由 QDockWidget 类实现其浮动功能。最典型的例子是处于浮动状态的工具栏(QToolBar)------ 当工具栏未停靠在主窗口的上下左右边缘时,会成为独立的浮动窗口,拥有带标识的标题栏,用户可拖拽标题栏自由移动,不受主窗口布局约束。
除工具栏外,浮动窗口也可通过自定义窗口(如继承 QWidget 并设置相应属性)实现,它们通常位于核心部件周围,可存在多个,多用于展示辅助信息或临时功能面板,在保持与主窗口逻辑关联的同时,物理上能独立摆放,从而提升界面灵活性。具体如下所示:
cpp
QDockWidget*my_dock = new QDockWidget();
this->addDockWidget(Qt::LeftDockWidgetArea,my_dock);
//可以设置浮动窗口的属性,比如窗口名称!
my_dock->setWindowTitle("视图");
//如果想向浮动窗口内加入控件,不能一个一个直接添加,
//而是需要创建一个QWidget,然后把一个个控件加入到QWidget
//然后在把QWidget添加到浮动窗口中,浮动窗口只允许添加一个QWidget
QWidget*container=new QWidget();
my_dock->setWidget(container);
//设置一些控件!
QLabel*my_label= new QLabel("信息");
QPushButton*my_button = new QPushButton("按钮");
//设置垂直布局管理器,管理上面控件
QVBoxLayout*my_vlayout=new QVBoxLayout();
my_vlayout->addWidget(my_label);
my_vlayout->addWidget(my_button);
//把垂直布局管理器设置到QWidget中!
container->setLayout(my_vlayout);

同时,浮动窗口也能像工具栏一样被随意拖拽,甚至可以拖出主窗口成为独立窗口,因此也可以设置其停靠位置。浮动窗口的允许停靠位置可通过 QDockWidget 类提供的 setAllowedAreas () 函数进行设置,可选择的位置包括:
Qt::LeftDockWidgetArea(停靠在左侧)Qt::RightDockWidgetArea(停靠在右侧)Qt::TopDockWidgetArea(停靠在顶部)Qt::BottomDockWidgetArea(停靠在底部)Qt::AllDockWidgetAreas(以上四个位置均可停靠)具体如下所示:

五:对话框
对话框(Dialog)是 GUI 程序中不可或缺的组成部分,一些不适合在主窗口实现的功能组件可设置在对话框中。作为顶层窗口,对话框通常出现在程序最上层,用于完成短期任务或简洁的用户交互。Qt 常用的内置对话框包括:QFileDialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog(字体对话框)、QInputDialog(输入对话框)和 QMessageBox(消息框)。
同时对话框通常也分为模态(Modal)和非模态(Modeless)两种模式:模态对话框会阻塞主窗口交互,用户必须先处理对话框才能返回主界面(如确认删除的提示框);非模态对话框则允许用户同时操作主窗口和对话框(如可悬浮的工具面板)。
简单来说,对话框是 Qt 中实现人机交互的重要组件,用于在主流程之外完成特定的信息传递或操作确认。
除了 Qt 中内置的几个对话框外,对于已有的项目,我们也可以通过创建类并让其继承自 QDialog 类的方式,来实现自定义的对话框。
5.1:对话框释放问题
下面,我们先给出一个简单的例子,在主窗口中放置一个按钮,按下按钮弹出一个对话框,具体如下所示:

QDialog 是 QWidget 的子类,因此可以使用 QWidget 的各种属性和方法。但需要注意的是,当我们通过 new 来创建对话框时,若每次点击按钮都新建一个 QDialog 对象并显示,程序运行中多次点击就会产生大量对话框对象,容易导致内存泄露。尽管将对话框挂在 this 下(即设置主窗口为其父对象),程序结束时主窗口销毁后对话框也会随之销毁,但在主窗口销毁前,若产生多个对话框对象,仍存在内存泄漏的风险。因此,我们需要考虑对话框的销毁问题,具体如下所示:

在处理 QDialog 的内存释放时,若直接在 show() 后执行 delete,对话框会一闪而过。正确做法是让用户点击对话框的关闭按钮时触发 delete 操作。Qt 提供了便捷的属性设置方式,通过 dialog->setAttribute(Qt::WA_DeleteOnClose),可使对话框在关闭时自动执行 delete 操作,避免内存泄漏,简化了内存管理流程。
5.2:自定义对话框
而在实际开发中,通常不会直接让项目创建时继承自 QDialog,而是在代码中创建额外的类,让该类继承自 QDialog 来实现自定义对话框。主窗口一般不会作为对话框,而是由主窗口再产生其他对话框。具体如下所示:

如上所述,使用自定义对话框时,我们会新建一个继承自 QDialog 的 C++ 文件,此时 Qt 会自动生成对应的头文件和.cpp 文件。对于自定义对话框来说,这些自动生成的文件就如同项目创建时生成的头文件和.cpp 文件之于主窗口 ------ 添加控件、绑定槽函数等所有操作都能在这些文件中完成。
同时,和之前学习的各类控件一样,自定义对话框不仅能通过代码操作,也可通过图形化界面创建:在 Qt Creator 中依次点击 "文件"→"新建文件或项目"→"Qt"→"Qt 设计师表单类",选择合适的模板(如 "Dialog without Buttons" 或带按钮的对话框模板),输入类名(如 MyDialog),Qt 会自动生成对应的头文件(.h)、源文件(.cpp)和 UI 设计文件(.ui)。之后打开生成的.ui 文件进入 Qt 设计师界面,就能像操作主窗口一样使用该自定义对话框,包括添加控件、绑定槽函数等。由于创建过程不便演示,按上述步骤操作即可。
5.3:模态/非模态对话框
模态对话框 指的是显示后无法与父窗口进行交互的阻塞式对话框,通过调用 QDialog::exec () 函数来打开。它适用于必须依赖用户选择的场合,比如消息显示、文件选择、打印设置等。在 Qt 中,当模态对话框弹出时,用户必须先处理该对话框(如点击 "确定""取消" 按钮),才能返回主窗口继续操作。例如常见的 "是否保存文件" 确认框,在用户未选择 "保存""不保存" 或 "取消" 之前,主窗口无法进行任何交互,这种特性确保了关键操作的流程完整性,避免用户在未完成对话框交互时误操作主界面。
非模态对话框 显示后独立存在,是一种非阻塞式对话框,用户可以同时与它和父窗口进行交互,通过 **QDialog::show ()**函数调用。这类对话框一般在堆上创建,若创建在栈上,弹出后会一闪而过;同时需设置 Qt::WA_DeleteOnClose 属性,避免创建多个非模态对话框时出现内存泄漏。它适用于特殊功能设置的场合,比如查找操作、属性设置等,像调色板、参数设置面板这类工具面板常设计为非模态 ------ 用户可在调整对话框参数的同时,实时在主窗口查看效果,无需频繁关闭对话框再操作主窗口,提升了操作的灵活性和连续性。与模态对话框不同,非模态对话框不会强制用户优先处理自身,更适合需要长期悬浮、辅助主窗口操作的场景。我们上面的自定义对话框一直都是用非模态对话框实现的!具体如下所示:

我们可以看到,如果使用模态对话框显示,我们不仅可以同时和主窗口以及生成的对话框进行操作,还可以创建多个对话框,而如果使用非模态对话框,我们只能和生成的唯一一个对话框进行操作,如果生成的对话框不消除,我们无法再操作主窗口!
5.4:内置对话框
Qt 提供了多种可复用的对话框类型,即 Qt 标准对话框。这些标准对话框均继承自 QDialog 类,常用的标准对话框如下:

5.4.1:QMessageBox
QMessageBox(消息对话框)是应用程序中最常用的界面元素,主要用于向用户提示重要信息,以及强制用户进行选择操作。QMessageBox 类中定义了静态成员函数,通过直接调用这些函数,可以创建不同风格的消息对话框,其中包括:

QMessageBox*my_mb=new QMessageBox(this);
//设置信息对话框标题
my_mb->setWindowTitle(" 内置消息对话框");
//设置信息对话框中的内容
my_mb->setText("QMessageBox对话框");
//设置信息对话框的图标等级
my_mb->setIcon(QMessageBox::Warning);
//同时还可以设置信息对话框的按钮
my_mb->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel|QMessageBox::Close);
//QMessageBox对话框使用场景更多是模态的,
//my_mb->show();
//所以一般都使用exec()而不是show()
my_mb->exec();
//由于这里是模态对话框,不做出选择就将阻塞在对话框中,所以这里我们可以直接使用delete关键字来删除对话框
//delete my_mb;
//但是我们还是规范一点用之前自定义对话框那种删除方法,但是上面那种写法也行,二者都可以完成要求
my_mb->setAttribute(Qt::WA_DeleteOnClose);

如上图所示,只需包含 QMessageBox 的头文件,就能在堆上创建 QMessageBox 消息对话框。其中,有五种图标可供选择,Qt 已将其定义为枚举,涵盖了我们常用的警告、询问、错误等风格的对话框。同时,若不向 QMessageBox 对话框添加按钮,它会默认生成一个 ok 按钮;若想添加按钮,Qt 也提供了对应的枚举,只需将所需枚举值相与,即可添加相应数量的按钮。
我们使用 QMessageBox 对话框实现了信息的输出,同时也需要根据用户对按钮的选择做出响应。对于这些内置按钮的响应,有两种操作方法,第一种具体如下所示:

第一种方法是,在对话框关闭后,通过 exec 函数的返回值来判断用户选择了哪个按钮,从而对按钮进行响应;第二种方法则是利用 Qt 内部提供的静态方法,这些方法可以将创建 QMessageBox 对话框、填充对话框信息、添加按键以及获取用户按下的按钮等操作一并完成。具体如下所示:


以上就是对于Qt内置按钮的两种响应处理方式,同时,在QMessageBox信息框中,不仅仅有内置按钮,我们也可以自定义按钮,具体如下所示:

在 Qt 的 QMessageBox 中,StandardButton(标准按钮)与 ButtonRole(按钮角色)存在默认的一一对应关系,这种对应关系决定了按钮的交互逻辑(如默认焦点、回车 / ESC 响应等)。Qt 内部会默认维护这一对应关系,例如 Ok 按钮默认关联 AcceptRole,点击后会触发对话框的 "接受" 逻辑;Cancel 按钮关联 RejectRole,点击后则触发 "拒绝" 逻辑,无需手动指定即可生效。同时,还可以通过 connect 函数对按钮点击进行响应,绑定回调函数,从而实现对自定义按钮的处理。
5.4.2:QColorDialog
QColorDialog(颜色对话框) 是 Qt 内置提供的标准颜色选择对话框,其功能是允许用户选择颜色,它继承自 QDialog 类。该对话框提供了直观的界面,包含颜色预览、调色板、色值输入等功能,支持选择 RGB、HSV 等多种颜色模式,开发者可通过它快速实现颜色选择的交互功能,例如在图像处理、界面美化类应用中让用户自定义颜色。具体如下所示:

在 Qt 中使用 QColorDialog 非常简单,主要有两种方式:一种是通过实例化对象进行自定义配置,这种方式适合复杂需求,上面已做介绍;另一种是通过静态方法 getColor 快速调用,这种方式更推荐,适合简单场景。具体如下所示:

5.4.3:QFileDialog
QFileDialog(⽂件对话框 )用于应用程序中需要打开外部文件或把当前内容存储到指定外部文件的场景。在 Qt 中,文件对话框(QFileDialog)是让用户在应用程序中选择文件或目录的标准界面元素,继承自 QDialog 类。它提供直观的交互界面,支持文件的打开与保存操作,允许用户浏览文件系统、筛选特定类型的文件(如通过后缀名过滤),还能设置默认路径、自定义对话框标题等。例如在文本编辑器中选择打开的文档、在图像处理软件中选择保存的图片路径等场景,都可通过 QFileDialog 快速实现文件选择的交互功能。具体如下所示:

在 Qt 中使用 QFileDialog(文件对话框)主要有两种方式,分别适用于简单场景和复杂自定义需求:对于简单场景,可通过 QFileDialog 提供的多个静态方法快速调用,直接弹出文件对话框并返回用户选择的文件 / 目录路径,无需手动实例化对象;而如果需要更灵活的设置(如自定义按钮、修改对话框样式、实时监听选择变化等),则可实例化 QFileDialog 对象。上面介绍的是直接使用静态方法快速调用的方式,同时这里只展示了打开单个及多个文件的操作,至于保存单个或多个文件、选择目录等更多操作,可参考 Qt 手册深入学习,这里不再一一介绍。
5.4.4:QFontDialog
QFontDialog(字体对话框 )是 Qt 中提供的预定义字体对话框类,用于提供选择字体的对话框部件。它能让用户在应用程序中选择字体,包括字体家族、大小、样式(如粗体、斜体等)、颜色等属性。该类继承自 QDialog 类,拥有直观的界面,支持实时预览字体效果,开发者可借助它快速实现字体选择的交互功能,例如在文本编辑类应用中让用户自定义文本字体。
它与 QColorDialog、QFileDialog 类似,QFontDialog 也支持静态方法快速调用和实例化对象自定义配置两种使用方式。这里我还是使用静态方法快速调用的方式展示字体对话框,具体如下所示:

如上所示,通过静态方法 getFont () 可简化常用场景的调用,无需手动管理对话框的生命周期,能够轻松实现文本编辑器、富文本处理等应用中的字体自定义功能。
5.4.5:QInputDialog
QInputDialog(输⼊对话框) 是 Qt 提供的标准输入对话框类,用于在应用程序中快速获取用户输入的简单数据(如文本、数字、选项等)。它继承自 QDialog 类,封装了简洁的交互界面,支持直接弹出对话框并返回用户输入的结果,无需手动设计输入界面,适合需要快速获取用户简单输入的场景(如获取用户名、设置数值参数等)。
QInputDialog 同样支持静态方法快速调用(这是常用方式)和实例化对象自定义配置,其中静态方法可直接返回用户输入的各类数据。下面我们就以静态方法快速调用来展示,具体如下所示:
cpp
void My_MainWindow::on_pushButton_clicked()
{
bool flag=false;
// static int getInt(QWidget *parent, const QString &title, const QString &label, int value = 0,
//int minValue = -2147483647, int maxValue = 2147483647,
//int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
// 参数:父窗口、标题、提示文本、默认值、最小值、最大值、步长
int result = QInputDialog::getInt(this,"整形输入框","请输入年龄",18,0,100,2,&flag);
if(flag==true)
{
qDebug()<<"输入的年龄为:"<<result;
}
else
{
qDebug()<<"取消整形输入";
}
}
void My_MainWindow::on_pushButton_2_clicked()
{
bool flag=false;
// static double getDouble(QWidget *parent, const QString &title, const QString &label, double value = 0,
// double minValue = -2147483647, double maxValue = 2147483647,
// int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(),
// double step = 1);
// 参数:父窗口、标题、提示文本、默认值、最小值、最大值、显示和输入的小数位数(如 2 表示保留两位小数)
double result = QInputDialog::getDouble(this,"整形输入框","请输入体重",50.0,0.0,100.0,2,&flag);
if(flag==true)
{
qDebug()<<result;
}
else
{
qDebug()<<"取消浮点型输入";
}
}
void My_MainWindow::on_pushButton_3_clicked()
{
bool flag=false;
QStringList items = {"苹果", "香蕉", "橙子"};
items.push_back("橘子");
// static QString getItem(QWidget *parent, const QString &title, const QString &label,
// const QStringList &items, int current = 0, bool editable = true,
// bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(),
// Qt::InputMethodHints inputMethodHints = Qt::ImhNone);
// 参数:父窗口、标题、提示文本、选项列表、默认选中索引、是否可编辑
QString item = QInputDialog::getItem(this,"选择选项","请选择水果:",items,0,false, &flag);
if (flag==true)
{
qDebug() << "选中的水果:" << item;
}
else
{
qDebug()<<"取消条目输入";
}
}

六:总结
至此,这是我对 Qt 界面的一些浅显理解。虽然这些零散的知识点还不足以组合成我们常见的界面,但希望在接下来的学习中,能够更熟练且灵活地运用它们。若存在不足之处,恳请批评指正!