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

news2025/1/21 18:28:21

文章目录

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

结束。

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

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

相关文章

计算机视觉模型的未来:视觉语言模型

一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…

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

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

计算机的错误计算(二百一十七)

摘要 大模型能确定 sin(2.6^100) 的符号吗&#xff1f;实验表明&#xff0c;无法确定。因为正弦的自变量值比较大&#xff0c;虽然大模型尝试了许多种方法。这个大模型特别认真负责。 例1. sin(2.6^100) 的符号&#xff1f; 下面是与一个大模型的对话。 点评&#xff1a; …

解决wordpress媒体文件无法被搜索的问题

最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…

源代码保密技术的工作原理解析

SDC沙盒加密技术&#xff1a;深度解析与工作原理 在数据安全领域&#xff0c;加密技术是保护敏感信息免受泄露和未授权访问的关键手段。SDC沙盒采用了一系列先进的加密技术&#xff0c;确保数据在创建、存储、传输和使用过程中的全程加密&#xff0c;为企业提供了全方位的数据…

详解共享WiFi小程序怎么弄!

在数字化时代&#xff0c;共享WiFi项目​正逐渐成为公共场所的新标配&#xff0c;它不仅为用户提供了便捷的上网方式&#xff0c;还为商家带来了额外的收入来源。那么共享wifi怎么弄&#xff0c;如何搭建并运营一个成功的共享WiFi项目呢&#xff1f; 共享WiFi项目通过在公共场所…

C# 给定欧氏平面中的一组线可以形成的三角形的数量

给定欧氏平面中的一组线可以形成的三角形的数量(Number of Triangles that can be formed given a set of lines in Euclidean Plane) 给定欧氏平面上的 n 条不同直线的集合 L {l 1 , l 2 , ………, l n }。第i 条直线由形式为 a i x b i y c i的方程给出。求出可以使用集合…

KubeKey安装K8s和kubesphere

安装指南 在 Linux 上安装 Kubernetes 和 KubeSphere 卸载 Kubernetes 和 KubeSphere 前置工作-网络问题 yum -y install socat conntrack etables ipsetalias kkkubectl -n kubesphere-systemexport http_proxy10.10.x.x:7890 export https_proxy10.10.x.x:7890Docker设置网…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…

聊一聊 vPC Peer-gateway 网关增强功能

默认情况下 vPC 对等设备收到目的 MAC 地址为交换机上配置的 HSRP/VRRP 的虚拟 MAC 的数据报文,该交换机将根据其本地路由表对数据包进行路由并会用新的源目 MAC

基于深度学习的微出血自动检测及解剖尺度定位|文献速递-视觉大模型医疗图像应用

Title 题目 Toward automated detection of microbleeds with anatomical scale localization using deep learning 基于深度学习的微出血自动检测及解剖尺度定位 01 文献速递介绍 基于深度学习的脑微出血&#xff08;CMBs&#xff09;检测与解剖定位 脑微出血&#xff…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…

Video-RAG:一种将视频RAG新框架

1. 摘要及主要贡献点 摘要&#xff1a; 检索增强生成&#xff08;RAG&#xff09;是一种强大的策略&#xff0c;通过检索与查询相关的外部知识并将其整合到生成过程中&#xff0c;以解决基础模型生成事实性错误输出的问题。然而&#xff0c;现有的RAG方法主要集中于文本信息&…

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙&#xff0c;不知不觉又是一年&#xff0c;这一年收获满满。接下来&#xff0c;将本年度对技术的感悟和洞察分析如下&#xff0c;希望对大家有所帮助。 在过去几十年里&#xff0c;嵌入式系统技术迅速发展&#xff0c;成为现代电子设备和智能硬件的核心组成部分。…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板&#xff0c;学会了后感觉虽然简单&#xff0c;但开始也折腾了好久&#xff0c;这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”&#xff0c;这里命…

欧拉(Euler 22.03)安装ProxySQL

下载离线安装包 proxysql-2.0.8-1-centos7.x86_64.rpm 链接: https://pan.baidu.com/s/1R-SJiVUEu24oNnPFlm9wRw 提取码: sa2w离线安装proxysql yum localinstall -y proxysql-2.0.8-1-centos7.x86_64.rpm 启动proxysql并检查状态 systemctl start proxysql 启动proxysql syste…

Comsol 空气耦和超声表面波法检测PMMA表面裂纹

空气耦合超声表面波法是一种常用于检测材料表面裂纹的无损检测技术。下面是一些步骤&#xff0c;您可以使用这种方法来检测PMMA&#xff08;聚甲基丙烯酸甲酯&#xff09;表面裂纹&#xff1a; 1. 准备工作&#xff1a;准备一台超声波检测设备&#xff0c;包括超声发射器和接收…

Unsafe

1. 概念介绍 sun.misc.Unsafe 是 Java 中的一个特殊类&#xff0c;它提供了一组低级别的、不安全的操作&#xff0c;这些操作通常是 JVM 内部使用的。由于这些操作非常强大且危险&#xff0c;因此 Unsafe 类被设计为只能在受信任的代码中使用。 2. 主要功能和用途 内存操作&a…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…