Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录

  • 1、Qt窗口
  • 2、菜单栏
    • 设置快捷键
    • 添加子菜单
    • 添加分割线和菜单图标
  • 3、工具栏 QToolBar
  • 4、状态栏 QStatusBar
  • 5、浮动窗口 QDockWidget


1、Qt窗口

QWidget,即控件,是窗口的一部分。在界面中创建控件组成界面时,Qt自动生成了窗口,QMainWindow。

在这里插入图片描述

从外到内,窗口标题,菜单栏,工具栏,铆接部件或子窗口(比如widget.cpp),中心控件,状态栏。

2、菜单栏

一个主窗口最多只有一个菜单栏。

在这里插入图片描述

菜单栏用QMenuBar类来实现,菜单用QMenu类来实现,菜单项用QAction类来实现。

创建一个窗口项目

在这里插入图片描述
在这里插入图片描述

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

此时的w就是MainWindow类型了。ui文件中默认是这样的:

在这里插入图片描述
在这里插入图片描述

“在这里输入处”输入内容就是一个菜单,点击这个菜单,在这里输入,就创建菜单项。不过因为Qt Creator的bug,没办法正常用中文来输入,所以就在别的地方写好再复制过来。

此时是没有自动生成ui文件的,那用户就可以自己写,自己创建窗口对象;但如果自动生成了,用户再自己写,那么就会替换掉原本的对象,旧对象就不归Qt对象树管理,Qt也不会去释放它们,就能造成内存泄漏,除非关闭窗口。

代码创建菜单和菜单项

// mainwindow.h
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handle();private:Ui::MainWindow *ui;
};// mainwindow.cpp
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menuBar = new QMenuBar();this->setMenuBar(menuBar);// 自动生成了, 如下写法// QMenuBar* menubar = this->menuBar();// 创建菜单QMenu* menu1 = new QMenu("文件");QMenu* menu2 = new QMenu("编辑");QMenu* menu3 = new QMenu("设置");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);// 添加菜单项QAction* act1 = new QAction("打开");QAction* act2 = new QAction("运行");QAction* act3 = new QAction("调节大小");menu1->addAction(act1);menu2->addAction(act2);menu3->addAction(act3);// 菜单项被点击会触发信号triggered// 菜单项槽函数connect(act3, &QAction::triggered, this, &MainWindow::handle);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug() << "Act3";
}

设置快捷键

// 菜单
QMenu* menu3 = new QMenu("设置 (&T)");
// 菜单项
QAction* act3 = new QAction("调节大小 (&V)");

这样运行后,按一下alt,再按T就可以打开设置菜单了,按V就打印Act3了。不过这种是通用的,不是Qt做的。Qt用QShortCut来做快捷键,但上面的方法更简单。

添加子菜单

    // 子菜单QMenu* menu4 = new QMenu("打开目录");menu1->addMenu(menu4);QAction* act4 = new QAction("打开C盘");menu4->addAction(act4);

添加分割线和菜单图标

分割线

    QAction* act1 = new QAction("打开");QAction* act2 = new QAction("运行");QAction* act3 = new QAction("调节大小 (&V)");menu1->addAction(act1);menu1->addSeparator();

菜单图标,用qrc

    // 菜单图标QMenu* menu2 = new QMenu("编辑");menu2->setIcon(QIcon(":/clouds.jpg"));// 菜单项图标QAction* act2 = new QAction("运行");act2->setIcon(QIcon(":/ztk.jpg"));

3、工具栏 QToolBar

#include <QDebug>
#include <QToolBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QToolBar* toolBar = new QToolBar();// 菜单栏是set, 工具栏是add// 菜单栏不能重复设置, 而工具栏只是添加this->addToolBar(toolBar);QAction* act1 = new QAction("保存");QAction* act2 = new QAction("打开");toolBar->addAction(act1);toolBar->addAction(act2);connect(act1, &QAction::triggered, this, &MainWindow::handle1);connect(act2, &QAction::triggered, this, &MainWindow::handle2);
}void MainWindow::handle1()
{qDebug() << "Act1";
}void MainWindow::handle2()
{qDebug() << "Act2";
}

工具栏可以拖动。

如果给工具栏放上图标,也会替换掉文字。不过即使被替换掉了,文字还是会显示,会在鼠标悬停在对应位置上出现提示文字,这个提示我们可以自己设置。

act1->setToolTip("点击这里保存当前记录");

act1,act2,创建的菜单项不仅可以放到工具栏,也可以放到菜单栏,可以同时放置,释放时也不会重复释放,只要有一方释放了,另一方就不会进行释放。

创建多个工具栏,它们是从左到右依次排序的。

设置工具栏出现的初始位置,允许停放到哪些边缘,是否允许浮动,是否可以移动

    QToolBar* toolBar1 = new QToolBar();QToolBar* toolBar2 = new QToolBar();// 菜单栏是set, 工具栏是add// 菜单栏不能重复设置, 而工具栏只是添加this->addToolBar(toolBar1);this->addToolBar(Qt::RightToolBarArea, toolBar2);toolBar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);// 下面两个默认都为truetoolBar2->setFloatable(false);toolBar2->setMovable(false);

