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

4-主窗口

4-主窗口

  • 1、简介
  • 2 菜单栏、工具栏、状态栏
    • 2.1 菜单栏
    • 2.2 QAction
    • 2.3 工具栏
    • 2.4 状态栏
  • 3 混合方式UI设计

1、简介

  • QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件,是许多应用程序(比如文本编辑器、图片编辑器等)的基础。
  • 主窗口具有自己的布局管理器,因此不允许在主窗口上设置或创建布局管理器。但是在中心控件上可以设置。
    在这里插入图片描述

2 菜单栏、工具栏、状态栏

2.1 菜单栏

  • 菜单是一些列命令的列表
  • 为了实现菜单、工具栏按钮、键盘快捷方式等命令的一致性,Qt使用动作(QAction)来表示这些命令
  • Qt的菜单就是由一系列的QAction动作对象构成的列表
  • 菜单栏是包含菜单的面板,位于主窗口标题栏的下面
  • 一个主窗口只能有一个菜单栏

2.2 QAction

  • QAction类提供了抽象的用户界面action,这些action可以被放置在窗口控件中
  • QAction可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。
  • QAction是可以作为独立的对象被创建,也可以在构建菜单时创建。
  • QAction可以包含一个图标、菜单文本、快捷键、状态文本等。
  • 只有将QAction添加到窗口控件上,才可以使用这些QAction。

2.3 工具栏

  • 工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使用的命令(动作)组成
  • 工具栏位于菜单栏的下面、状态栏的上面,可以停靠在主窗口的上下左右四个方向
  • 一个主窗口可以包含多个工具栏

2.4 状态栏

  • 提供一个用于展示状态信息的水平栏

3 混合方式UI设计

  • 可视化UI设计无需人工编写代码区处理大量繁琐的界面组件的创建和布局管理工作,可以直观地进行界面设计,大大提高工作效率。但某些组件无法可视化地添加到界面上。
  • 采用纯代码方式进行UI设计虽然无所不能,但是设计效率太低,过程非常繁琐。
  • 混合方式创建UI,即部分界面设计用UI设计器可视化实现,部分无法在UI设计器里实现的界面设计用代码实现。
    案列:实现下面的窗口及其功能
    在这里插入图片描述

1: 新建工程名为Editor,基类是QMainWindow,UI组件选择Text Edit,在窗口上选择控件-》视图-》action editor,在弹出的窗口中,新建下面的选项
在这里插入图片描述

2:设计菜单栏
在窗口上方输入文件,然后将action控件拖入其中
在这里插入图片描述

将控件拖入,当上方出现红色线条时,就说明成功了
在这里插入图片描述

然后依次完成以下页面的设计
在这里插入图片描述

3:设计工具栏
在窗口空白处单击,选择添加工具栏,依次将action控件拖入其中,效果如下
在这里插入图片描述

4:设计相关的槽函数,其中粘贴、剪切、复制、退出和清空不需要我们自定义槽函数,可以在页面上选择,其他均需要生成对应的槽函数。页面可选择如下:
在这里插入图片描述

自己选择的如下:
在这里插入图片描述

其中粗体、斜体、下划线、工具栏、状态栏是需要选择triggered(bool checked)这个槽函数的
在Text Edit控件中需要选择两个槽函数
在这里插入图片描述

5:根据原图,我们还需要字体和字号的控件,这俩需要我们自己书写定义

private:
// 自定义的槽函数void on_m_combFontName_currentIndexChanged(const QString &fontName);void on_m_spinFontSize_valueChanged(int fontSize);
// 变量QFontComboBox * m_combFontName;// 字体组合框对象指针QSpinBox* m_spinFontSize;// 存储字号QLabel* m_labCurFile;//当前文件

6:书写逻辑,源文件如下

