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_OBJECT

public:
    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);
    // 下面两个默认都为true
    toolBar2->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是从右到左添加
    // 不上面的状态消息显示才会显示这个label
    statusBar->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);

结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Web开发高级——Spring Boot与Docker容器化部署

随着云计算和微服务架构的快速发展&#xff0c;容器化已成为现代应用部署的重要手段。Docker作为最受欢迎的容器化技术之一&#xff0c;使得开发者能够将应用及其所有依赖打包到一个可移植的容器中&#xff0c;简化了开发、测试、部署和运维的流程。本篇文章将通过以下内容讲解…

SSM宠物医院信息管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 宠…

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…

回归人文主义,探寻情感本质:从文艺复兴到AI时代,我的情感探索之旅

回归人文主义&#xff0c;探寻情感本质&#xff1a;从文艺复兴到AI时代&#xff0c;我们的情感探索之旅 多年来&#xff0c;我们的团队一直关注人工智能&#xff0c;尤其是AI在音乐领域的应用研究。随着技术的不断演进&#xff0c;我们也不断反思&#xff1a;在“算法、代码、…

【2025 ODA teigha系列开发教程一】实现WPF ViewDirectX DWGDXF 模式图纸的预览查看,缩放

&#x1f3a8; CAD图纸查看器 下载Teigha SDK 21.6 FOR C# &#x1f4d6; 项目介绍 嗨&#xff01;欢迎来到CAD图纸查看器项目&#xff01;这是一个基于WPF和Teigha SDK开发的专业CAD文件查看工具。无论你是工程师、设计师&#xff0c;还是其他需要查看CAD图纸的专业人士&a…

【LeetCode100】--- 寻找重复数

题目传送门 方法一&#xff1a;暴力解法&#xff08;超时&#xff09; 算法原理 双重循环&#xff0c;每次固定一个数&#xff0c;再遍历别的数。比较这两个数是否相等&#xff0c; 若相等则返回这个数。就是重复数。 复杂度分析 时间复杂度&#xff1a;O&#xff08;N方&…

doris 2.1 Queries Acceleration-Hints 学习笔记

1 Hint Classification 1.1 Leading Hint:Specifies the join order according to the order provided in the leading hint. 1.2 Ordered Hint:A specific type of leading hint that specifies the join order as the original text sequence. 1.3 Distribute Hint:Speci…

【2024博客之星】我的年度技术总结:Netty渡劫指南--从线程暴走到百万长连接,这一年我踩过的坑比写的代码还多

时间过得真快&#xff0c;作为一名十年的技术老鸟&#xff0c;这一年来跟Netty打交道打得不少。今天就聊聊这一年来我跟Netty的那些事儿&#xff0c;还有我在学习它技术原理时的一些总结。 导读 Netty再相见&#xff1a;捡起来、用起来Netty原理学习&#xff1a;边啃边写变总结…

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…

【CSDN博客之星2024】主题创作《总结2024,为了遇见更好的2025》

【博客之星2024】主题创作《总结2024&#xff0c;为了更好的2025》 一、AI技术变革日新月异二、总结我的CSDN2024三、技术深耕&#xff0c;从实践中汲取力量3.1、在数据库技术方面3.2、在javavue前后端开发领域3.3、在项目运维领域3.4、在GIS开发方面 四、2025工作计划五、2025…

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xff0c;保证我们…

数据库存储上下标符号,sqlserver 2008r2,dm8

sqlserver 2008r2&#xff1a; 数据类型需要用nvarchar插入数据时字符串前需要用N create table test( col1 varchar(50), col2 nvarchar(50) ) insert into test(col1,col2) values(U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀,U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀) insert into…

Java高频面试之SE-15

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; String 怎么转成 Integer 的&#xff1f;它的原理是&#xff1f; 在 Java 中&#xff0c;要将 String 转换为 Integer 类型&#xff0c;可…

nacos2.3.0 接入pgsql或其他数据库

首先尝试使用官方插件进行扩展&#xff0c;各种报错后放弃&#xff0c;不如自己修改源码吧。 一、官方解决方案 1、nocos 文档地址&#xff1a;Nacos 配置中心简介, Nacos 是什么 | Nacos 官网 2、官方解答&#xff1a;nacos支持postgresql数据库吗 | Nacos 官网 3、源码下载地…

城市电动出行的智慧升级:充电桩可视化管理

通过图扑可视化管理平台&#xff0c;实时监控与优化城市充电桩网络&#xff0c;提高运维效率与用户满意度&#xff0c;支撑绿色交通体系发展&#xff0c;为电动出行打造更加智能化的基础设施解决方案。

关于 Cursor 的一些学习记录

文章目录 1. 写在最前面2. Prompt Design2.1 Priompt v0.1&#xff1a;提示设计库的首次尝试2.2 注意事项 3. 了解 Cursor 的 AI 功能3.1 问题3.2 答案 4. cursor 免费功能体验5. 写在最后面6. 参考资料 1. 写在最前面 本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣…

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…

基于 MDL 行情插件的中金所 L1 数据处理最佳实践

本文介绍了如何通过 DolphinDB 的 MDL 插件订阅并处理中金所 Level 1 实时数据。首先&#xff0c;文章简要介绍了 MDL 插件的功能和作用。它是基于 MDL 官方提供的行情数据服务 C SDK&#xff08;即 TCP 版本 MDL &#xff09;实现&#xff0c;提供了实时数据获取和处理的能力。…

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…

LabVIEW电源纹波补偿

在电子设备的电源管理中&#xff0c;电源纹波的存在可能会对设备的稳定性和性能产生负面影响。以某精密电子仪器的电源纹波补偿为例&#xff0c;详细阐述如何运用 LabVIEW 编写程序进行电源纹波补偿。将从电源纹波特点、测量采样、滤波、反馈控制等多个方面展开介绍。 ​ 电源…