QT--控件篇四
一、对话框
- 在软件开发中,对话框(Dialog)是一种常见的用户界面元素,用于与用户进行交互和获取信息。它通常以模态或非模态的形式出现,模态对话框会阻止用户与应用程序的其他部分交互,直到对话框关闭为止,而非模态对话框允许用户在对话框打开的同时与应用程序的其他部分交互。
- 在UI界面就是Dialog Button Box控件,包含所有对话框,具体使用特定的对话框时,需要包含其特定的头文件。
- 父对象可以填写this,表示必须先处理该对话框才能在父对象上操作,填写nullptr,则不用,可能导致父对象,关闭,而对话框不关闭
- 检查用户是否取消了对话框操作,并适当处理这种情况。例如,在文件选择对话框中,如果返回的路径为空,表示用户取消了操作。
1.输入对话框Input Dialog
- 使用输入对话框,先包含头文件<QInputDialog>
- QString txt = QInputDialog::getText(父对象,QString 标题,QString 内容描述。
例如QString date = QInputDialog::getText(this,"星期","请输入星期几");getText的返回值就是你输入的内容,它属于QString类。
2.消息对话框
- 使用消息对话框,先包含头文件<\QMessageBox>
- 如你所见,是Box->盒子,即它也多种类型。不过使用方法一样,就是提醒图片略有不同。包含information、warning、critical、question对话框。
- 按键值 = QMessageBox::information(父对象,QString 标题,QString 提示,按键组合,默认按键);
information可以替换为:warning、critical、question - 举例
QMessageBox::StandardButton btn;//存储用户的选择结果。是枚举类型喔
btn = QMessageBox::information(this,"标题:告示","今天食堂不营业",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);然后可以根据用户的选择进行相应的操作如,if,Switch等。
3.文件对话框
- 文件对话框是一个标准的对话框,允许用户选择一个或多个文件来打开、保存或选择目录。在 Qt 中,QFileDialog 类提供了丰富的功能来处理这些需求。
- 使用文件对话框,先包含头文件<\QFileDialog>
QFileDialog::getOpenFileName是 Qt 中用于显示文件打开对话框的方法。它允许用户选择一个文件并返回所选文件的路径。
使用方法
原型:QString QFileDialog::getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options())QString filename = QFileDialog::getOpenFileName(父对象,标题,默认路径,筛选器);
筛选器: 通常以后缀来进行筛选,如*.txt,*.png等等。但是“;;”的左边和右边是互斥选择的。
filename存储的你所选择的路径,即getOpenFileName的返回值。举例代码
QString filename = QFileDialog::getOpenFileName(this,"标题:请选择一个文件","./", "*.txt ;; *.c *.h " );
if(filename.isEmpty() ){qDebug()<<"you select none";return;
}
qDebug()<<"you will open "<<filename;注意
getOpenFileNames只需要将接受返回值的类型改为QStringList类型即可。
- QFileDialog::getSaveFileName 是 Qt 中用于显示保存文件对话框的方法。它允许用户选择保存文件的位置和名称,并返回所选文件的路径。格式与getOpenFileName差不多
QString fn = QFileDialog::getSaveFileName(this,"标题:请输入保存的文件名",".","*.png ;; *.jpeg *.jpg");qDebug()<<"you will save "<<fn;
- QFileDialog::getExistingDirectory 是 Qt 中用于显示目录选择对话框的方法。它允许用户选择一个目录,并返回所选目录的路径。
QFileDialog::getExistingDirectory(父对象,"标题:选择路径","默认路径");*/QString fn = QFileDialog::getExistingDirectory(this,"标题:选择路径",".");
- 代码


二、布局
- 在Qt中进行布局是一个非常常见的任务,通常使用布局管理器(Layout Managers)来组织和管理窗口部件的位置和大小。
- 它们之间是可以嵌套使用的
1.vertical layout
- 垂直布局(QVBoxLayout)是Qt中的一个布局管理器,用于将控件垂直排列在窗口或其他容器中。其主要作用是方便地管理和组织窗口部件的位置和大小,使界面看起来更加整洁和易于调整。

