当前位置: 首页 > news >正文

Qt——主窗口 mainWindow

主窗口 mainWindow

前面学习的所有代码,都是基于QWidget控件,其更多的是作为别的窗口的部分

现在来学习QMainWindow,即主窗口,其包含以下属性

  • Window Title:标题栏
  • Menu Bar:菜单栏
  • Tool Bar Area:工具栏
  • Dock Widget Area:铆接部件(子窗口)
  • Central Widget:中央窗口
  • Status Bar:状态栏

在这里插入图片描述

菜单栏 Menu Bar

在这里插入图片描述

一个窗口,只能有一个菜单栏,但是可以有很多个菜单,每一个菜单又可以很多菜单项

例如,用代码创建菜单栏、菜单、菜单项、子菜单、分割线、图标:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 获取菜单栏QMenuBar* menuBar = this->menuBar();// 创建菜单,并设置快捷键QMenu* menu1 = new QMenu("文件 (&F)");QMenu* menu2 = new QMenu("设置 (&S)");QMenu* menu3 = new QMenu("关于 (&A)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);// 创建菜单项QAction* act1 = new QAction("新建");QAction* act2 = new QAction("保存");QAction* act3 = new QAction("退出");menu1->addAction(act1);menu1->addSeparator();  // 添加分割线menu1->addAction(act2);menu1->addSeparator();  // 添加分割线menu1->addAction(act3);// 为菜单项添加图片act1->setIcon(QIcon(":/open"));act2->setIcon(QIcon(":/save"));// 为菜单添加图片menu1->setIcon(QIcon(":/file"));// 设置菜单项快捷键act1->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));act2->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B));act3->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_E));// 创建子菜单QMenu* menu_child = new QMenu("高级 (&L)");QAction* act4 = new QAction("字体");QAction* act5 = new QAction("语言");menu_child->addAction(act4);menu1->addSeparator();  // 添加分割线menu_child->addAction(act5);// 将子菜单添加到菜单 menu2menu2->addMenu(menu_child);connect(act1, &QAction::triggered, this, [](){qDebug() << "新建文件";});connect(act2, &QAction::triggered, this, [](){qDebug() << "保存文件";});connect(act3, &QAction::triggered, this, [](){qDebug() << "退出窗口";});connect(act3, &QAction::triggered, this, &QMainWindow::close);
}
  • QAction::triggered:该信号为菜单项被用户执行时触发
  • 可以通过& + 按键的方式,设置菜单的快捷键,此时,按下Alt + 按键即可打开对应的菜单
  • 尽管也可以通过& + 按键的方式,设置菜单项的快捷键,但是如果要使用,就必须先展开对应的菜单。 因此对于**QAction快捷键的设置,优先使用setShortcut**
  • 如果为菜单设置图片,那么菜单的文本就不会显示;如果为菜单项设置图片,菜单项的图片和文本都可以显示

效果:

在这里插入图片描述


工具栏 Tool Bar

一个窗口,可以没有工具栏,可以有工具栏,也可以有多个

一个窗口,默认不自带工具栏,需要手动创建

例如:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建工具栏QToolBar* toolBar = new QToolBar();this->addToolBar(toolBar);// 创建工具项QAction* act1 = new QAction("打开文件");QAction* act2 = new QAction("保存文件");act1->setIcon(QIcon(":/open"));act2->setIcon(QIcon(":/save"));// 将工具项 添加到 工具栏toolBar->addAction(act1);toolBar->addAction(act2);connect(act1, &QAction::triggered, this, [](){qDebug() << "打开文件";});connect(act2, &QAction::triggered, this, [](){qDebug() << "保存文件";});
}
  • 如果工具项被设置了图标,那么其文本就会被隐藏

  • 隐藏的文本会以toolTip的方式存在

  • 工具栏和菜单栏往往搭配使用,工具栏中的工具项也可以在菜单栏中出现

  • 工具栏可以被拖动,我们可以对其相关属性进行设置:

    • 可以设置工具栏出现的初始位置。可以在addToolBar中添加选项来设置

      • Qt::LeftToolBarArea 停靠在左侧
      • Qt::RightToolBarArea 停靠在右侧
      • Qt::TopToolBarArea 停靠在顶部
      • Qt::BottomToolBarArea 停靠在底部
      • Qt::AllToolBarAreas 以上四个位置都可停靠
    • 可以设置工具栏允许停靠在哪些边缘

      • 通过函数设置:setAllowedAreas()
    • 可以设置工具栏是否允许浮动

      • 通过函数设置:setFloatable()
    • 可以设置工具栏是否可以移动

      • 通过函数设置:setMovable()

