【Qt】从QMainWindow到UI框架

2024-03-16 03:28
文章标签 qt ui 框架 qmainwindow

本文主要是介绍【Qt】从QMainWindow到UI框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 简介
  • UI布局元素
    • Central Widget
    • Menu Bar
    • Toolbars
    • Status Bar
    • Dock Widgets
  • 参考文档

简介

如下图所示,我们常见的一些desktop软件,比如VS Code、Smart VCI等,一般都会包含顶部的菜单栏,底部的状态栏,以及一些其他UI布局元素。
在这里插入图片描述
在这里插入图片描述

新建Qt项目是以MainWindow作为显示的载体,MainWindow是继承自QMainWindow的一个子类。

如下图所示,QMainWindow本身提供了常用的UI布局元素1,包括:

  • Menu Bar 菜单栏
  • Toolbars 工具栏
  • Status Bar 状态栏
  • Dock Widgets Dock栏
  • Central Widget 页面内容区域
    在这里插入图片描述
    合理利用这几种元素,我们就可以构建出我们常见的desktop布局了:
    在这里插入图片描述

接下来我们一次介绍这些元素及其基本使用方法

UI布局元素

Central Widget

Central Widget主要用来显示页面内容,通常是自定义Widget,也就是QWidget的子类,用来展示我们App的主要内容。可以调用QMainWindowsetCentralWidget()方法来设置Central Widget。

Menu Bar

Menu Bar也就是我们常见的菜单栏,在Qt中是用QMenuBar2类创建的。
在介绍QMenuBar之前,需要先介绍另外一个类QAction3。在desktop应用中,经常通过菜单栏中的菜单、工具栏按钮或者快捷键调用一些应用中常用的功能,比如打开文件操作。对于同一个功能,不管通过什么方式调用,执行的命令应该是同一个。这种情况下把功能抽象为Action是非常有用的,在Qt中,就是QAction。也就是说QAction是某个应用功能的抽象,可以同时被添加到菜单栏、工具栏和快捷键,Qt会自动完成在不同地方的状态同步。以下面代码为例:

    // ...QAction *submenu4 = new QAction("子菜单四");submenu4->setCheckable(true);submenu4->setShortcuts(QKeySequence::Copy);// ...menubar->addAction(submenu4);toolbar->addAction(submenu4);

如果在应用中执行“Ctrl + C”, 子菜单四就会被选中,菜单栏、工具栏中的子菜单四状态都会同时发生改变:
在这里插入图片描述

接下来可以开始介绍QMenuBar了,它的功能就是创建菜单栏,容纳QMenu4。通过QMainWinowvoid setMenuBar(QMenuBar *menuBar)5功能添加菜单栏,通过QMenuBaraddMenu6方法为菜单栏添加菜单元素,通过addAction方法添加具体命令。
通过下面例子介绍具体使用:

QMenuBar *menubar = new QMenuBar();
// 创建多级菜单
QMenu *menu1 = new QMenu("菜单一");QMenu *submenu1 = new QMenu("子菜单一");
QAction *submenu11 = new QAction("二级子菜单一");
QAction *submenu12 = new QAction("二级子菜单二");
submenu1->addAction(submenu11);
submenu1->addAction(submenu12);QAction *submenu2 = new QAction("子菜单二");
menu1->addMenu(submenu1);
menu1->addAction(submenu2);// 没有子菜单的一级菜单
QAction *menu2 = new QAction("菜单二");menubar->addMenu(menu1);menubar->addAction(menu2);

效果如下图
在这里插入图片描述

Toolbars

与菜单栏类似,Qt通过QToolBar7创建工具栏,通过QMainWindowvoid addToolBar(QToolBar *toolbar)8可以为窗口添加工具栏,一个窗口中可以添加多个工具栏。
工具栏元素可以添加QAction也可以添加QWidget,对应添加方法是addAction()addWidget()QMainWindow添加工具栏时可以指定工具栏的默认位置,通过下面的例子介绍具体使用

    QAction *submenu2 = new QAction("子菜单二");QAction *submenu3 = new QAction("子菜单三");QAction *submenu4 = new QAction("子菜单四");QPushButton *btn = new QPushButton("按钮");QToolBar *toolbar = new QToolBar();toolbar->addAction(submenu2);toolbar->addAction(submenu3);toolbar->addSeparator(); // 菜单元素之间增加分割线toolbar->addWidget(btn);QToolBar *toolbar2 = new QToolBar();toolbar2->addAction(submenu4);addToolBar(toolbar);addToolBar(toolbar2);

