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.rhkb.cn/news/7079.html

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

相关文章

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代&#xff0c;构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架&#xff0c;以其快速开发、简洁配置和丰富的生态支持&#xff0c;深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…

快门:凝固瞬间与塑造动感的魔法开关

目录 一、快门的基本概念 二、快门速度的分类及效果 &#xff08;一&#xff09;高速快门 &#xff08;二&#xff09;低速快门 &#xff08;三&#xff09;安全快门 三、快门优先模式&#xff1a;掌控拍摄节奏的利器 四、快门与其他摄影要素的关系 &#xff08;一&…

2025发文新方向:AI+量化 人工智能与金融完美融合!

2025深度学习发论文&模型涨点之——AI量化 人工智能的融入&#xff0c;使量化交易实现了质的突破。借助机器学习、深度学习等先进技术&#xff0c;人工智能可高效处理并剖析海量市场数据&#xff0c;挖掘出数据背后错综复杂的模式与趋势&#xff0c;从而不仅提升了数据分析…

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

golang网络编程

socket编程 socket图解 Socket是BSD UNIX的进程通信机制&#xff0c;通常也称作”套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。Socket可以理解为TCP/IP网络的API&#xff0c;它定义了许多函数或例程&#xff0c;程序员可以用它们来开发TCP/IP网…

「 机器人 」仿生扑翼飞行器中的“被动旋转机制”概述

前言 在仿生扑翼飞行器的机翼设计中,模仿昆虫翼的被动旋转机制是一项关键技术。其核心思想在于:机翼旋转角度(攻角)并非完全通过主动伺服来控制,而是利用空气动力和惯性力的作用,自然地实现被动调节。以下对这种设计的背景、原理与优势进行详细说明。 1. 背景:昆虫的被动…

git远程仓库如何修改

1.需要做的事情&#xff1a;把git的远程仓库修改掉&#xff0c;在git创建一个自己的仓库 如果你是私有化的话&#xff0c;可以生成一个自己token令牌也可以。到时候push的时候会让你登录你就可以输入你的token令牌和用户名。 2.查看当前仓库的远程地址是不是自己的 &#xff…

罗氏线圈的学习【一】

TI的罗氏线圈介绍&#xff0c;讲解的非常好&#xff1a; 具有低功耗低成本性能的PCB罗氏线圈与积分电路设计 罗氏线圈&#xff08;Rogowski Coil&#xff09;是一种常见的电流测量装置&#xff0c;广泛用于高精度和非接触式的电流测量场景&#xff0c;尤其是在测量交流电流、…

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit&#xff08;0/1&#xff09;来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w&#xff08;宽&#xff09;和q/h&#xff08;高…

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…

32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)

背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;一&#xff09; 继续stdio测试的分析&#xff0c;上篇讲到标准IO端口初始化&#xff0c;单从测试内容来说其实很简单&#xff0c;没啥可分析的&#xff0c;但这几篇…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

(算法竞赛)使用广度优先搜索(BFS)解决迷宫最短路径问题

在这个充满奇思妙想的世界里&#xff0c;每一次探索都像是打开了一扇通往新世界的大门。今天&#xff0c;我们将踏上一段特别的旅程&#xff0c;去揭开那些隐藏在代码、算法、数学谜题或生活智慧背后的秘密。&#x1f389;&#x1f60a; 所以&#xff0c;系好安全带&#xff0…

总线、UART、IIC、SPI

一图流 总线 概念 连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质 类型 片内总线&#xff1a;连接处理器内核和外设的总线&#xff0c;在芯片内部 片外总线&#xff1a;连接芯片和其他芯片或者模块的总线 总线的通信 总线通信的方式 串行通信 数据按位顺序传…

CLion开发Qt桌面

IDE&#xff1a;CLion Qt Qt版本&#xff1a;5.12 学习正点原子的嵌入式Linux开发板时&#xff0c;使用Qt Creator写代码不是很方便&#xff0c;遂尝试使用CLion搭建Qt开发环境。 一、CLion的Qt环境搭建 1&#xff0c;配置工具链 找到Qt的安装目录&#xff0c;此处为E:\Tools\…

一部手机如何配置内网电脑同时访问内外网

做过运维的朋友都知道&#xff0c;最麻烦的是运维电脑不能远程&#xff0c;每次都得现场进行维护&#xff0c;明明客户那边有可以访问内网的电脑&#xff0c;怎么操作能将这台电脑能访问跟到外网呢&#xff0c;这样不就能通过远程软件远程了吗&#xff1f;嘿嘿。按以下步骤试试…

【深度学习】搭建PyTorch神经网络进行气温预测

第一步 数据加载与观察 ①导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline ②加载数据 features pd.read_csv(…

MyBatis优化及高级查询

一、MyBatis优化 1.配置文件属性 MyBatis可以将数据库配置单独放在一个properties文件中。如创建一个db.properties文件&#xff0c;内容如下&#xff1a; divercom.mysql.jdbc.Driverurljdbc:mysql://localhost:3306/mybatisusernamerootpassword123 接下来在配置文件中&a…