4-主窗口

news2024/9/8 12:28:32

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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔部署前后端分离项目手册

文章目录 安装宝塔安装环境开始部署1. 前端Vue项目1.先本地启动前端项目(记住端口号)2.打包前端项目3.上传前端项目4.创建PHP站点5.安全里开放端口号6.测试前端 2. 后端boot项目1. 先在本地跑起来2.修改数据库的配置信息3. 项目打包4. nohup启动项目4.1 …

2024年必看!会声会影神器升级,让你的视频制作技能直线上升

在数字媒体内容呈现爆炸式增长的今天,无论是个人还是企业,都开始重视视频制作与编辑的质量。一款优秀的视频编辑软件,不仅需要具备强大的功能,更需要提供直观、高效的用户体验。在这样的背景下,会声会影2024应运而生&a…

《开发问题解决》Window下7z解压:cannot create symbolic link : 客户端没有所需的特权

问题描述: 今天使用7z来解压东西的是突然出现这个问题。 问题解决: download直接下载到c盘中,由于所在文件夹有权限限制。无法进行正常解压。 7.zip解压时使用管理员权限进行解压,解压时使用管理员权限。即如图 使用管理员权限重…

基于飞书机器人跨账号消息提醒

事情的起因是飞书中不同的账号不能同时登录,虽然可以在飞书的账号切换页面看到其他账号下是否有消息提醒(小红点),但是无法实现提醒功能,很不优雅,因此本文尝试提出一种新的方式实现不同账号之间的提醒功能…

基于Go实现的分布式主键系统

基于Go实现的分布式主键系统 摘要 随着互联网的发展,微服务得到了快速的发展,在微服务架构下,分布式主键开始变得越来越重要。目前分布式主键的实现方式颇多,有基于数据库自增的、基于UUID的、基于Redis自增的、基于数据库号段的…

时空AI软件:地理信息与遥感领域的智慧引擎

在地理信息与遥感技术的广阔疆域,时空AI软件如同一颗璀璨新星,将时空信息与智能深度融合,驱动着地理信息分析、决策支持、环境监测、城市规划等领域的深刻变革。本文将深入剖析其技术核心、应用实例、未来趋势,探索时空AI软件如何…

OrangePi Kunpeng Pro 开发板测评及Python开发实测

一、背景 首先感谢 创新乐知通过CSDN 邀请本人,参与这次 评测活动。这块开发板是香橙派联合华为精心打造,具有超强算力的鲲鹏开发板。本人使用最多的还是树莓派系列的板子,国产板子特别是华为为核心的板子还是头一次使用,特别感兴…

使用 Spring Cloud Alibaba AI 构建 RAG 应用

作者:姬世文 背景介绍 RAG(Retrieval Augmented Generation) 检索增强生成(RAG)是一种用于将数据与人工智能模型集成的技术。在 RAG 工作流程中,第一步将文档数据加载到矢量数据库(例如 Redi…

【Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题:2.3.1 面试题一:2.3.2 面试题二:2.3.3 面试题三:2.3.4 面试题四: 2.4 String类字符串用于比较的方法2.5 String类字…

万博智云×华为云 | HyperBDR云容灾上架,开启联营联运新篇章

日前,万博智云HyperBDR云容灾正式入驻华为云云商店,成为华为云基础软件领域联营联运合作伙伴。通过联营联运,双方将进一步加深在产品、解决方案、渠道拓展等多方面的强强联合,为企业提供更加安全、高效的数据保护解决方案&#xf…

halcon 传统缺陷检测

一、电路检测 算子解释 dyn_threshold *dyn_threshold 利用局部阈值分割图像*OrigImage (input_object):原始图像*ThresholdImage (input_object):处理后图像(一般采用滤波处理)*RegionDynThresh (output_object)&#xff1…

GpuMall智算云:QwenLM/Qwen1.5/Qwen1.5-7B-Chat

Qwen 是阿里巴巴集团 Qwen 团队的大型语言模型和大型多模态模型系列,现在大型语言模型已经升级到 Qwen1.5 版本。 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 无论是语言模型还是多模态模型,都在大规模的多语言和多模…

新楚文化知网收录文学艺术类期刊投稿

《新楚文化》是由国家新闻出版总署批准,湖北省文学艺术界联合会主管,湖北今古传奇传媒集团有限公司主办的正规期刊。主要刊登文化、文学、艺术类稿件;包括传统文化、非遗、历史文化、地方文化、中外友好文化交流、文学作品研究、艺术研究等方…

20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件

文件选择窗口 正常我们使用input type"file"属性上传文件,会唤起系统的文件选择器如下: 打开按钮 可以通过change事件监听: // 增加的部分:创建 loading 实例变量 let loadingInstance;let box document.createEl…

流量分析入门

什么是流量分析 通过捕捉网络中流动的数据包,查看里面的数据和协议,流量分析和各种数据的统计来发现网络运行中的问题,在ctf中一般是一个包含流量数据的 PCAP 文件。 [陇剑杯 2021]签到 1.题目问我们正在进行的事什么协议的攻击 2.打开wire…

Spring Boot开发中常用注解总结【建议收藏】

Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring框架中的 AOP(面向切面编程)概念。 Spring 的 AOP 可以帮助开发者实现一些非业务功能的代码,如…

Vue3:封装Table 表格组件

组件官网 elementPlus : 点击跳转 封装组件 创建新的组件文件: Table.vue <!-- PropTableS &#xff1a; 父组件传递过来的数据 (对象)PropTableS.tables : 父组件传递的对象中 存放表格每行显示的数据PropTableS.keyS &#xff1a; 父组件传递过来的对象&#xff0c;里…

第十四 Elasticsearch介绍和安装

docker-compose安装 kibana: image: docker.elastic.co/kibana/kibana:7.5.1 container_name: kibana ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch…

所有平台均可发布,矩阵操作+工具+素材,自动混剪8090后怀旧视频

“怀旧”这个词对于80、90后来说&#xff0c;总能勾起一阵阵心中的涟漪。无论是那些留存在记忆深处的动画经典&#xff0c;还是代代相传的游戏主题曲&#xff0c;亦或是那个时代特有的玩具&#xff0c;都构成了他们共同的美好回忆。就像乘坐一艘穿梭机&#xff0c;怀旧视频能够…

Vectorworks 2024 Mac安装包下载Vectorworks 2024安装教程3D建模设计工具

安装 步骤 1&#xff0c;双击下载好的安装包&#xff0c;打开。 2&#xff0c;将G1DXHL.ldf拖到桌面上备用。 3&#xff0c;返回打开的镜像 选择install vectorworks2024 双击打开启动安装程序。电脑就90hi高腰腿疼痛和Y&Aaa9yY 4&#xff0c;输入电脑密码。 5&#xff0…