【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的右侧存在着这么一个状态栏

并且可以在这里直接进行编辑。
当然,这里的属性不需要大家每个都去了解,只需要认识其中一些主要的数据即可~
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);}
}

2.geometry属性
英文翻译为几何
其实你可用把它当作4种属性的统称。
这4个属性分别为:
- x坐标
- y坐标
- width宽度
- height高度
其中x,y坐标为左上角的坐标。
画图大概是这个样子:

| 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;
}

这里我们定义了一个临时变量tmp,当构造函数结束,这个临时变量也就会被销毁,但是我们可以看到上图的按钮位置是被成功设置的,也就表示了,该函数使用的就是值传递的方式~
注意:move函数只是修改位置,但是setGeometry既可以修改位置同时还可以修改尺寸
2.1 改变控件位置
下面我们来利用setGeometry来创建一个控制控件移动的程序,该程序会有5个控件其中4个为控制剩余控件上下左右移动的按钮控件。

大概界面就是如此,下面开始填写槽函数
#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()
{//...
}
当我们运行后会发现和我们所想的有所差异

当代码实际执行后,是在调整左上角位置,早上角位置改变的同时,高度和宽度ue发生了改变。
为什么控件的尺寸也会发生改变呢?
QRect 内部需要保持 right() 和 bottom() 不变,所以 Qt 调整 width 或 height 来补偿变化。
那么如何才能实现平移的效果?保存尺寸尺寸不变,整个按钮的位置不变。
什么?使用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());
}

2.2 女神表白程序
相信大家肯定见过这样一种程序

当我们点击不同意时,不同意的按钮就会随机移动到其他位置,这种程序就可以用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());
}

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

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

下面是验证,不过验证的时候还要注意下写法,我会先写一个错误案例,然后在写一个正确案例。
失败案例:
#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;
}

为什么会失败呢?
这是因为当前代码是放在构造函数中,刚刚被创建出来,此时这个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;
}

3. windowsTitle属性
当前windowsTitle属性,是从属于QWidget的,QWidget是一个广泛的概念
windowTitle属性只能针对顶层窗口这样的QWidget才有效~
| API | 说明 |
|---|---|
| windowTitle | 获取到控件的窗口标题 |
| setWindowtitle(const QString&title) | 设置控件的窗口标题 |
![]() |
4. windowIcon属性
Icon的中文翻译为图标
如果我们不主动设置,那么它的图标就是这样的:

| 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;
}

在实际的开发过程中,我们一般不会在代码中通过绝对路径引入图片,因为我们无法保证程序发布后,用户的电脑上也有相同的路径。
如果使用相对路径,则需要确保代码中的相对路径写法和图片实际所在的路径匹配。
对应Qt程序来说,当前工作目录可能是变化的,比如通过Qt Creator运行的程序,当前工作目录是项目的构建目录,直接双击exe运行,工作目录则是exe所在的目录。
所谓构建目录,是和Qt项目并列的,专门用来放在生成的临时文件和最终exe的目录。
当然我们还有更简单的Qrc机制来帮我们自动完成工作,更方便管理项目依赖的静态资源。
关于qrc机制下篇文章讲解~
5. 总结
本文我们学习了QWidget的主要属性
在Qt中,使用QWidget类表示控件,像按钮、视图、输入框等等具体的控件类,都是继承自QWidget
可以说,QWIdget中就包含了Qt整个控件体系中,通用的部分。
在Qt Designer中,随便拖一个控件出来,选中该控件,即可在右下角看到相应的属性。