EditorWindow::EditorWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::EditorWindow)
{ui->setupUi(this);// 设置中心组件setCentralWidget(ui->m_edit);// 设计工具栏ui->toolBar->addSeparator();// 添加分隔符 在当前工具栏的末尾添加ui->toolBar->addWidget(new QLabel(" 字体大小:"));// 字号大小m_spinFontSize = new QSpinBox; // 字号选择框m_spinFontSize->setMinimumWidth(60);//最小的宽度m_spinFontSize->setRange(8,72);// 字号大小的范围ui->toolBar->addWidget(m_spinFontSize);ui->toolBar->addWidget(new QLabel(" 字体名称:")); // 字体名称m_combFontName = new QFontComboBox;// 字体选择框m_combFontName->setMinimumWidth(80);//最小的宽度ui->toolBar->addWidget(m_combFontName);m_labCurFile = new QLabel("当前文件: "); // 添加尾部状态栏m_labCurFile->setMinimumWidth(400);ui->statusbar->addWidget(m_labCurFile);//建立信号和槽的连接// 字体选择connect(m_combFontName,SIGNAL(currentIndexChanged(QString)),this,SLOT(on_m_combFontName_currentIndexChanged(QString)));// 字号选择connect(m_spinFontSize,SIGNAL(valueChanged(int)),this,SLOT(on_m_spinFontSize_valueChanged(int)));
}
// 新建的槽函数
void EditorWindow::on_m_actNew_triggered(){QMessageBox::information(this,windowTitle(),"新建 文件 等待 处理");
}
// 打开的槽函数
void EditorWindow::on_m_actOpen_triggered()
{QMessageBox::information(this,windowTitle(),"打开 文件 等待 处理");}// 粗体的槽函数void EditorWindow::on_m_actBold_triggered(bool checked){QTextCharFormat fmt;fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 斜体的槽函数
void EditorWindow::on_m_actItalic_triggered(bool checked)
{QTextCharFormat fmt;fmt.setFontItalic(checked);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 下划线的槽函数
void EditorWindow::on_m_actUnderline_triggered(bool checked)
{QTextCharFormat fmt;fmt.setFontUnderline(checked);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 状态栏的槽函数
void EditorWindow::on_m_actStatusbar_triggered(bool checked)
{ui->statusbar->setHidden(!checked);
}
// 工具栏的槽函数
void EditorWindow::on_m_actToolbar_triggered(bool checked)
{ui->toolBar->setHidden(!checked);
}
// 关于的槽函数
void EditorWindow::on_m_actAbout_triggered()
{QMessageBox::information(this,windowTitle(),"关于 文件 等待 处理");
}
// 文本框 可复制槽函数
//何时m_edit中的信息可以被拷贝 - 复制/剪切
//如果不能复制和剪切 - 将两个QAction禁用
//文本框 文字改变槽函数
void EditorWindow::on_m_edit_copyAvailable(bool b)
{// 复制使能ui->m_actCopy->setEnabled(b);// 剪切使能ui->m_actCut->setEnabled(b);
}
// 文本发生改变的 槽函数  文本发生改变时判断是否可以清空
void EditorWindow::on_m_edit_textChanged()
{ui->m_actClear->setEnabled(ui->m_edit->toPlainText().size());
}
// 文本框 文本选择改变槽函数
void EditorWindow::on_m_edit_selectionChanged()
{// 当有文本选中时,查看对应文本已经设置的格式QFont font = ui->m_edit->currentFont();ui->m_actBold->setChecked(font.bold());//粗体ui->m_actItalic->setChecked(font.italic());//斜体ui->m_actUnderline->setChecked(font.underline());//下划线m_combFontName->setCurrentFont(font);// 字体m_spinFontSize->setValue(font.pointSize());
}
// 字体变化槽函数
void EditorWindow::on_m_combFontName_currentIndexChanged(const QString &fontName){QTextCharFormat fmt;fmt = ui->m_edit->currentCharFormat();fmt.setFontFamily(fontName);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 字号变化槽函数
void EditorWindow::on_m_spinFontSize_valueChanged(int fontSize){QTextCharFormat fmt;fmt = ui->m_edit->currentCharFormat();fmt.setFontPointSize(fontSize);ui->m_edit->mergeCurrentCharFormat(fmt);
}

相关文章:

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件,是许多应用程序&…...

四川景源畅信:抖音小店新手如何做?

随着短视频平台的兴起,抖音小店成为了许多创业者的新选择。但是,对于新手来说,如何在抖音上开设并经营好自己的小店呢?本文将围绕这一问题展开讨论。 一、明确目标和定位作为抖音小店的新手,首先要明确自己的经营目标和定位。是想…...

EventSource

什么是EventSource EventSource 是一个用于服务器推送事件(Server-Sent Events, SSE)的接口,它允许服务器推送实时更新到浏览器。与 WebSocket 不同,SSE 是单向的(服务器到客户端),适用于更新频…...

Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字

场景需求: Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字。如下图:默认提示字变成了英文,如何将其 变成 汉字提示呢? 解决方案: 1.方案1:修改DOM内容 不提倡此方案&#xf…...

【简单介绍下线性回归模型】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

有限元法之有限元空间的构造

目录 一、区域Ω的剖分 二、三角形一次元 三、一次元的基函数与面积坐标 四、三角形二次元及其基函数 前两节我们介绍了有限元基本概念和变分理论的推导,本节我们继续探讨有限元空间的构造。 一、区域Ω的剖分 对矩形区域进行三角剖分,其中x方向剖…...

高通车规芯片分析

高通三款芯片 SA8155P 7nm SA8295P 5nm SA8255P 5nm 分析AECQ等级 AECQ100里面定义了5个工作环境温度等级:Grade0:-40-150 Grade1:-40-125 Grade2:-40-105 Grade3:-40-85 Grade4:0-70AEC-Q100整体认证测试…...

Flutter 中的 TextButton 小部件:全面指南

Flutter 中的 TextButton 小部件:全面指南 在Flutter的世界里,TextButton是一个基础的小部件,用于创建只包含文本的按钮。它通常用于对话框、表单以及需要强调主要操作的界面。本文将为您提供一个全面的指南,帮助您了解如何使用T…...

通过键值对访问字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,如果想将字典的内容输出也比较简单,可以直接使用print()函数。例如,要想打印dictionary字典&#xff…...

海外仓扫码管理系统怎么选?精准,高效管理需求才是核心需求

海外仓对那些想拓展国际市场的商家来说还是非常重要的,大部分的货物都需要先运到海外仓,才能继续进行下一步的物流快递发货。 那对于海外仓本身来说,当面临大量订单的时候,怎么快速的管理订单,拣选货物就变得十分重要…...

基于51单片机的智能灯光控制系统

一.硬件方案 智能灯光控制系统由单片机最小系统、人体感应模块、关照强度模块、灯光控制模块、电源模块和灯泡组成。本文以STC89C52单片机为核心,通过利用光照度和红外人体感应相结合主动与被动的探测方法,现了室内无人或者关照充足时灯光自动光灯&…...

测试开发面试题

简述自动化测试的三大等待 强制等待。直接使用time.sleep()方法让程序暂停指定的时间。优点是实现简单,缺点是不够灵活,可能会导致不必要的等待时间浪费。隐式等待。设置一个固定的等待时间,在这个时间内不断尝试去查找元素,如果…...

多线程JUC 第2季 BlockingQueue 阻塞队列

一 阻塞队列 1.1 阻塞队列介绍 阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列: put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。 take方法&#x…...

【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索

博主PS:你可以把他理解为,查询猜测,膨胀查询,查询的第六感。 全文搜索支持查询扩展(尤其是其变体“盲查询扩展”)。 当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索…...

【面试必看】Java并发

并发 1. 线程 1. 线程vs进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。 系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进…...

C++的第一道门坎:类与对象(一)

1.面向过程与面向对象 1.1面向过程 我们之前学习的C语言就是一种面向过程的语言,面向过程的语言强调的是具体实现的过程,一般用函数来具体实现。我们用面向过程的思想,就可以把炒菜分为以下几个步骤: 1.2面向对象 而对于面向对象的语言而言…...

经典面试题:MySQL如何调优?

目录 前言1. SQL查询优化2. 索引优化3. 表结构设计4. 硬件与配置优化5. 日常维护6. 性能测试与基准测试 前言 MySQL如何进行调优?这是面试中容易被问到的高频问题。 1. SQL查询优化 避免使用select* :只选取需要的列,减少数据传输量。使用…...

【程序员如何送外卖】

嘿,咱程序员要在美团送外卖,那还真有一番说道呢。 先说说优势哈,咱程序员那逻辑思维可不是盖的,规划送餐路线什么的,简直小菜一碟。就像敲代码找最优解一样,能迅速算出怎么送最省时间最有效率。而且咱平时…...

【git pull 和 push详解】

git pull 和 push详解 1.背景2.命令和解释2.1 git pull简介详情 2.2 git push简介Git Push 参数及详细解释 1.背景 在分布式开发环境中,git pull和git push的使用确保了团队成员之间的代码一致性,减少了不同步导致的问题。它们简化了版本管理&#xff0c…...

数据挖掘导致直接路径读(direct path read)耗尽了IO

一大早就有喊业务卡的,检查等待事件源头,均为oracle写等待 查看IO负载持续维持在100%繁忙 后台有两个并行rman备份在,停止备份io繁忙没有好转,检查最近ash报告,发现DDTEK ODBC Oracle程序模块占用最高 检查该模块&…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

爬虫基础学习day2

# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...