Qt enabled + geometry 属性(2)

文章目录

  • enabled属性
    • 可用与禁用的概念
    • API接口
    • 代码演示 + 阐述说明
      • 1. 先简单描述下要如何演示出上面两个接口的效果(`思路`)
      • 2. 事先规范按钮对象的命名
      • 3. 定义两个按钮对象的槽函数 + 动图演示效果
      • 4. widget.cpp
  • geometry属性
    • 预备知识
    • API接口
    • 上下左右移动 target 按钮
      • 1. 简单描述要干什么,以及它的思路
      • 2. 定义四个方向按钮控件的槽函数
      • 3. 动图演示效果
      • 4. 调整程序-只平移不修改尺寸
      • 5. widget.cpp
    • 向女神表白的程序
      • 1. 图形化编辑界面
      • 2. 想如何表白以及实现思路
      • 3. 定义两结果按钮的槽函数
      • 4. 动图演示效果
      • 5. 程序调整
      • 6. widget.cpp

简介:这篇文章就介绍了两个属性,但是不仅仅是解释这两个属性是啥意思。也不是直接三段代码直接撂在这里,其实最重要的是这个属性是如何与控件结合运用,如何通过属性去调整控件,知道它的原理,不会运用那也是纸上谈兵,这就是为啥有百无一用是书生的感慨

1. enabled 属性效果展示

在这里插入图片描述


2. geometry 属性效果展示

在这里插入图片描述


3. 女神表白程序效果展示

在这里插入图片描述

enabled属性

可用与禁用的概念

  1. 若这个控件是处于可用状态就跟咱平常使用这个控件一样,没啥特殊变化
  2. enabled属性描述了一个控件是否处于可用状态,那与之相对便也存在禁用的概念
    • 若这个控件是处于禁用状态,所谓禁用指的是该控件不能接受任何用户的输入控件,并且该控件的显示在外观上是灰色的,基本上啥操作都干不了
    • 如果一个widget(控件)被禁用的话,那该widget的子元素也会被禁用
    • 可别忘了,在Qt中是通过对象树这种机制对控件对象进行统一管理,如果其中一个对象控件被禁用了,那挂在该对象下的子控件对象也将会被禁用

API接口

API说明
isEnabled()获取到该控件的可用状态
setEnabled()设置控件是否可使用,传参可选择true(可用),false(禁用)

代码演示 + 阐述说明

