【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念

界面上各种元素、各种部分的统称(如按钮、输入框、下拉框、单选复选框...)

Qt作为GUI开发框架,内置了各种的常用控件,并支持自定义控件。

二、控件体系发展

1.没有完全的控件,需要使用绘图API手动绘制界面。

2.引入控件的概念,只有一些常用的控件,数量有限(按钮,输⼊框,单选框,复选框等),如html的原生控件。

3.拥有较为完整的控件体系,基本可以覆盖GUI开发的大部分场景。

例如早期的MFC,VB,C++Builder,Qt,Delphi,后来的AndroidSDK,JavaFX,前端的各种UI库等。

三、QWidget类

Qt的各种控件,均继承自QWidget,了解QWidget的属性和方法就了解了Qt控件的通用部分。

QtCreator代码中,选中控件类型,按F1查看文档。

核心属性

1.enabled

  • 作用:表示控件是否可使用,true表示可用,false表示禁用。

禁用状态:不接收用户的输入事件,外观上往往是灰色的。

如果一个控件对象被禁用,那么该对象下的子元素也会被禁用。

  • 相关API:
isEnabled()获取控件状态
setEnabled()设置控件状态


示例

通过其他按钮,控制该按钮的可用状态

拖拽添加按钮控件,右键转到槽定义

2.geometry

  • 作用:位置和尺寸,x、y、width、height

坐标以父元素作为参考进行设置。

左手坐标系,横x,纵y。高为height,宽为width。

  • 相关API:
geometry()获取控件的位置和尺寸。返回结果为QRect。
setGeometry(QRect)设置位置和尺寸
setGeometry(int x, int y, int width, int height)设置位置和尺寸


  • 示例

1.使用setGeometry(QRect),使用QRect来设置坐标和宽高

效果:改变矩形x,y时,宽高自动随之变化,移动了矩形的左上角位置,而右下角位置不变。

void Widget::on_pushButton_up_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometryrect.setY(rect.y()-5);ui->pushButton_target->setGeometry(rect);}void Widget::on_pushButton_left_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometryrect.setX(rect.x()-5);ui->pushButton_target->setGeometry(rect);}void Widget::on_pushButton_down_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometryrect.setY(rect.y()+5);ui->pushButton_target->setGeometry(rect);}void Widget::on_pushButton_right_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometryrect.setX(rect.x()+5);ui->pushButton_target->setGeometry(rect);}

2.使用setGeometry(int x, int y, int width, int height)

修改x,y时,宽高不会自动变化,实现平移的效果。