2. horizontal layout
- 水平布局(QHBoxLayout)是Qt中的一个布局管理器,用于将控件水平排列在窗口或其他容器中。

3. grid layout
- 网格布局(QGridLayout)是Qt中的一个布局管理器,用于将控件按照网格形式排列在窗口或其他容器中
- 特点:
- 网格排列:控件可以按照指定的行和列放置,每个控件可以占据一个或多个网格单元。
- 灵活性:可以方便地添加、删除或重新排列布局中的控件,而不会影响到其它部分的布局。
- 自适应调整:当窗口大小改变时,网格布局会自动调整控件的位置和大小,以适应新的窗口尺寸。
3.示例

4. Horizontal spacer和vertical spacer
- 用于在布局中创建空白空间或者弹性空间:QSpacerItem 和 QSizePolicy::Expanding。它们可以帮助实现在布局中控制部件之间的间距或者使部件在布局中扩展以填充空白区域。

三、菜单
- Qt中的菜单栏(QMenuBar)是一个用于在应用程序中创建和管理菜单的控件。它通常位于窗口的顶部,并包含多个菜单项。每个菜单项可以包含多个子项(动作),这些动作可以触发特定的功能或操作。菜单栏在用户界面设计中起着重要作用,提供了对应用程序功能的结构化访问。
- 使用ui设计器时,选择QMainWindows,会在ui界面多一行菜单栏

- setContextMenuPolicy()
- setContextMenuPolicy() 函数是 Qt 中用于设置控件上下文菜单策略的方法。它决定了当用户在控件上执行右键单击时如何处理和显示上下文菜单。
- 括号内参数有
Qt::NoContextMenu / Qt::preventContextMenu / Qt::CustomContextMenu/Qt::DefaultContextMenu,分别代表:没有右击菜单,阻止右击菜单产生,允许右击事件产生,默认值 - 如果设置为 Qt::DefaultContextMenu,则会显示控件默认的上下文菜单,这通常由 Qt 框架根据控件类型和平台决定。
- 允许右击菜单产生,将会发出
customContextMenuRequested(const QPoint&)信号,传递的参数是右键单击事件发生时的鼠标指针位置,属于高级用法。
- QMenu *pMenu;,指向 QMenu 类型的指针变量,用于管理菜单,在Widget.h中创建,可以在定义的槽函数里面使用,但要注意的是在构造函数里面实例化时候是
pMeu = new QMenu;,而不是QMenu *pMenu = new QMenu;,它属于没有在Widget.h中定义,在构造函数中实例化的方法。一定要注意,因为这样写错了,代码不会报错,但是会运行时出错。 - ACtion
- QAction 是 Qt 中用于表示用户界面中的动作或命令的类。它通常用于菜单、工具栏、快捷键等场景,用来定义用户可以执行的操作。
QAction *action = new QAction("动作名称", this); - 加入到菜单里面使用函数addAction;
pMenu->addAction(pCut); - 它的信号为triggered()
pActDel = new QAction("Del");connect(pActDel,SIGNAL(triggered()),this,SLOT( pActDelTriggeredSlotFun() ));
- QCursor::pos();,它的返回值为当前鼠标光标的全局位置坐标。通过调用 move() 函数将 pMenu 移动到鼠标光标的位置。
- move() 函数用于移动窗口或控件到指定的坐标位置。
pMenu->move(QCursor::pos());//移动位置
pMenu->show();//使菜单显示出来
这两行代码的作用是确保在哪里右击,就在哪里显示右击菜单栏
- 示例代码
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox> // 包含 QMessageBox 类头文件
#include <QDebug> // 包含 qDebug() 函数的头文件Widget::Widget(QWidget *parent): QWidget(parent), // 调用父类 QWidget 的构造函数ui(new Ui::Widget) // 初始化界面类对象 ui
{ui->setupUi(this); // 设置界面布局// 创建主菜单和子菜单pMenu1 = new QMenu("菜单11"); // 创建名称为 "菜单11" 的子菜单对象pMenu = new QMenu("菜单"); // 创建名称为 "菜单" 的主菜单对象// 创建动作(菜单项)pCut = new QAction("剪切"); // 创建名称为 "剪切" 的动作对象pCopy = new QAction("复制"); // 创建名称为 "复制" 的动作对象pPoaste = new QAction("粘贴"); // 创建名称为 "粘贴" 的动作对象pDel = new QAction("删除"); // 创建名称为 "删除" 的动作对象pIns = new QAction("子菜单"); // 创建名称为 "子菜单" 的动作对象// 设置标签控件的上下文菜单策略为自定义上下文菜单ui->label->setContextMenuPolicy(Qt::CustomContextMenu);// 连接标签控件的自定义上下文菜单请求信号到槽函数connect(ui->label, SIGNAL(customContextMenuRequested(const QPoint&)),this, SLOT(labelCustomContextMenuRequestedSlotFun(const QPoint&)));// 将子菜单添加到主菜单中pMenu->addMenu(pMenu1);// 在子菜单中添加动作(菜单项)pMenu1->addAction(pIns);// 在主菜单中添加动作(菜单项)pMenu->addAction(pCut);pMenu->addAction(pCopy);pMenu->addAction(pPoaste);pMenu->addAction(pDel);// 连接删除动作的触发信号到槽函数connect(pDel, SIGNAL(triggered()), this, SLOT(pDelTriggeredSlotFun()));
}Widget::~Widget()
{delete ui; // 释放界面类对象内存
}// 处理标签控件的自定义上下文菜单请求槽函数
void Widget::labelCustomContextMenuRequestedSlotFun(const QPoint &p)
{qDebug() << __func__ << p; // 打印函数名和鼠标右击位置坐标// 将主菜单移动到鼠标光标的位置并显示pMenu->move(QCursor::pos());pMenu->show();
}// 处理删除动作的槽函数
void Widget::pDelTriggeredSlotFun()
{// 显示删除确认对话框,并等待用户响应QMessageBox::StandardButton btn = QMessageBox::question(this,"删除","你确认要删除对象吗?",QMessageBox::Yes | QMessageBox::Cancel,QMessageBox::Cancel);if (btn == QMessageBox::Yes) {// 如果用户点击了确认按钮,执行删除操作qDebug() << "执行删除操作";} else {// 如果用户点击了取消按钮,输出取消删除操作信息qDebug() << "取消删除操作";}
}

