(4)框架搭建:Qt实战项目之主窗体介绍
上一节我们已经尝试搭建了一个空的 Qt 项目,其中我们的主窗体类SubCfgTool继承自 QMainWindow 类。接下来,就让我们先认识一下这个核心的 QMainWindow 类吧。
温馨提示:本章的代码仅用于帮助大家理解 QMainWindow 及其组成部分,无需跟随练习。后续我们会通过实际项目,逐步引导大家构建相关代码。
QMainWindow 初印象
Qt作为一套跨平台的 C++ 图形用户界面应用程序开发框架,凭借其强大的功能、丰富的类库以及出色的跨平台特性,在软件开发领域中占据着重要的地位。无论是桌面应用程序、嵌入式系统,还是移动应用开发,Qt 都能大显身手。它为开发者提供了一种简单、直观的方式来创建具有吸引力且功能强大的用户界面,大大提高了开发效率。
在 Qt 的庞大类库体系中,QMainWindow 类扮演着举足轻重的角色,它是构建复杂桌面应用程序用户界面的基础类。许多我们日常使用的软件,如 VLC 媒体播放器、WPS Office 等,它们的主窗口界面都是基于 QMainWindow 类构建的。这些应用程序通过运用 QMainWindow 类的特性,为用户呈现出了功能丰富、操作便捷的交互界面。
对于 Qt 开发者而言,熟练掌握 QMainWindow 类的使用是必备技能之一。这不仅是因为它是创建应用程序主窗口的关键,更在于通过学习 QMainWindow 类,开发者能够深入理解 Qt 的界面布局管理、信号与槽机制以及事件处理等核心概念。这些知识和技能,将为开发者在后续开发更复杂、更高级的应用程序时,打下坚实的基础。
QMainWindow 的独特魅力
标准化结构提升开发效率
QMainWindow 的标准化结构,为开发者提供了一种高效、便捷的开发方式。它预先定义了菜单栏、工具栏、状态栏、停靠部件和中心部件等区域,开发者无需从头开始设计和布局这些元素,大大减少了开发工作量,提高了开发效率。
以一个简单的文本编辑器为例,如果使用普通的 QWidget 来构建主窗口,开发者需要手动创建和布局菜单栏、工具栏、文本编辑区域以及状态栏等组件,并且要处理它们之间的交互逻辑和布局关系。这不仅需要花费大量的时间和精力,而且容易出现布局混乱、交互逻辑错误等问题。
而使用 QMainWindow,开发者只需按照其提供的结构,将相应的组件添加到对应的区域即可。例如,使用QMainWindow::menuBar()函数创建菜单栏,使用QMainWindow::addToolBar()函数添加工具栏,使用QMainWindow::setStatusBar()函数设置状态栏,使用QMainWindow::setCentralWidget()函数设置中心部件等。这样,开发者可以将更多的精力集中在实现文本编辑的核心功能上,而无需过多关注界面布局和组件管理的细节。
与其他窗口类相比,如 QWidget 和 QDialog,QMainWindow 的优势更加明显。QWidget 是 Qt 中所有用户界面元素的基类,它非常灵活,但也需要开发者进行更多的手动操作来构建复杂的界面。QDialog 则主要用于创建对话框,通常用于显示临时信息或获取用户输入,不适合作为应用程序的主窗口。而 QMainWindow 专门为构建主窗口而设计,提供了一套完整的标准化结构和功能,使得开发者能够更加高效地创建功能丰富、界面友好的应用程序。
功能区域清晰明确
1.菜单栏(Menu Bar)
菜单栏是 QMainWindow 中用于组织应用程序功能命令的区域,通常位于主窗口的顶部。在 Qt 中,菜单栏是通过 QMenuBar 类来实现的,一个主窗口最多只能有一个菜单栏。
创建菜单栏有两种常见方式。第一种方式是通过 QMainWindow 类提供的menuBar()函数来创建,若菜单栏不存在,此函数将创建并返回一个空的菜单栏;若菜单栏已存在,则直接返回已有的菜单栏。示例代码如下:
QMenuBar* menubar = menuBar();第二种方式是在堆上动态创建菜单栏,然后使用setMenuBar()函数将其设置到窗口中:
QMenuBar* menubar = new QMenuBar(this);
this->setMenuBar(menubar);注意:QMainWindow 内部已经默认维护了一个 QMenuBar 实例,通过 menuBar() 方法获取的正是这个默认菜单栏。这个默认菜单栏会自动被主窗口关联,无需手动调用 setMenuBar() 再次设置。
在菜单栏中添加菜单,可以使用QMenuBar::addMenu()函数。例如,创建一个 “文件” 菜单并添加到菜单栏中:
QMenu* fileMenu = menubar->addMenu("文件");菜单项是通过 QAction 类来实现的,它代表一个用户操作,可同时用于菜单栏和工具栏。创建菜单项并添加到菜单上的示例代码如下:
QAction* openAction = new QAction("打开", this);
QAction* saveAction = new QAction("保存", this);
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);为菜单项添加快捷键,可以使用QAction::setShortcut()函数。例如,为 “打开” 菜单项添加快捷键Ctrl+O:
openAction->setShortcut(QKeySequence::Open); 注:具体快捷键可参考官方文档的QKeySequenceopen类。
当菜单项被点击时,会发出triggered()信号,我们可以将这个信号与相应的槽函数连接,实现具体的功能。例如,当 “退出” 菜单项被点击时,关闭应用程序:
QAction* exitAction = new QAction("退出", this);
exitAction->setShortcut(QKeySequence::Quit);
connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
fileMenu->addAction(exitAction);2. 工具栏(Tool Bar)
工具栏是应用程序中集成各种常用功能的区域,通常以图标按钮的形式呈现,方便用户快速访问常用操作。它是一个可移动的组件,元素可以是各种窗口组件。
创建工具栏可以调用 QMainWindow 类的addToolBar()函数,每增加一个工具栏都需调用一次该函数。例如,添加一个名为 “主工具栏” 的工具栏:
QToolBar* toolBar = addToolBar("主工具栏");添加工具项到工具栏上,同样可以使用 QAction 类。例如,将前面创建的 “打开” 和 “保存” 操作添加到工具栏上:
toolBar->addAction(openAction);
toolBar->addAction(saveAction);设置工具栏的属性,可以使用 QToolBar 类提供的相关函数。比如,设置工具栏不可拖拽移动,可以使用setMovable(false);设置工具栏不可浮空显示,可以使用setFloatable(false);设置工具栏的停靠位置,可以使用setAllowedAreas()函数。例如,设置工具栏只允许停靠在左侧或右侧:
toolBar->setMovable(false);
toolBar->setFloatable(false);
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);3. 停靠部件(Dock Widgets)
停靠部件是可以停靠在 QMainWindow 四周或作为独立窗口浮动的面板,常用于显示辅助工具或属性面板等信息。
创建停靠部件,使用 QDockWidget 类。例如,创建一个名为 “属性面板” 的停靠部件:
QDockWidget* dockWidget = new QDockWidget("属性面板", this);将停靠部件添加到 QMainWindow 中,需要指定停靠的区域。例如,将停靠部件添加到主窗口的左侧停靠区域:
addDockWidget(Qt::LeftDockWidgetArea, dockWidget);设置停靠部件的属性和内容。可以设置停靠部件的可停靠区域,使用setAllowedAreas()函数;设置停靠部件的内容,使用setWidget()函数。例如,创建一个列表部件作为停靠部件的内容,并设置停靠部件只允许在左侧和右侧停靠:
QListWidget* listWidget = new QListWidget(dockWidget);
listWidget->addItems(QStringList() << "项目1" << "项目2" << "项目3");
dockWidget->setWidget(listWidget);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);4. 中心部件(Central Widget)
中心部件是 QMainWindow 的主要工作区域,占据了窗口的大部分空间,用于显示应用程序的核心内容。
中心部件的作用是承载应用程序的主要业务界面,例如在文本编辑器中,中心部件可能是一个文本编辑框;在绘图软件中,中心部件可能是一个绘图区域。
设置中心部件,可以使用 QMainWindow 类的setCentralWidget()函数。任何继承自 QWidget 的类的派生类的实例,都可以作为中心部件使用。例如,使用 QTextEdit 作为中心部件:
QTextEdit* textEdit = new QTextEdit(this);
setCentralWidget(textEdit);在不同的应用场景下,中心部件的表现形式各不相同。在一个图像查看器应用中,中心部件可能是一个用于显示图像的 QLabel 或 QGraphicsView;在一个表格处理软件中,中心部件可能是一个 QTableWidget。开发者可以根据应用程序的具体需求,选择合适的部件作为中心部件,或者自定义一个部件来满足特定的业务逻辑。
5. 状态栏(Status Bar)
状态栏位于 QMainWindow 的底部,用于显示应用程序的状态信息,如当前操作的提示、程序的运行状态等。
创建状态栏,可以使用 QMainWindow 类的statusBar()函数,如果状态栏不存在,该函数会自动创建一个。例如:
QStatusBar* statusBar = statusBar();显示临时信息,可以使用showMessage()函数,该信息会在一段时间后自动消失。例如,显示 “保存成功” 的提示信息,持续 3 秒:
statusBar->showMessage("保存成功", 3000);显示永久信息,通常是通过在状态栏中添加一个永久部件来实现,比如添加一个 QLabel 用于显示版本信息:
QLabel* versionLabel = new QLabel("版本 1.0", this);
statusBar->addPermanentWidget(versionLabel);在实际应用中,状态栏的用途非常广泛。比如在文件传输过程中,状态栏可以显示传输进度;在网络连接时,显示连接状态;在编辑文档时,显示当前的编辑模式等。通过合理利用状态栏,能够为用户提供更多的信息反馈,提升用户体验。
回顾沉淀,奔赴新程
QMainWindow 作为 Qt 开发中构建主窗口的核心类,以其标准化的结构、清晰明确的功能区域以及丰富的应用场景,成为众多 Qt 桌面应用程序的基石。它不仅为开发者提供了高效的开发方式,减少了界面布局和组件管理的工作量,还为用户带来了熟悉、便捷的操作体验。
在实际应用中,QMainWindow 的身影随处可见,从日常办公使用的文本编辑器、图片编辑器,到专业领域的绘图软件、视频播放器等,它都发挥着关键作用。通过合理运用 QMainWindow 的各个功能区域,开发者能够轻松打造出功能丰富、界面友好的应用程序。
随着技术的不断发展,Qt 也在持续演进。未来,QMainWindow 有望在更多领域展现其强大的功能。在物联网应用中,基于 Qt 的跨平台特性,QMainWindow 可以作为物联网设备管理平台的主窗口,实现对设备的远程监控、配置和管理。在虚拟现实和增强现实领域,QMainWindow 可以作为应用程序的主界面,为用户提供沉浸式的交互体验。在人工智能相关的桌面应用中,QMainWindow 可以承载数据展示、模型训练参数设置等核心功能。
对于 Qt 开发者来说,掌握 QMainWindow 的使用是迈向更高层次开发的重要一步。不断探索 QMainWindow 的更多功能和应用场景,结合 Qt 的其他特性,如信号与槽机制、事件处理、数据库集成等,能够开发出更加复杂、高效、智能的应用程序,为用户带来更多价值。
