当前位置: 首页 > 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程序模块占用最高 检查该模块&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...