void Widget::on_pushButton_up_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometry
//    rect.setY(rect.y()-5);//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());}void Widget::on_pushButton_left_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometry
//    rect.setX(rect.x()-5);//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());}void Widget::on_pushButton_down_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometry
//    rect.setY(rect.y()+5);
//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x(),rect.y()+5,rect.width(),rect.height());}void Widget::on_pushButton_right_clicked()
{//1.获取geometryQRect rect=ui->pushButton_target->geometry();qDebug()<<rect;//2.设置geometry
//    rect.setX(rect.x()+5);//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x()+5,rect.y(),rect.width(),rect.height());}void Widget::on_pushButton_target_clicked()
{}

3.告白程序

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);srand(time(NULL));
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_accept_clicked()
{ui->label->setText("今天开始是我们的第一天");
}void Widget::on_pushButton_regect_clicked()
{//点击即平移按钮到随机位置。限制在窗口内部//获取窗口尺寸大小QRect rect=this->geometry();int width=rect.width();int height=rect.height();int x=rand()%width;int y=rand()%height;//方法一:setGeometry
//    QRect rect1=ui->pushButton_regect->geometry();//    ui->pushButton_regect->setGeometry(x,y,rect1.width(),rect1.height());//方法2:moveui->pushButton_regect->move(x,y);}

注册pressed信号:鼠标点击,未释放时触发信号

void Widget::on_pushButton_regect_pressed()
{//点击即平移按钮到随机位置。限制在窗口内部//获取窗口尺寸大小QRect rect=this->geometry();int width=rect.width();int height=rect.height();int x=rand()%width;int y=rand()%height;//方法一:setGeometry
//    QRect rect1=ui->pushButton_regect->geometry();//    ui->pushButton_regect->setGeometry(x,y,rect1.width(),rect1.height());//方法2:moveui->pushButton_regect->move(x,y);}

需要鼠标挪动到按钮上,不点击,就触发信号的效果。需要学习Qt的事件机制,后面再学习。


window frame对坐标的影响

两种窗口坐标:包含window frame的和不包含windowframe的

windowframe就是带有标题栏,最小化,最⼤化,关闭按钮,的整个窗口。

不包含windowfram的窗口就是Widget控件本身。

Qt提供了包含和不包含windowframe的各种坐标API。

包含windowframe的坐标API:

x()获取x坐标
y()获取y坐标
frameGeometry()

返回QRect对象。

QRect相当于QPoint和QSize的结合体

可以获取x,y,width,height

可以设置x,y,width,height

pos()

返回QPoint对象

可以获取x(),y(),

设置setX(),setY()

move(int x,int y)移动控件

不包含windowframe的坐标API:

geometry()返回QRect对象
width()返回宽
height()返回高
rect()返回QRect对象
size()返回QSize对象

查看区别:

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//widget对象构造函数中,获取到的两种坐标是一样的,widget还没有挂到windowframe上//需要在构造函数结束之后,然后挂到对象树上之后//    QRect rect1=this->geometry();
//    QRect rect2=this->frameGeometry();
//    qDebug()<<rect1;
//    qDebug()<<rect2;QPushButton* button=new QPushButton(this);button->setText("按钮");connect(button,&QPushButton::clicked,this,&Widget::handel);}Widget::~Widget()
{delete ui;
}void Widget::handel()
{QRect rect1=this->geometry();QRect rect2=this->frameGeometry();qDebug()<<rect1;qDebug()<<rect2;}

以整个屏幕的左上角为坐标原点

窗口含windowframe的坐标,x=559,y=172

不含windowframe的坐标,x=560,y=210

3.windowTitle

表示:窗口标题
API:
windowTitle()获取控件的窗口标题
setWindowTitle(const QString& title)设置控件窗口标题

set标题只对顶层窗口生效,但子控件调用时,没有产生效果,也不会报错。

4.windowIcon

表示:窗口图标

API:

windowIcon()获取窗口图标,返回QIcon对象
setWindowIcon(const QIcon& icon)设置窗口图标

只针对顶层窗口生效。

注意:
1.QIcon对象创建在栈上

        QIcon icon(".\image\icon.png");//不在堆上开辟,图标在窗口创建后就设置到QWidget,图标对象释本身放不释放不影响图标的显示。

        QIcon不支持对象树机制,并不能设置父节点。

2.路径不要包含转义字符

        路径分割符使用 1./ 2.\\

        \\是为了防止单反斜杠被识别成转义字符出现歧义

3.C++11引入 row string来解决上述问题

        字符串里不包含转义字符(任何字符都不会进行转义)

        使用:r("d:\ret.jpg")

 

4.图片路径问题

    因为无法确保开发主机的图片路径和用户图片路径不一致
    建议使用相对路径,将图片保存到项目目录下
    但相对路径这样的方式,还需要在打包文件的时候,将exe程序,和图片按照一定的目录结构,打包发送给用户

引入QRC机制

 ||

\\//

QRC机制

    Qt提供QRC机制    从根本上解决问题1.保证用户机存在图片路径  2.保证图片不会被用户删掉

为Qt项目引入一个xml文件(后缀为.qrc),在这个xml文件中导入图片资源。

后续编译时,将xml的资源提取,转换成二进制数据,保存到程序代码中。

这样所以图片不会被用户删掉了,缺点无法导入太大的文件。

如视频文件。

使用QRC示例:

二进制数据用数组保存,Qt抽象出虚拟的目录,来方便访问图片。

1)创建“前缀”Prefix

改成/。

2)点击Add Files,添加图片资源

3)要求图片必须保存在qrc文件的同级目录下,或同级的子目录里

4)导入成功效果

5)使用该图片:

QIcon(":/image/icon.png")

效果:

查看图片资源生成的代码:

build目录下的,debug目录中,新增

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

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

相关文章

基于transformer的目标检测:DETR

目录 一、背景介绍 二、DETR的工作流程 三、DETR的架构 1. 损失函数 2. 网络框架讲解及举例 一、背景介绍 在深度学习和计算机视觉领域&#xff0c;目标检测一直是一个核心问题。传统方法依赖于复杂的流程和手工设计的组件&#xff0c;如非极大值抑制&#xff08;nms&…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

RedisTemplate执行lua脚本及Lua 脚本语言详解

使用RedisTemplate执行lua脚本 在开发中&#xff0c;我们经常需要与Redis数据库进行交互&#xff0c;而Redis是一个基于内存的高性能键值存储数据库&#xff0c;它支持多种数据结构&#xff0c;并提供了丰富的命令接口。在某些情况下&#xff0c;我们可能需要执行一些复杂的逻…

倾斜摄影相机在不动产确权登记和权籍调查中的应用

一、项目背景 1.1 项目背景 为贯彻落实中央、国务院关于实施乡村振兴战略、关于“扎实推进房地一体的农村集体建设用地和宅基地使用权确权登记颁证&#xff0c;完善农民闲置宅基地和闲置农房政策&#xff0c;探索宅基地所有权、资格权、使用权‘三权分置’”的要求&#xff0…

SSL,TLS协议分析

写在前面 工作中总是会接触到https协议&#xff0c;也知道其使用了ssl&#xff0c;tls协议。但对其细节并不是十分的清楚。所以&#xff0c;就希望通过这篇文章让自己和读者朋友们都能对这方面知识有更清晰的理解。 1&#xff1a;tls/ssl协议的工作原理 1.1&#xff1a;设计的…

STM32 I2C通信外设

单片机学习&#xff01; 目录 前言 一、I2C外设简介 1.1 硬件I2C外设 1.2 硬件I2C功能 1.2.1 多主机模型 1.2.2 7位地址和10位地址的模式 1.2.3 通讯速度 1.2.4 支持DMA 1.2.5 兼容SMBus协议 1.2.6 芯片型号资源 二、I2C框图 2.1 引脚 2.2 SDA数据控制 2.3 SCL时…