相关文章:
QT--控件篇四
一、对话框 在软件开发中,对话框(Dialog)是一种常见的用户界面元素,用于与用户进行交互和获取信息。它通常以模态或非模态的形式出现,模态对话框会阻止用户与应用程序的其他部分交互,直到对话框关闭为止&a…...
opencv—常用函数学习_“干货“_2
目录 五、矩阵计算函数 归一化矩阵 (normalize) 转置矩阵 (transpose) 求矩阵的逆 (invert) 翻转矩阵 (flip) 旋转矩阵 (rotate) 求矩阵的行列式 (determinant) 求矩阵的迹 (trace) 求矩阵的特征值和特征向量 (eigen) 六、代数运算 矩阵加法 (add) 矩阵减法 (subtra…...
解析CSS与JavaScript的使用方法及ECMAScript语法规则
一、CSS的三种使用方式 CSS(层叠样式表)用于定义网页的样式和布局。以下是CSS的三种使用方式: 1. 内联样式 内联样式是最直接的应用方式,它通过HTML标签的style属性来定义。 代码示例: <h1 style"color: …...
从零开始学习嵌入式----结构体struct和union习题回顾
一、通过结构体和自定义函数实现成绩从大到小的排序,要求在主函数内定义结构体数组。 #include <stdio.h> //定义一个结构体类型 typedef struct Student {int age;char name[32];float score; } STU; //定义一个函数实现成绩从小到大的排序 void fun(STU *p…...
建筑产业网元宇宙的探索与实践
在数字化浪潮的推动下,建筑产业网正迈入一个全新的元宇宙时代。这一变革不仅为建筑设计、施工与管理带来了革新,也为整个行业注入了新的活力与创造力。本文将深入探讨建筑产业网元宇宙的特点、应用及未来趋势,带您领略其在建筑行业中的独特魅…...
比较RMI、HTTP+JSON/XML、gRPC
RMI(Remote Method Invocation,远程方法调用)、HTTPJSON/XML、gRPC是三种不同的技术或协议,它们各自在远程通信、数据传输和服务交互方面有不同的特点和应用场景。以下是对这三种技术的详细比较: 1. RMI(R…...
软件工程-可行性分析
一、可行性分析 可行性分析/研究目的是用最小的代价在尽可能短的时间内确定问题是否得到解决。 FVPV(1r)^n* FV:未来价值 PV:现值(当前货币金额) r:利率 n:时间期限 纯收入累计的现…...
iOS ------ 消息传递和消息转发
一,消息传递 在OC中,传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数,在编译器就决定了运行时所要调用的函数。在OC中,如果向某对象传递消息,就会使用动态绑定机制来决定需要调用那个方法。调…...
计算机视觉之Vision Transformer图像分类
Vision Transformer(ViT)简介 自注意结构模型的发展,特别是Transformer模型的出现,极大推动了自然语言处理模型的发展。Transformers的计算效率和可扩展性使其能够训练具有超过100B参数的规模空前的模型。ViT是自然语言处理和计算…...
【深度学习】BeautyGAN: 美妆,化妆,人脸美妆
https://www.sysu-hcp.net/userfiles/files/2021/03/01/3327b564380f20c9.pdf 【深度学习】BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversaria…...
RocketMQ~架构与工作流程了解
简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在 2016 年底贡献给 Apache,成为了 Apache 的一个顶级项目。 在阿里内部,RocketMQ 很好地服务了集…...
学习Python的IDE功能--(一)入门导览
项目视图是主要工具窗口之一。它包含项目目录、SDK 特定的外部库和临时文件。点击带条纹的按钮可以预览演示项目。您也可以按Alt1打开。点击以打开项目视图,展开项目目录以查看项目文件。双击以打开welcome.py。 切换到"学习"工具窗口继续学习本课次。…...
gdb调试多线程程序
目录 1、pstack查看各个线程的调用堆栈2、gdb调试多线程2.1 查看线程信息2.2 切换线程2.3 进入线程某层具体的调用堆栈2.4 调度器锁2.4.1 查看调度器锁模式 3、实战3.1 调试多线程崩溃3.2 调试多线程死锁 1、pstack查看各个线程的调用堆栈 命令: 1、查看进程id ps …...
实战GraphRAG(一):初步体验GraphRAG及其与RAG的对比
🌟实战GraphRAG(一):初步体验GraphRAG及其与RAG的对比 文章目录 🌟实战GraphRAG(一):初步体验GraphRAG及其与RAG的对比📖引言🔍一、GraphRAG与RAG的区别🚀二、GraphRAG使用示例1.安装GraphRAG2.运行索引器3.配置4.自动优化提示词5.运行索引管道6.使用查询引擎7…...
37、PHP 实现一个链表中包含环,请找出该链表的环的入口结点
题目: 题目描述 PHP 实现一个链表中包含环,请找出该链表的环的入口结点。 描述: 一个链表中包含环,请找出该链表的环的入口结点。 <?php /*class ListNode{var $val;var $next NULL;function __construct($x){$this->v…...
LIMS系统对实验室管理有哪些帮助?
LIMS系统对实验室管理提供了多方面的帮助,具体体现在以下几个方面: 1. 流程标准化与自动化 LIMS系统通过定义标准化的工作流程,如样品接收、测试分配、数据录入、结果审核和报告生成等,实现了实验室工作流程的自动化。这减少了人…...
在GPU上运行PyTorch
文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…...
【内网穿透】打洞笔记
文章目录 前言原理阐述公网sshfrp转发服务 实现前提第一步:第二步第三步第四步 补充第五步(希望隧道一直开着)sftp传数据(嫌云服务器上的网太慢) 前言 租了一个云服务器,想用vscode的ssh远程连接ÿ…...
第59期|GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…...
算法2--贪心算法
1.老鼠和猫的交易 小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。 仓库有N个房间; 第i个房间有 J[i] 磅的五香豆,并且需要用 F[i] 磅的猫粮去交换; 老鼠不必交换该房间所有的五…...
告别模糊:手把手教你用LAMBDA算法搞定GNSS整周模糊度(附Python代码示例)
告别模糊:手把手教你用LAMBDA算法搞定GNSS整周模糊度(附Python代码示例) 当你在开发高精度定位系统时,是否曾被整周模糊度问题困扰?这个看似简单的整数解问题,实际上影响着厘米级定位的成败。作为GNSS领域的…...
C语言基础:LiuJuan20260223Zimage嵌入式开发入门
C语言基础:LiuJuan20260223Zimage嵌入式开发入门 1. 学习目标与前置知识 如果你是刚开始接触嵌入式开发的C语言初学者,这篇文章就是为你准备的。我们将从最基础的C语言语法开始,一步步带你了解如何在嵌入式环境中使用C语言进行开发。不需要…...
从‘过拟合’到‘稳如狗’:聊聊EEG情感识别中数据增强与噪声注入的那些坑
从‘过拟合’到‘稳如狗’:EEG情感识别中的数据增强与噪声注入实战指南 当你第一次看到训练集准确率突破95%的EEG情感识别模型,在实际测试中面对新用户时表现却像从未训练过一样糟糕,这种落差感想必每个从业者都深有体会。个体差异就像一把双…...
亚洲美女-造相Z-Turbo算力适配实践:24G显存下支持batch_size=2高清图并行生成
亚洲美女-造相Z-Turbo算力适配实践:24G显存下支持batch_size2高清图并行生成 1. 快速了解亚洲美女-造相Z-Turbo 亚洲美女-造相Z-Turbo是一个专门针对亚洲女性形象生成优化的文生图模型,基于Z-Image-Turbo的LoRA版本进行深度定制。这个模型最大的特点是…...
从MATLAB/Python代码实现反推Newmark-β法:理解线性加速度假设如何变成迭代算法
从代码实现反推Newmark-β法:线性加速度假设的工程实践指南 在结构动力学分析中,地震响应、风荷载等时程分析问题常需要求解二阶微分方程。Newmark-β法作为经典数值解法,通过线性加速度假设将连续问题离散化。但教科书往往止步于公式推导&am…...
WarcraftHelper:魔兽争霸III现代化增强工具全面指南
WarcraftHelper:魔兽争霸III现代化增强工具全面指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 如何让经典游戏适配现代硬件环境&…...
C++vector迭代器失效全解析
深入讲解 C vector 的迭代器失效在 C 中,std::vector 是一个动态数组,它支持随机访问和高效的元素操作。迭代器是 C 中用于遍历容器元素的重要工具,类似于指针。但使用 vector 时,某些操作可能导致迭代器失效(iterator…...
5分钟掌握SQLite在线查看器:浏览器中的数据库管理革命
5分钟掌握SQLite在线查看器:浏览器中的数据库管理革命 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 在数据驱动的时代,SQLite数据库无处不在——从移动应用到嵌入式设备&…...
从 Python 和 Node.js 的流行看 Java 的真实位置
很多 Java 程序员都会有一个感觉:Python 很火,Node.js 也很火,Java 是不是没落了? 先说结论:Java 没有没落,只是位置变了。一、为什么 Python 和 Node.js 看起来更火 1. Python 火,是因为 AI 太…...
2026年4月怎么搭建OpenClaw?腾讯云保姆级5分钟安装及百炼APIKey配置方法
2026年4月怎么搭建OpenClaw?腾讯云保姆级5分钟安装及百炼APIKey配置方法。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业群…...