往期文章:
【Qt】初始项目代码解释-CSDN博客
【Qt】HelloWorld程序-CSDN博客
【Qt-信号与槽】connect函数的用法-CSDN博客
【Qt】自定义信号和槽函数-CSDN博客
【Qt】带参数的信号和槽函数-CSDN博客
相关文章:
【Qt】QWidget属性介绍
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏: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项目,直接写一个vite的插件,通过这个插件可以动态注入环境变量,然后当打包的时候,自动注入这个时间到环境变量中,然后在项目中App.vue中或者Main.tsx中打印出来,这就知道是什么时候编译的项目了…...
基于大模型的上睑下垂手术全流程预测与方案优化研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 研究方法与创新点 二、上睑下垂相关理论基础 2.1 上睑下垂的定义与分类 2.2 发病机制与影响 2.3 传统治疗方法概述 三、大模型技术原理与应用 3.1 大模型概述 3.2 在医疗领域的应用现状 3.3 用于上睑下垂预测的…...
Cadence学习笔记3
设置 PCB 层叠 初始我们有一个两层板,如果需要添加层叠怎么办? 点击进入层叠设置 首先右击 TOP 层下面的空白,然后鼠标右键进行 add layer 然后选择 Plane(一般层就是这个) 就好 然后 add就行 设置光标显示形式 在 setup ->…...
Linux系统下如何部署svmspro平台
上传svmspro服务 rz回车后选择svmspro.zip上传如果提示rz命令未找到,请先运行 yum install -y lrzsz 安装将svmspro.zip解压出来,并拷贝到/usr/目录下,命令如下: 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漏洞,对其进行升级
我们付出一些成本,时间的或者其他,最终总能收获一些什么。 升级背景: 近日,新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) ,其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…...
工程实践:如何使用SU17无人机来实现室内巡检任务
阿木实验室最近发布了科研开发者版本的无人机SU17,该无人机上集成了四目视觉,三维激光雷达,云台吊舱,高算力的机载计算机,是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…...
时序优化学习笔记
0.代码对应的底层调用 if-else的判定条件需要LUT实现,累加器的进位需要靠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眼镜的参考步骤
纳米压印技术(Nanoimprint Lithography, NIL)在 AR(增强现实)眼镜中的应用主要集中在光学元件的制造上,例如衍射光栅、波导和微透镜阵列等。以下是使用纳米压印技术制备 AR 眼镜光学元件的详细步骤: 1. 设…...
FX-std::list
std::list 是 C 标准库中的一个双向链表容器,定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素,但不支持随机访问。以下是 std::list 的基本用法和一些常见操作: 1. 包含头文件 #include <list> 2. 定义和初始化…...
【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)
我用夸克网盘分享了「DeepSeek完整资料合集」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/621259e4af15 近日,清华大学发布了《…...
HCIA-ACL实验
前提条件:实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段,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 功能,为什么还需要 web 框架?作为 web 框架,Gee 框架完成了哪些功能?如何用 Gee 来构建 web 项目? Gee 项目回顾 上个月月末我按照 Geektutu 的教程&…...
DeepLabv3+改进10:在主干网络中添加LSKBlock|动态调整其大型空间感受野,助力小目标识别
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…...
词向量:优维大模型语义理解的深度引擎
★ 放闸溯源 优维大模型「骨架级」技术干货 第二篇 ⇓ 词向量是Transformer突破传统NLP技术瓶颈的核心,它通过稠密向量空间映射,将离散符号转化为连续语义表示。优维大模型基于词向量技术,构建了运维领域的“语义地图”,实现从…...
编译原理:语法分析程序【附源码和超详细注释】
目录 一 、实验目的 二 、实验内容及步骤 三、程序分析 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 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域,经常需要将树莓派作为视频流服务器,通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库ÿ…...
fs的proxy_media模式失效
概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中,某些场景只需要对rtp媒体做透传,又不需要任何处理。 在fs1.6的版本中,我们可以使用proxy_media来代理媒体的转发,媒体的协商由AB路端对端处理ÿ…...
Linux 命名管道
文章目录 🚀 深入理解命名管道(FIFO)及其C实现一、命名管道核心特性1.1 🧩 基本概念 二、💻 代码实现解析2.1 📁 公共头文件(common.hpp)2.2 🖥️ 服务器端(s…...
HDU 学数数导致的
题目解析 首先,数对是有序的,<1,2>和<2,1>被视为不同的两组数字。 其次,数对<p,q>的p和q可以相等。 子序列为 p 0 p q,观察到,中间要出现一个0。那么,我们只需要找到第一个 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轴:3轴加速度,3轴角速度 9轴:3轴加速度,3轴角速度和3轴磁场强度 10轴:3轴加速度,3轴角速度和3轴磁场强度和一个气压强度 加速度计具有静态稳定性,不具有动态稳定性 欧拉角&…...
c++ union使用笔记
c union使用笔记 一、联合的简单使用二、联合与枚举结合三、匿名联合(Anonymous Union)四、关键注意事项五、C17 扩展:std::variant C联合(union)是一种特殊的数据结构,允许在相同内存位置存储不同的数据类…...
Android中的Wifi框架系列
Android wifi框架图 Android WIFI系统引入了wpa_supplicant,它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。 Android WIFI主要分为六大层,分别是WiFi Settings层,Wifi Framework层,Wifi JNI 层ÿ…...
react(一):特点-基本使用-JSX语法
初识React React是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发和维护。 官网文档:React 官方中文文档 特点 1.声明式编程 2.组件化开发 3.多平台适配 开发依赖 开发React必须依赖三个库: 1.react:包含react所必…...