新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)

文章目录 为什么需要新的数据架构&#xff1f;湖仓一体&#xff08;Lakehouse&#xff09;——新的大数据架构模式 同时具备数仓与数据湖的优点湖仓一体架构 存储层计算层 湖仓一体特性 单一存储拥有数据仓库的查询性能存算分离开放式架构支持各种数据源类型支持各种使用方式架…

Linux安全防火墙(iptables)配置策略

目录 概念 防火墙的主要功能和特点&#xff1a; 防火墙分类 其他概念 通信五要素&#xff1a; 通信四要素 用户态和内核态 四个表五个链 四个表 五条链 数据包过滤的匹配流程 三种报文流向&#xff1a; 规则内的匹配顺序&#xff1a; iptables iptables命令的格…

十四、Vue 混入(Mixins)详解

文章目录 简介一、基本语法定义混入对象使用混入对象二、混入的数据合并数据合并规则深度合并(对象类型数据)三、混入的生命周期钩子生命周期钩子的合并规则利用生命周期钩子合并的优势四、混入的方法合并方法合并规则调用被覆盖的方法(高级用法)五、混入的应用场景多个组件…

每日AIGC最新进展(80): 重庆大学提出多角色视频生成方法、Adobe提出大视角变化下的人类视频生成、字节跳动提出快速虚拟头像生成方法

Diffusion Models专栏文章汇总:入门与实战 Follow-Your-MultiPose: Tuning-Free Multi-Character Text-to-Video Generation via Pose Guidance 在多角色视频生成的研究中,如何实现文本可编辑和姿态可控的角色生成一直是一个具有挑战性的课题。现有的方法往往只关注单一对象的…

【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 纯虚函数 一、特点 二、使用场景 三、作用 四、注意事项 五、相关概念对比 2. 抽象类的使用 一、定义与概念 二、使用场景 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;设计一个矩形类、一个圆形…

STM32 拓展 电源控制

目录 电源控制 电源框图 VDDA供电区域 VDD供电区域 1.8V低电压区域 后备供电区域 电压调节器 上电复位和掉电复位 可编程电压检测器(PVD) 低功耗 睡眠模式(只有CUP(老板)睡眠) 进入睡眠模式 退出睡眠模式 停机(停止)模式(只留核心区域(上班)) 进入停…

c# CodeFirst生成表字段加注释

前置&#xff1a;ORM框架工具使用的FreeSql 背景&#xff1a;开发环境中运行接口&#xff0c;所有的表字段以及备注会自动加上&#xff0c;但是在测试环境时运行就只生成了表&#xff0c;没有把每个字段的注释加上 问题检查&#xff1a; FreeSql CodeFirst 支持将 c# 代码内的注…

Python连接和操作Elasticsearch详细指南

Python连接和操作Elasticsearch详细指南 一、服务器端配置1. 修改 Elasticsearch 配置文件2. 开放防火墙端口 二、本地 Python 连接 Elasticsearch1. 连接 Elasticsearch2. 索引操作3. 文档操作4. 搜索内容5. 聚合查询6. 批量操作 三、注意事项四、故障排除结论 Elasticsearch …

五个不同类型的数据库安装

一、 官方首页下载 打开 MySQL 官方首页&#xff0c;链接为&#xff1a; MySQL 进去社区后选择合适的版本进行安装 安装细节 依图一路next 点击finish结束安装 二、 在线YUM仓库 将该安装包的下载链接在 Linux 操作系统中按照以下命令直接进行下载 三、 二进制本地 通过该链接…

用户界面软件01

Jens Coldewey 著&#xff0c;Tom.X 译 本文中的模式语言逐步深入地探讨用户界面架构的设计&#xff0c;它基于人机工程学&#xff0c;足以形成一套完整的体系。如果你对这方面有兴趣&#xff0c;请参考[Tog92]&#xff0c;[Coo95]和[Col95]。 本文不讨论用户界面的布局&…

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化&#xff1a;内存优化 &#xff08;思路篇&#xff09; 大概梳理了Android 内存原理和优化的必要性及应该如何优化&#xff0c;输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…

stm32第一次烧录或者上电运行卡死问题分析

问题描述 单片机烧录代码&#xff08;刚上电&#xff09;无法立即运行&#xff0c;必须要复位一次或多次才能运行&#xff1b;跟踪调试会进入HardFault_Handler中断。 问题分析 烧录配置如下图&#xff0c;首先排除配置问题那么该问题就比较让人头大了&#xff0c;理论上&am…

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包&#xff0c;并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

git理解记录

文章目录 1. 背景2. 基本概念3. 日常工作流程4. 其他常见操作4.1 merge合并操作4.2 tag打标签操作4.3 remoute远程操作4.4 撤销修改 git理解记录 1. 背景 git作为分布式版本控制系统&#xff0c;开源且免费&#xff0c;相比svn集中式版本控制系统存在速度快(HEAD指针指向某次co…