效果:

在这里插入图片描述


状态栏 Status Bar

QMainWindow自带状态栏Status Bar,且一个窗口状态栏只存在一个

例如:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 获取状态栏QStatusBar* statusBar = this->statusBar();// 添加临时控件QLabel* label = new QLabel("这是一条临时消息");statusBar->addWidget(label, 1);// 添加永久控件QProgressBar* progress = new QProgressBar();progress->setTextVisible(true);progress->setRange(0, 100);progress->setValue(40);statusBar->addPermanentWidget(progress, 2);// 线是一条信息statusBar->showMessage("这是一条显示信息", 3000);
}
  • addWidget:向状态栏添加一个临时控件,这个控件可以被showMessage()显示的信息覆盖。后面的数字为拉伸系数
  • addPermanentWidget:向状态栏添加一个永久控件,这个控件不可以被showMessage()显示的信息覆盖。后面的数字为拉伸系数
  • showMessage:在状态栏显示一条消息,后面的数字为显示时间(ms),默认为0,0为永久显示

浮动窗口 Dock Widget

可以像正常窗口一样,给浮动窗口内部,添加一些其他控件

但是不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,将控件添加到QWidget

最后再将QWidget添加到子窗口中

例如:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建子窗口,并放置在主窗口顶部QDockWidget* dock = new QDockWidget("子窗口");// 只允许停靠在顶部和右侧dock->setAllowedAreas(Qt::DockWidgetArea::RightDockWidgetArea | Qt::DockWidgetArea::TopDockWidgetArea);this->addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock);// 添加一个容器窗口QWidget* container = new QWidget();QVBoxLayout* layout = new QVBoxLayout();container->setLayout(layout);QLabel* label = new QLabel("这是一段文本");layout->addWidget(label);// 将容器窗口添加到子窗口中dock->setWidget(container);
}

效果:

在这里插入图片描述

http://www.lryc.cn/news/623548.html

相关文章:

  • Gradle快速入门学习
  • 云计算-K8s 实战:Pod、安全上下文、HPA 、CRD、网络策略、亲和性等功能配置实操指南
  • Android Studio中创建Git分支
  • 记忆翻牌游戏 greenfoot 开发
  • 今日科技热点速递:机遇与技术融合下的创新加速
  • 《MutationObserver深度解构:重塑自动化视觉回归测试的底层逻辑》
  • java基础(十)sql的mvcc
  • CVPR2 2025丨大模型创新技巧:文档+语音+视频“大模型三件套”
  • 原子操作(Atomic Operation):指在执行过程中不会被中断的操作
  • 基础IO_系统文件IO | 重定向【Linux】
  • Rust Web 全栈开发(十三):发布
  • 芯片行业主要厂商
  • shell编程——Makefile
  • RocketMQ面试题-未完
  • CentOS7安装部署GitLab社区版
  • 产品设计.Ai产品经理
  • 【学习笔记】面向AI安全的26个缓解措施
  • 炒股术语:“洗盘”
  • 为何她总在关键时“失联”?—— 解密 TCP 连接异常中断
  • Java研学-SpringCloud(五)
  • 【电路笔记 通信】AXI4-Lite协议 FPGA实现 Valid-Ready Handshake 握手协议
  • 报错注入原理与全方法总结
  • Baumer高防护相机如何通过YoloV8深度学习模型实现行人跌倒的检测识别(C#代码UI界面版)
  • 基于Spring Boot+Vue的莱元元电商数据分析系统 销售数据分析 天猫电商订单系统
  • MySQL黑盒子研究工具 strace
  • TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践
  • Vue中v-show与v-if的区别
  • 负载测试与压力测试详解
  • mac电脑开发嵌入式基于Clion(stm32CubeMX)
  • 【力扣热题100】双指针—— 三数之和