1. 先简单描述下要如何演示出上面两个接口的效果(思路

  • 咱先通过编辑图形化界面去创建两个按钮,一个按钮文本为按钮,一个按钮文字为切换按钮状态,为了点击这个按钮发射信号后,能执行相应的槽函数,在这里就直接在图形化界面转到槽去定义槽函数,也无需咱手动connect
  • 在按钮这个槽函数中就直接打印一句日志:执行了按钮对应的槽函数
  • 在切换按钮状态这个槽函数中先获取按钮控件的可用状态,写一个简单的判断语句,若这个按钮可用那就把它设成禁用状态,此时切换后再点击按钮就不会打印日志,若这个按钮禁用(灰色)就把它设成可用状态

2. 事先规范按钮对象的命名

  • 当咱们在同一界面去创建多个按钮对象时,要求不同的控件的objectName也是必须不同的(不能重复),后续就可以通过ui->objectName方式来获取到对应的控件对象了
  • 比如你要得到第一个按钮对应的对象可以这么写:ui->pushButton,第二个按钮对应的对象:ui->pushButton_2。那当前这个自动生成的objectName是有规律的,即这个名字是根据控件的类型 + 下划线 + 数字去自动生成对象名
  • 那很明显,以数字的方式去命名,并不是一个很好的编程习惯,毕竟代码的可读性很差。所以要对这里创建的按钮对象名进行重命名,按钮:直接pushButton,不用修改,就只有点击后打印日志的意思,切换按钮状态:修改成pushButton_enable
    在这里插入图片描述
  • 根据这个对象名,Qt的元编程技术就会根据这个ui文件,生成一个ui_widget.h文件,那它在生成的过程中就会感知到界面上都有哪些控件,每个控件的objectName去生成控件对象

3. 定义两个按钮对象的槽函数 + 动图演示效果

  • 这里还是要提一下按钮提供的信号,咱们最常用的信号就是clicked,clicked信号有两个版本,一个是无参数的,一个是传bool参数的,一般对于QpushButton控件来讲,使用无参数的即可。传参数的就相当于打✔的复选框
    在这里插入图片描述
  • pushButton对象定义的槽函数
void Widget::on_pushButton_clicked()
{// 点击按钮后就打印一句日志-> 执行了按钮对应的槽函数qDebug() << "执行了按钮对应的槽函数";
}
  • pushButton_enable对象定义的槽函数
void Widget::on_pushButton_enable_clicked()
{// 要先获取到上面按钮控件的可用状态bool enable = ui->pushButton->isEnabled();// 写一个判断语句,若是可用状态直接禁用// 若是禁用状态,点击切换按钮状态这个按钮,直接可用if (enable)ui->pushButton->setEnabled(false);elseui->pushButton->setEnabled(true);
}
  • 动图演示效果

在这里插入图片描述

4. widget.cpp

#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()
{// 点击按钮后就打印一句日志-> 执行了按钮对应的槽函数qDebug() << "执行了按钮对应的槽函数";
}void Widget::on_pushButton_enable_clicked()
{// 要先获取到上面按钮控件的可用状态bool enable = ui->pushButton->isEnabled();// 写一个判断语句,若是可用状态直接禁用// 若是禁用状态,点击切换按钮状态这个按钮,直接可用if (enable)ui->pushButton->setEnabled(false);elseui->pushButton->setEnabled(true);
}

geometry属性

预备知识

  • geometry它翻译过来的意思是几何学,几何形状,其次要掌握它的发音[dʒiˈɒmətri]。很多时候遇到的这些专业术语会涉及到一些拗口的单词,这个一定要会发音和拼写毕竟以后是要团队合作和面试的,总会涉及到相关专业知识的交流
  • 这里也需提一下这个单词的发音,比如这个队列(queue)我之前经常读成女王(queen)同音,但其实它的正确发音是:[kju]。比如这个Qt,它的正确读音:[kjuːt],但咱们就直接拆开来Q T。而这个Linux也有四种常见读法,分别是:李六克斯,李娜克斯(官方读法),李ne克斯,李ni克斯。以后咱要注意一点人情世故若跟你是平级的,你读你的,不用去管别人咋读,若是你的领导/面试官,它咋读你就咋读(千万不用去纠正人家)
  • 可以把这四个属性视为几何的统称(x:横坐标,y:纵坐标,width:宽度,height:高度),指的就是该控件的位置和尺寸
    在这里插入图片描述

API接口

API说明
geometry()获取到控件的位置和尺寸,返回结果是一个QRect对象,包含了x,y,width,height具体参数,其中x,y是左上角的坐标
setGeometry(QRect)设置控件的位置和尺寸,可以直接传参QRect
setGeometry(x,y,width,height)也可以分成四个属性单独设置
  • Qt针对一些几何上的概念进行了封装,比如QRect表示的是一个矩形的尺寸和位置,QPoint表示的就是一个点,这两都属于是小对象,里面的属性非常少,占用的空间也小,所以使用上述对象的时候一般采用值的方式传递参数。QRect,不是Qrect
  • move可以修改控件的位置,不过setGeometry可以修改位置,还可以修改尺寸

上下左右移动 target 按钮

1. 简单描述要干什么,以及它的思路

  • 先单独拖拽一个目标按钮控件QpushButton_target,再单独创建四个按钮控件QpushButton_up,QpushButton_down,_left,_right,点击这四个按钮可以控制目标按钮控件往相应方向移动
  • 利用上面的API接口。先要获取该目标按钮的QRectQRect rect = ui->QpushButton_target->geometry()】,打印该rect的信息,接着点up按钮要向上5个单位的像素【ret.setY(ret.y() - 5】,最后将变化的rect重新设置成目标按钮控件的几何属性【ui->QpushButton_target->setGeometry(rect)]。其它三个也是往相应方向设置

2. 定义四个方向按钮控件的槽函数

  • QPushButton_up
void Widget::on_pushButton_up_clicked()
{// 先获取目标控件的几何属性QRect rect = ui->pushButton_target->geometry();// 打印日志信息qDebug() << rect;// 向上移动5个单位的像素rect.setY(rect.y() - 5);// 重新设置几何属性ui->pushButton_target->setGeometry(rect);
}
  • QPushButton_leftrect.setX(rect.x() - 5);
  • QPushButton_rightrect.setX(rect.x() + 5);
  • QPushButton_downrect.setY(rect.y() + 5);

3. 动图演示效果

在这里插入图片描述

4. 调整程序-只平移不修改尺寸

  • 通过上述的动图,发现当前代码实际执行的效果,是在调整左上角位置坐标,左上角位置改变的同时,该控件的高度和宽度也同时发生了改变,因为上述代码修改的是QRect对象的x,y坐标
  • 如果想要让这个按钮能够平移(宽度和高度不变,整个按钮的位置都发生改变),那就不修改QRect,而是通过QRect基于setGeometry的第二个版本的函数重新设置位置即可。ui->pushButton_target->setGeometry(rect.x(), rect.y()-5, rect.width(), rect.height());

5. widget.cpp

#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_up_clicked()
{// 先获取目标控件的几何属性QRect rect = ui->pushButton_target->geometry();// 打印日志信息qDebug() << rect;// 向上移动5个单位的像素// 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()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;
//    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()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;
//    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()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;
//    rect.setX(rect.x() + 5);
//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x()+5, rect.y(), rect.width(), rect.height());
}

向女神表白的程序

1. 图形化编辑界面

在这里插入图片描述

2. 想如何表白以及实现思路

  • 如果女神点击了欣然同意的按钮,那就将Label控件文本的内容改为:nice,咱这辈子有了ui->label->setText("nice,咱这辈子有了")
  • 那如果女神点击了残忍拒绝的按钮,那就将这个按钮随机移动,只要点一次就随机移动一次
  • 这里可以通过生成随机数的方式来确定该按钮的新位置。
    • 利用C标准库中的rand(),能够随机生成一个整数,这个整数的范围很大。【int x = rand() % width,int y = rand() % height】,这里的width,height指的是窗口的宽度与高度
    • 不过该函数使用之前要设置种子【srand(time(0))】这里是设置时间戳作为种子,而C语言中可以通过time获取到秒级时间戳(1970年1月1号0时0分0秒为基准,计算当前时刻和基准时刻的秒数/毫秒数之差
    • rand函数使用之前要设置随机种子,咱们这里的随机生成指的是伪随机,它并不是真随机(也就是数学意义上的每个随机数生成的概率相等),这里只是通过一些计算公式和函数方法根据这个随机种子去生成一系列的随机数,那这里的随机种子就相当于要传入的参数,参数没有变化则生成出来的随机数序列就是相同的

3. 定义两结果按钮的槽函数

  • 欣然同意
void Widget::on_pushButton_accept_clicked()
{// 改变Label中的文本ui->label->setText("nice,咱这辈子有了");
}
  • 残忍拒绝
void Widget::on_pushButton_refuse_clicked()
{// 先要获取到该窗口的宽度与高度int width = this->geometry().width();int height = this->geometry().height();// 这个残忍拒绝的按钮控件要在这个坐标下移动[0,width),[0,height)int x = rand() % width;int y = rand() % height;// 重新设置该残忍拒绝的按钮控件位置QRect rect = ui->pushButton_refuse->geometry();ui->pushButton_refuse->setGeometry(x, y, rect.width(), rect.height());// ui->pushButton_refuse->move(x, y);
}

4. 动图演示效果

在这里插入图片描述

5. 程序调整

咱们上面实现的程序,是鼠标点击之后松开才会发生变化,但按钮提供的信号不只有点击(一下一上是点击),还可以做到鼠标按下的时候就能触发信号,将clicked信号换成pressed也是可以做到鼠标不点击,只要挪到按钮上就能让改按钮移动,不过这里牵扯到Qt中的事件机制(后面了解)
在这里插入图片描述
注意啊兄弟们,别真拿这个程序去向喜欢的妹子表白,咱就是举个例子啊!这是非常不靠谱的行为,要是别人也对你也有意思还好,要是没有意思那可能别人觉得很下头,表白是胜利的宣言,而不是冲锋的号角,不过有时候表白也是很勇敢的行为,勇敢的说出来,真诚诚挚的表明自己的心意,无论结果如何,都没有啥遗憾了

void Widget::on_pushButton_refuse_pressed()
{// 先要获取到该窗口的宽度与高度int width = this->geometry().width();int height = this->geometry().height();// 这个残忍拒绝的按钮控件要在这个坐标下移动[0,width),[0,height)int x = rand() % width;int y = rand() % height;ui->label->setText("女神,女神,做我女朋友");// 改回来// 否则不好演示动图的效果// 重新设置该残忍拒绝的按钮控件位置QRect rect = ui->pushButton_refuse->geometry();ui->pushButton_refuse->setGeometry(x, y, rect.width(), rect.height());// ui->pushButton_refuse->move(x, y);
}

6. widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);srand(time(0));
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_accept_clicked()
{// 改变Label中的文本ui->label->setText("nice,咱这辈子有了");
}void Widget::on_pushButton_refuse_pressed()
{// 先要获取到该窗口的宽度与高度int width = this->geometry().width();int height = this->geometry().height();// 这个残忍拒绝的按钮控件要在这个坐标下移动[0,width),[0,height)int x = rand() % width;int y = rand() % height;ui->label->setText("女神,女神,做我女朋友");// 改回来// 否则不好演示动图的效果// 重新设置该残忍拒绝的按钮控件位置QRect rect = ui->pushButton_refuse->geometry();ui->pushButton_refuse->setGeometry(x, y, rect.width(), rect.height());// ui->pushButton_refuse->move(x, y);
}

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

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

相关文章

Linux下 使用 SSH 完成 Git 绑定 GitHub

文章目录 1、检查 SSH2、生成 SSH key3、添加 SSH key4、验证绑定是否成功 1、检查 SSH Git Bash 中输入ssh命令&#xff0c;查看本机是否安装 SSH&#xff1a; 2、生成 SSH key &#xff08;1&#xff09;输入 ssh-keygen -t rsa 命令&#xff0c;表示我们指定 RSA 算法生…

ubuntu18.04通过cuda_11.3_xxx.run安装失败,电脑黑屏解决办法

项目场景&#xff1a; ubuntu18.04跑DG-SLAM相关代码&#xff0c;安装lietorch包报错&#xff0c;需要用到GPU。 问题描述 跑代码需要cuda11.3&#xff0c;系统里面有另外一个版本&#xff0c;运行cuda_11.3_xxx.run&#xff0c;同时也选择了driver&#xff0c;安装成功后&am…

基于Qwen1.5-0.5B指令监督微调数据集的模型训练

1、安装 LLaMA Factory 输出:检查LLaMA Factory版本&#xff0c;日志或截图。 2、更新数据集 输出:样本数据集(zh.test.csv)处理后形成微调训练格式的json文件&#xff0c;部分数据或截图。 <数据集> dataset_info.json文件指定 &#xff08;1&#xff09;格式转换&…

JVM梳理(逻辑清晰)

JVM总览 JVM 是什么&#xff0c;作用是什么 JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是一个可以运行 Java 字节码的虚拟计算机 核心作用&#xff1a;实现跨平台&#xff08;“一次编写&#xff0c;到处运行”&#xff09;&#xff0c;JVM 是…

【typenum】 9 与常量泛型桥接(generic_const_mappings.rs)

一、源码 该代码提供了常量结构体与库类型的转换。 // THIS IS GENERATED CODE //! Module with some const-generics-friendly definitions, to help bridge the gap //! between those and typenum types. //! //! - It requires the const-generics crate feature to be…

SOPHGO算能科技BM1688内存使用与编解码开发指南

1. BM1688内存分配接口详解 1.1 设备内存分配接口区别 BM1688提供了三个主要的设备内存分配接口,它们的主要区别如下: // 基本设备内存分配接口 void* bm_malloc_device_byte(bm_handle_t handle, unsigned int size);// 指定heap区域的设备内存分配 void*</

解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常

一、问题描述 系统再运行时&#xff0c;突然出现 System.Exception: [RabbitMQ.Send Error] RabbitMQ.Client.Exceptions.AlreadyClosedException: Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Library, code541, text“Unexpected…

STM32单片机GUI系统1 GUI基本内容

目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中&#xff0c;emWin、LVGL、TouchGFX 和 Qt 是…

基于vue框架的动漫论坛g2392(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户 开题报告内容 基于Vue框架的动漫论坛开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着互联网技术的飞速发展&#xff0c;动漫文化在全球范围内迅速传播&#xff0c;成为连接各国青年的重要文化纽带。动漫…

网络安全管理之钓鱼演练应急预案

文章目录 网络安全管理之钓鱼演练应急预案前言一、背景和目的1.1背景1.2目的 二、整体思路三、演练所需四、风险评估和演练目标4.1 风险评估4.2 演练目标 五、演练计划5.1 演练时间和地点5.2 参与人员5.3 演练场景5.4 演练流程5.5 演练评估 六、 应急响应流程七、钓鱼邮件防范7…

Hooks实现原理与自定义Hooks

React Hooks 是 React 16.8 引入的一种机制&#xff0c;允许在函数组件中使用状态&#xff08;state&#xff09;、副作用&#xff08;effect&#xff09;等功能&#xff0c;而无需编写 class 组件。其核心原理是通过闭包和链表结构&#xff0c;在 React 的 Fiber 架构中管理组…

单片机设计_四轴飞行器(STM32)

四轴飞行器&#xff08;STM32&#xff09; 想要更多项目私wo!!! 一、系统简介 四轴飞行器是一种通过四个旋翼产生的升力实现飞行的无人机&#xff0c;其核心控制原理基于欧拉角动力学模型。四轴飞行器通过改变四个电机的转速来实现六自由度控制&#xff08;前后、左右、上下…

服务器的基础知识

什么是服务器 配置牛、运行稳、价格感人的高级计算机&#xff0c;家用电脑不能比拟的。 服务器的组成&#xff1a;电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器&#xff08;服务器cpu架构&#xff09; …

单目测距和双目测距 bev 3D车道线

单目视觉测距原理 单目视觉测距有两种方式。 第一种&#xff0c;是通过深度神经网络来预测深度&#xff0c;这需要大量的训练数据。训练后的单目视觉摄像头可以认识道路上最典型的参与者——人、汽车、卡车、摩托车&#xff0c;或是其他障碍物&#xff08;雪糕桶之类&#xf…

C语言链表的操作

初学 初学C语言时&#xff0c;对于链表节点的定义一般是这样的&#xff1a; typedef struct node {int data;struct node *next; } Node; 向链表中添加节点&#xff1a; void addNode(Node **head, int data) {Node *newNode (Node*)malloc(sizeof(Node));newNode->dat…

STM32 OTA 中断向量表重定向

在STM32的OTA&#xff08;Over-the-Air&#xff09;升级中&#xff0c;​中断向量表重定向是关键技术需求&#xff0c;其核心原因在于STM32的硬件架构和固件运行机制。以下从原理、实现方式及必要性三个角度详细分析&#xff1a; 一、中断向量表的作用与默认机制 ​中断向量表的…

Win11上安装docker

Win11上安装docker 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09;二、安装docker到D盘三、启动docker四、测试启动容器 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09; 以管理员身份打开cmd 更新WSL wsl --update3. 安装WSL wsl --ins…

Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,

Vue3ElementPlus后台管理系统&#xff0c;支持白天黑夜主题切换&#xff0c;专为教育管理场景设计。主要功能包括用户管理&#xff08;管理员、教师、学生&#xff09;、课件资源管理&#xff08;课件列表、下载中心&#xff09;和数据统计&#xff08;使用情况、教学效率等&am…

java云原生实战之graalvm 环境安装

windows环境安装 在Windows环境下安装GraalVM并启用原生镜像功能时&#xff0c;需要Visual Studio的组件支持。具体要点如下&#xff1a; 核心依赖&#xff1a; 需要安装Visual Studio 2022或更新版本&#xff0c;并确保勾选以下组件&#xff1a; "使用C的桌面开发"…

Flask-SQLAlchemy_数据库配置

1、基本概念&#xff08;SQLAlchemy与Flask-SQLAlchemy&#xff09; SQLAlchemy 是 Python 生态中最具影响力的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;其设计理念强调 “框架无关性”&#xff0c;支持在各类 Python 项目中独立使用&#xff0c;包括 Flask、D…