4、状态栏 QStatusBar

#include <QDebug>
#include <QLabel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* statusBar = new QStatusBar();// 无论状态栏是否被创建, 设置一下都没问题this->setStatusBar(statusBar);// 第二个参数表示多少ms后消息消失//statusBar->showMessage("状态信息", 4000);// 添加子控件QLabel* label1 = new QLabel("Label");// 另一个方法addPermanentWidget是从右到左添加// 不上面的状态消息显示才会显示这个labelstatusBar->addWidget(label1, 2);QLabel* label2 = new QLabel("label");// 第二个参数表示拉伸系数, 表示这个label占多少显示空间statusBar->addWidget(label2, 1);// 还可以加别的控件, 比如按钮, 进度条
}

5、浮动窗口 QDockWidget

#include <QDockWidget>
#include <QPushButton>
#include <QVBoxLayout>dockWidget->setWindowTitle("浮动窗口");// 添加子控件不能直接添加
// 先创建一个QWidget, 把子控件放到QWidget中
// 将QWidget放入浮动窗口中才能生效
QWidget* container = new QWidget();
dockWidget->setWidget(container);QVBoxLayout* layout = new QVBoxLayout;
container->setLayout(layout);QPushButton* button = new QPushButton("按钮");
layout->addWidget(button);// 设置浮动窗口允许停靠的位置
dockWidget->setAllowedAreas(Qt::RightDockWidgetArea | Qt::TopDockWidgetArea);

结束。

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

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

相关文章

SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter

前言 在微服务架构中&#xff0c;API 网关扮演着至关重要的角色&#xff0c;负责路由请求、执行安全验证、流量控制等任务。Spring Cloud Gateway 作为一个强大的网关解决方案&#xff0c;提供了灵活的方式来实现这些功能。 本篇博客将重点介绍如何在 Spring Cloud Gateway 中…

Redis源码-redisObject

解释 redis中&#xff0c;所有的数据类型最终都转换成了redisObject&#xff0c;该结构体的定义&#xff0c;在文件server.h中。 参数说明 参数名说明unsigned type:4对象对应的数据类型unsigned encoding:4对象的编码方式unsigned lru:LRU_BITSLRU算法清空对象&#xff0c…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

js重要知识点

目录 一、冒泡排序的计算方法 二、数组forEach方法 三、Number(null)和Number(undefined) 四、es6中的set 一、冒泡排序的计算方法 冒泡排序的重点:两次循环&#xff0c;外层循环是总共要进行的躺数,为数组总长度-1,内层循环则是每个元素在每一次循环中需要比较的次数&#xff…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中&#xff0c;开始在所有平台上推出这一功能。 1.1. 更新版本&#xff1a; Chrome 126 在 ChromeOS、Linux、Mac、Windows 上&#xff1a;在 1% 的稳定版用户…

2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39072 本报告合集洞察从多个维度全面解读微短剧行业。在行业发展层面&#xff0c;市场规模与用户规模双增长&#xff0c;创造大量高收入就业岗位并带动产业链升级。内容创作上&#xff0c;精品化、品牌化趋势凸显&#xff0c;题材走…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Python基于Django的社区爱心养老管理系统设计与实现【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

基于OpenCV和Python的人脸识别系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

吴恩达深度学习——神经网络编程的基础知识

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^​wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…

从前端视角看设计模式之结构型模式篇

上篇我们介绍了 设计模式之创建型模式篇&#xff0c;接下来介绍设计模式之结构型模式篇 适配器模式 适配器模式旨在解决接口不兼容的问题&#xff0c;它通过创建一个适配器类&#xff0c;将源对象的接口转换成目标接口&#xff0c;从而使得不兼容的接口能够协同工作。简单来说…

彻底讲清楚 单体架构、集群架构、分布式架构及扩展架构

目录 什么是系统架构 单体架构 介绍 示例图 优点 缺点 集群架构 介绍 示意图 优点 缺点 分布式架构 示意图 优点 缺点 生态扩展 介绍 示意图 优点 缺点 扩展&#xff1a;分布式服务解析 纵切拆服务 全链路追踪能力 循环依赖 全链路日志&#xff08;En…

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

成就与远见:2024年技术与思维的升华

个人主页&#xff1a;chian-ocean 前言: 2025年1月17日&#xff0c;2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300&#xff0c;虽然与顶尖博主仍有一定差距&#xff0c;但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…

【前端】CSS学习笔记(2)

目录 CSS3新特性圆角阴影动画keyframes 创建动画animation 执行动画timing-function 时间函数direction 播放方向过渡动画&#xff08;transition&#xff09; 媒体查询设置meta标签媒体查询语法 雪碧图字体图标 CSS3新特性 圆角 使用CSS3border-radius属性&#xff0c;你可以…

基于.Net Core+Vue的文件加密系统

1系统架构图 2 用例图 管理员角色的用例&#xff1a; 文件分享大厅&#xff1a;管理员可以访问文件分享大厅&#xff0c;下载文件。个人信息管理&#xff1a;管理员可以更新自己的个人信息&#xff0c;修改密码。用户管理&#xff1a;管理员负责创建、更新或删除用户账户&…