效果如图:在这里插入图片描述
菜单栏默认会被添加在窗口上方,菜单栏默认也是可以拖动到窗口的四个边,也可以处于悬浮状态请添加图片描述
对于上述的默认值,可以手动做一些限制和调整:

  • 指定初始位置,在调用addToolBar()时指定位置,比如addToolBar(toolbar, Qt::TopToolBarArea)。位置包括LeftToolBarAreaRightToolBarAreaTopToolBarAreaBottomToolBarArea
  • 是否允许多动,通过QToolBarvoid setMovable(bool movable)
  • 指定可以拖动到的窗口位置,通过QToolBarvoid setAllowedAreas(Qt::ToolBarAreas areas),比如只允许窗口上方或者窗口下方toolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
  • 菜单栏是否可以处于悬浮状态,通过QToolBarvoid setFloatable(bool floatable)

Status Bar

通过QStatusBar9为窗口添加状态栏,位于窗口底部,一般用于显示一些通知和提示。QMainWindowsetStatusBar()函数为窗口设置状态栏。
通过statusBar()->showMessage("Message", 2000);在状态栏显示信息,并支持指定信息存在的时长。

Dock Widgets

相比于QToolBar,Dock Widgets10的内容有更多自由度,一般用于显示一些工作区域,比如文档目录这些。通过QMainWindowaddDockWidget为窗口添加Dock Widget。

和工具栏类似,Dock Widget也可以指定初始位置、是否可以拖动、允许的位置以及是否可以处于悬浮状态等。

同一个窗口同样可以添加多个Dock Widget,多个Widget还可以组合在一起,通过tab切换

通过如下示例说明:

    QDockWidget *dockWidget = new QDockWidget("Dock Widget");QLabel *dockWidgetContent = new QLabel("dock Widget内容");dockWidgetContent->setStyleSheet("background-color:green;color: white;");dockWidget->setWidget(dockWidgetContent);addDockWidget(Qt::LeftDockWidgetArea, dockWidget);QDockWidget *dockWidget2 = new QDockWidget("Dock Widget 2");QLabel *dockWidgetContent2 = new QLabel("dock Widget 2 内容");dockWidgetContent2->setStyleSheet("background-color:green;color: white;");dockWidget2->setWidget(dockWidgetContent2);addDockWidget(Qt::LeftDockWidgetArea, dockWidget2);QDockWidget *dockWidget3 = new QDockWidget(tr("Dock Widget 3"));dockWidget3->setAllowedAreas(Qt::LeftDockWidgetArea |Qt::RightDockWidgetArea);QLabel *dockWidgetContent3 = new QLabel("dock Widget 3 内容");dockWidgetContent3->setStyleSheet("background-color:green;color: white;");dockWidget3->setWidget(dockWidgetContent3);addDockWidget(Qt::LeftDockWidgetArea, dockWidget3);tabifyDockWidget(dockWidget, dockWidget2); // 将dockWidget和dockWidget2组合tabifyDockWidget(dockWidget, dockWidget3); // 将docketWidget、dockWidget2以及dockWidget3组合在一起

效果如下图:
在这里插入图片描述

请添加图片描述

参考文档


  1. https://doc.qt.io/qt-6/qmainwindow.html#qt-main-window-framework ↩︎

  2. https://doc.qt.io/qt-6/qmenubar.html ↩︎

  3. https://doc.qt.io/qt-6/qaction.html ↩︎

  4. https://doc.qt.io/qt-6/qmenu.html ↩︎

  5. https://doc.qt.io/qt-6/qmainwindow.html#setMenuBar ↩︎

  6. https://doc.qt.io/qt-6/qmenubar.html#addMenu-1 ↩︎

  7. https://doc.qt.io/qt-6/qtoolbar.html ↩︎

  8. https://doc.qt.io/qt-6/qmainwindow.html#addToolBar-1 ↩︎

  9. https://doc.qt.io/qt-6/qstatusbar.html ↩︎

  10. https://doc.qt.io/qt-6/qdockwidget.html#details ↩︎

这篇关于【Qt】从QMainWindow到UI框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814121

相关文章

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript