当前位置: 首页 > article >正文

【Qt】QWidget属性介绍

🏠个人主页:Yui_
🍑操作环境:Qt Creator
🚀所属专栏:Qt

在这里插入图片描述

文章目录

  • 前言
  • 1. enabled属性
  • 2.geometry属性
    • 2.1 改变控件位置
    • 2.2 女神表白程序
    • 2.3 知识补充——window frame
  • 3. windowsTitle属性
  • 4. windowIcon属性
  • 5. 总结

前言

Qt中已经给我们提供了很多的控件,所以学习Qt就必须要学习和了解这些控件,学会如何使用这些控件。
编程讲究站在巨人的肩膀上
一个图形化界面的内容不需要我们从0开始实现,Qt中已经提供看很多的内容控件(按钮、文本框、单选按钮,下拉框等等),我们直接使用即可。
为了更好的使用这些控件,我们就要学习QWidget,这是因为Qt中的各种控件都是继承自QWidget
这也就表明了,QWidget的属性在它的子类中是可以使用的~
我们点击fromfile中的ui文件,就可以看在QtCteator的右侧存在着这么一个状态栏
image.png
并且可以在这里直接进行编辑。
当然,这里的属性不需要大家每个都去了解,只需要认识其中一些主要的数据即可~

1. enabled属性

API说明
IsEnabled()获取到控件的可用状态
setEnabled()设置控件是否可用,true表示可用,false表示禁用

所谓禁用是指该控件不能接受任何用户输入事件,并且在外观上往往是灰色的。
如果一个widget被禁用,那么它的子元素也会被禁用

下面写个程序看看吧,程序的功能是有两个按钮,按钮2可用控制按钮1是否禁用,如果按钮1没有被禁用,那么按钮2就会让它禁用,反之启用~

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_2_clicked()
{if(ui->pushButton->isEnabled() == false){ui->pushButton->setEnabled(true);}else{ui->pushButton->setEnabled(false);}
}

qwidget_!.gif

2.geometry属性

英文翻译为几何
其实你可用把它当作4种属性的统称。
这4个属性分别为:

  1. x坐标
  2. y坐标
  3. width宽度
  4. height高度
    其中x,y坐标为左上角的坐标。
    画图大概是这个样子:
    image.png
API说明
geometry()获取到控件的位置和尺寸,返回结果是一个QRect,包含了(x,y,widget,height)其中的x,y是左上角的坐标
setGeometry(QRect)设置控件的位置和尺寸,可以直接设置一个QRect,也可以分为4个属性单独设置。
setGeometry(int x,int y,int widget,int height)设置控件的位置和尺寸,可以直接设置一个QRect,也可以分为4个属性单独设置。
Qt中会针对一些几何上的概念进行封装,QPoint表示一个点,QRect表示一个矩形,这些属于小对象,里面的属性非常少,占用空间也小。C++在使用这些对象时,通常就会按照值传递的方式来传递参数了。
所以这些参数在定义时,我们就可以直接在栈上定义,无需在堆上开辟空间。
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QRect tmp(10,10,100,100);ui->pushButton->setGeometry(tmp);
}Widget::~Widget()
{delete ui;
}

image.png

这里我们定义了一个临时变量tmp,当构造函数结束,这个临时变量也就会被销毁,但是我们可以看到上图的按钮位置是被成功设置的,也就表示了,该函数使用的就是值传递的方式~
注意:move函数只是修改位置,但是setGeometry既可以修改位置同时还可以修改尺寸

2.1 改变控件位置

下面我们来利用setGeometry来创建一个控制控件移动的程序,该程序会有5个控件其中4个为控制剩余控件上下左右移动的按钮控件。
image.png
大概界面就是如此,下面开始填写槽函数

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸rect.setY(rect.y()-5);ui->pushButton->setGeometry(rect);
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸rect.setX(rect.x()-5);ui->pushButton->setGeometry(rect);
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸rect.setY(rect.y()+5);ui->pushButton->setGeometry(rect);
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸rect.setX(rect.x()+5);ui->pushButton->setGeometry(rect);
}void Widget::on_pushButton_clicked()
{//...
}

当我们运行后会发现和我们所想的有所差异
qwidget_2.gif
当代码实际执行后,是在调整左上角位置,早上角位置改变的同时,高度和宽度ue发生了改变。
为什么控件的尺寸也会发生改变呢?
QRect 内部需要保持 right()bottom() 不变,所以 Qt 调整 widthheight 来补偿变化。
那么如何才能实现平移的效果?保存尺寸尺寸不变,整个按钮的位置不变。
什么?使用move,那不行,我们再将setGeometry函数
我们可以不再修改QRect,而是通过QRect基于setGeometry第二个版本重新设置位置即可。

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸ui->pushButton->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸ui->pushButton->setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸ui->pushButton->setGeometry(rect.x(),rect.y()+5,rect.width(),rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton->geometry();//获取位置及尺寸ui->pushButton->setGeometry(rect.x()+5,rect.y(),rect.width(),rect.height());
}

qwidget_3.gif

2.2 女神表白程序

相信大家肯定见过这样一种程序
image.png

当我们点击不同意时,不同意的按钮就会随机移动到其他位置,这种程序就可以用setGeomert来完成

#include "widget.h"
#include "ui_widget.h"
#include <cstdlib>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{ui->label->setText("(づ ̄3 ̄)づ╭❤~");
}void Widget::on_pushButton_2_clicked()
{QRect rect = ui->pushButton_2->geometry();int x = rand()%500;//记得种下随机种子int y = rand()%500;ui->pushButton_2->setGeometry(x,y,rect.width(),rect.height());
}

qwidget_4.gif
当然这个程序还可以优化,干嘛非要点击才跳转,当鼠标移动到不同意按钮上,直接让不同意按钮发生移动。
当然可别真拿这个程序去向喜欢的妹子表白啊~

2.3 知识补充——window frame

image.png
每次我们运行程序时,窗口之上都会友箭头所指向的内容这是Window frame
那么当我们使用Geometry函数时得到的是包含windowsframe的内容吗?
答案是不包括。
如果widget作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸的坐标时候就有了两种算法,一种是包含Windowframe的另一种就是不包含的。

  • geometry()和setGeometry()都不考虑window frame
  • frameGeometry()和setFrameGeometry()都是考虑window frame的
    image.png

下面是验证,不过验证的时候还要注意下写法,我会先写一个错误案例,然后在写一个正确案例。
失败案例:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QRect rect1 = this->frameGeometry();QRect rect2 = this->geometry();qDebug()<<rect1;qDebug()<<rect2;
}Widget::~Widget()
{delete ui;
}

image.png

为什么会失败呢?
这是因为当前代码是放在构造函数中,刚刚被创建出来,此时这个Widget对象还没有被加入到对象树中去,此时也就不具备window frame因此看不到影响~
成功案例:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QRect rect1 = this->frameGeometry();QRect rect2 = this->geometry();qDebug()<<rect1;qDebug()<<rect2;
}

image.png

3. windowsTitle属性

当前windowsTitle属性,是从属于QWidget的,QWidget是一个广泛的概念
windowTitle属性只能针对顶层窗口这样的QWidget才有效~

API说明
windowTitle获取到控件的窗口标题
setWindowtitle(const QString&title)设置控件的窗口标题
image.png

4. windowIcon属性

Icon的中文翻译为图标
如果我们不主动设置,那么它的图标就是这样的:
image.png

API说明
windowIcon()获取到控件的窗口图标,返回QIcon对象
setWindowIcon(const QIcon& icon)设置控件的窗口图标
该属性同windowTitle,只对顶层widget有效~
准备一张图,就以我的头像为例
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建图标对象QIcon icon("D:/code/qt/Qwidget_6/yui.jpg");//设置图标this->setWindowIcon(icon);this->setWindowTitle("设置图标~");
}Widget::~Widget()
{delete ui;
}

image.png
在实际的开发过程中,我们一般不会在代码中通过绝对路径引入图片,因为我们无法保证程序发布后,用户的电脑上也有相同的路径。
如果使用相对路径,则需要确保代码中的相对路径写法和图片实际所在的路径匹配。
对应Qt程序来说,当前工作目录可能是变化的,比如通过Qt Creator运行的程序,当前工作目录是项目的构建目录,直接双击exe运行,工作目录则是exe所在的目录。
所谓构建目录,是和Qt项目并列的,专门用来放在生成的临时文件和最终exe的目录。
当然我们还有更简单的Qrc机制来帮我们自动完成工作,更方便管理项目依赖的静态资源。
关于qrc机制下篇文章讲解~

5. 总结

本文我们学习了QWidget的主要属性
在Qt中,使用QWidget类表示控件,像按钮、视图、输入框等等具体的控件类,都是继承自QWidget
可以说,QWIdget中就包含了Qt整个控件体系中,通用的部分。
在Qt Designer中,随便拖一个控件出来,选中该控件,即可在右下角看到相应的属性。
image.png


往期文章:
【Qt】初始项目代码解释-CSDN博客
【Qt】HelloWorld程序-CSDN博客
【Qt-信号与槽】connect函数的用法-CSDN博客
【Qt】自定义信号和槽函数-CSDN博客
【Qt】带参数的信号和槽函数-CSDN博客

相关文章:

【Qt】QWidget属性介绍

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…...

『Rust』Rust运行环境搭建

文章目录 rust编译工具rustupVisual Studio VS Code测试编译手动编译VSCode编译配置 参考完 rust编译工具rustup https://www.rust-lang.org/zh-CN/tools/install 换源 RUSTUP_DIST_SERVER https://rsproxy.cn RUSTUP_UPDATE_ROOT https://rsproxy.cn修改rustup和cargo的安…...

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目&#xff0c;直接写一个vite的插件&#xff0c;通过这个插件可以动态注入环境变量&#xff0c;然后当打包的时候&#xff0c;自动注入这个时间到环境变量中&#xff0c;然后在项目中App.vue中或者Main.tsx中打印出来&#xff0c;这就知道是什么时候编译的项目了…...

基于大模型的上睑下垂手术全流程预测与方案优化研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 研究方法与创新点 二、上睑下垂相关理论基础 2.1 上睑下垂的定义与分类 2.2 发病机制与影响 2.3 传统治疗方法概述 三、大模型技术原理与应用 3.1 大模型概述 3.2 在医疗领域的应用现状 3.3 用于上睑下垂预测的…...

Cadence学习笔记3

设置 PCB 层叠 初始我们有一个两层板&#xff0c;如果需要添加层叠怎么办&#xff1f; 点击进入层叠设置 首先右击 TOP 层下面的空白&#xff0c;然后鼠标右键进行 add layer 然后选择 Plane(一般层就是这个&#xff09; 就好 然后 add就行 设置光标显示形式 在 setup ->…...

Linux系统下如何部署svmspro平台

上传svmspro服务 rz回车后选择svmspro.zip上传如果提示rz命令未找到&#xff0c;请先运行 yum install -y lrzsz 安装将svmspro.zip解压出来&#xff0c;并拷贝到/usr/目录下&#xff0c;命令如下&#xff1a; unzip svmspro.zip//解压程序包cp svmspro /usr/ -r//将svmspro文件…...

vue3:八、登录界面实现-忘记密码

一、页面效果 二、实现 1、视图层 <el-form-item class"flex flex-between"><el-checkbox label"记住密码" v-model"remember" /> </el-form-item> 参考 Checkbox 多选框 | Element Plus 2、逻辑层 首先设置记住密码的变…...

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …...

Apache Tomcat漏洞,对其进行升级

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 升级背景&#xff1a; 近日&#xff0c;新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) &#xff0c;其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…...

工程实践:如何使用SU17无人机来实现室内巡检任务

阿木实验室最近发布了科研开发者版本的无人机SU17&#xff0c;该无人机上集成了四目视觉&#xff0c;三维激光雷达&#xff0c;云台吊舱&#xff0c;高算力的机载计算机&#xff0c;是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…...

时序优化学习笔记

0.代码对应的底层调用 if-else的判定条件需要LUT实现&#xff0c;累加器的进位需要靠CARRY实现。 1.逻辑级数的概念 简单来讲就是组合逻辑串联的个数 逻辑级数查询命令 report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analy…...

OSPF-3 1类LSA Router LSA

前面两期我们介绍了OSPF的邻居与邻接建立的关系及失败因素和原因 这章我们来说说OSPF是如何通过不同的LSA去描述拓扑的信息以及路由信息 一、概述 OSPF通过不同的LSA来构成LSDB链路状态数据库,再通过SPF算法来计算出最优的最短路径 二、LSA的分类 类型名称描述传播范围1类…...

纳米压印技术制备AR眼镜的参考步骤

纳米压印技术&#xff08;Nanoimprint Lithography, NIL&#xff09;在 AR&#xff08;增强现实&#xff09;眼镜中的应用主要集中在光学元件的制造上&#xff0c;例如衍射光栅、波导和微透镜阵列等。以下是使用纳米压印技术制备 AR 眼镜光学元件的详细步骤&#xff1a; 1. 设…...

FX-std::list

std::list 是 C 标准库中的一个双向链表容器&#xff0c;定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素&#xff0c;但不支持随机访问。以下是 std::list 的基本用法和一些常见操作&#xff1a; 1. 包含头文件 #include <list> 2. 定义和初始化…...

【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)

我用夸克网盘分享了「DeepSeek完整资料合集」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/621259e4af15 近日&#xff0c;清华大学发布了《…...

HCIA-ACL实验

前提条件&#xff1a;实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段&#xff0c;PC4和客户端能正常访问服务器 ②AR2配置 acl 2000 rule deny source 192.168.1.1 0 匹配流量 int g 0/0/0 traffic-filter inbound acl 2000 接口调用…...

【Gee】项目总结:模仿 GIN 实现简单的 Golang Web 框架

文章目录 Gee 项目回顾Gee 项目总结Golang 已经具备基础的 web 功能&#xff0c;为什么还需要 web 框架&#xff1f;作为 web 框架&#xff0c;Gee 框架完成了哪些功能&#xff1f;如何用 Gee 来构建 web 项目&#xff1f; Gee 项目回顾 上个月月末我按照 Geektutu 的教程&…...

DeepLabv3+改进10:在主干网络中添加LSKBlock|动态调整其大型空间感受野,助力小目标识别

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…...

词向量:优维大模型语义理解的深度引擎

★ 放闸溯源 优维大模型「骨架级」技术干货 第二篇 ⇓ 词向量是Transformer突破传统NLP技术瓶颈的核心&#xff0c;它通过稠密向量空间映射&#xff0c;将离散符号转化为连续语义表示。优维大模型基于词向量技术&#xff0c;构建了运维领域的“语义地图”&#xff0c;实现从…...

编译原理:语法分析程序【附源码和超详细注释】

目录 一 、实验目的 二 、实验内容及步骤 三、程序分析 1. 需求分析 2. 功能分析 1. LL(1)文法功能分析 2. 算符优先文法功能分析 3. 信创分析-主要针对能力提升中国产操作系统上开发内容。 四、源代码 1. LL(1)文法代码 2. 算符优先文法 五、测试结果 1. LL(1)文…...

Go vs Rust vs C++ vs Python vs Java:谁主后端沉浮

一、核心性能对比(基于TechEmpower基准测试) 语言单核QPS延迟(ms)内存消耗适用场景Rust650,0000.1245MB高频交易/区块链C++720,0000.0932MB游戏服务器/实时渲染Go230,0000.45110MB微服务/API网关Java180,0001.2450MB企业ERP/银行系统Python12,0008.5220MBAI接口/快速原型技术…...

使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示

使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域&#xff0c;经常需要将树莓派作为视频流服务器&#xff0c;通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库&#xff…...

fs的proxy_media模式失效

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中&#xff0c;某些场景只需要对rtp媒体做透传&#xff0c;又不需要任何处理。 在fs1.6的版本中&#xff0c;我们可以使用proxy_media来代理媒体的转发&#xff0c;媒体的协商由AB路端对端处理&#xff…...

Linux 命名管道

文章目录 &#x1f680; 深入理解命名管道&#xff08;FIFO&#xff09;及其C实现一、命名管道核心特性1.1 &#x1f9e9; 基本概念 二、&#x1f4bb; 代码实现解析2.1 &#x1f4c1; 公共头文件&#xff08;common.hpp&#xff09;2.2 &#x1f5a5;️ 服务器端&#xff08;s…...

HDU 学数数导致的

题目解析 首先&#xff0c;数对是有序的&#xff0c;<1,2>和<2,1>被视为不同的两组数字。 其次&#xff0c;数对<p,q>的p和q可以相等。 子序列为 p 0 p q&#xff0c;观察到&#xff0c;中间要出现一个0。那么&#xff0c;我们只需要找到第一个 p 满足与前…...

pjsip pjsua_media_config 结构体说明

clock_rate 描述:设置会议桥(conference bridge)的时钟频率(采样率)。 默认值:0(使用默认值 PJSUA_DEFAULT_CLOCK_RATE,通常为 16kHz)。 作用:影响音频的采样率,常见值有 8000(8kHz)、16000(16kHz)、48000(48kHz)等。snd_clock_rate 描述:设置音频设备的时钟…...

软件/硬件I2C读写MPU6050

MPU6050简介 6轴&#xff1a;3轴加速度&#xff0c;3轴角速度 9轴&#xff1a;3轴加速度&#xff0c;3轴角速度和3轴磁场强度 10轴&#xff1a;3轴加速度&#xff0c;3轴角速度和3轴磁场强度和一个气压强度 加速度计具有静态稳定性&#xff0c;不具有动态稳定性 欧拉角&…...

c++ union使用笔记

c union使用笔记 一、联合的简单使用二、联合与枚举结合三、匿名联合&#xff08;Anonymous Union&#xff09;四、关键注意事项五、C17 扩展&#xff1a;std::variant C联合&#xff08;union&#xff09;是一种特殊的数据结构&#xff0c;允许在相同内存位置存储不同的数据类…...

Android中的Wifi框架系列

Android wifi框架图 Android WIFI系统引入了wpa_supplicant&#xff0c;它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。 Android WIFI主要分为六大层&#xff0c;分别是WiFi Settings层&#xff0c;Wifi Framework层&#xff0c;Wifi JNI 层&#xff…...

react(一):特点-基本使用-JSX语法

初识React React是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发和维护。 官网文档&#xff1a;React 官方中文文档 特点 1.声明式编程 2.组件化开发 3.多平台适配 开发依赖 开发React必须依赖三个库&#xff1a; 1.react&#xff1a;包含react所必…...