Qt enabled + geometry 属性(2)

news2025/5/25 3:28:47

文章目录

  • 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);
    else
        ui->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);
    else
        ui->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.coloradmin.cn/o/2385061.html

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

相关文章

Llamaindex自学笔记(完)

Llamaindex框架主要做RAG&#xff0c;工作流用LangGraph做 换源&#xff1a; -i https://pypi.mirrors.ustc.edu.cn/simple/环境搭建&#xff1a; conda create -n llamaindex python3.12 conda activate llamaindexpip install llama-index pip install llama-cloud-servic…

飞书知识问答深度测评:企业AI应用落地的“范本级”产品

前言 当 AI 逐渐从技术前沿走向日常办公&#xff0c;我们最常听到的一个词是“效率提升”。但真正能做到降本增效、让企业员工切实受益的 AI 产品&#xff0c;仍属少数。尤其是在组织内部知识管理这一块&#xff0c;大多数企业仍停留在“搜索靠关键词、记录靠记忆、协作靠问人…

draw.io的基础与进阶使用指南

前言 一、Draw.io 简介 Draw.io 是一款功能强大的绘图工具&#xff0c;支持在线使用和本地安装。它提供了丰富的模板和形状元素&#xff0c;能够绘制流程图、UML 图、甘特图、网络图等多种图形。Draw.io 的文件格式支持可编辑的矢量图和位图&#xff0c;方便后续修改 draw.io的…

Sanitizers

一、简介 sanitizers 是谷歌提供的一套开源工具&#xff0c;能够发现堆栈读写溢出、内存泄漏、线程数据竞争和死锁等问题。包括&#xff1a; AddressSanitizers (Asan):检测地址相关问题&#xff0c;如use-after-free,heap-buffer-overflow, stack_buffer_overflow,use_after_…

pip代理出现问题 ProxyError

WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ProxyError(‘Cannot connect to proxy.’, NewConnectionError(’<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f8347ad5ae0>: F…

vue+threeJS 创建镂空球体(SphereGeometry)

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJS 创建镂空球体&#xff08;SphereGeometry&#xff09;”。 上次看到一个做镂空球体的项目&#xff0c;自己也准备尝试着做一做。今天终于做完了&#xff0c;并对这个项目进行梳理。 镂空球体示例效果…

[ Qt ] | 常见控件(一)

目录 Widget enable geometry 标题中的&#xff1a;有一不一定有二&#xff0c;但是有一说明还没结束。 Widget 控件(Widget)&#xff0c;是界面上各种元素&#xff0c;各种部分的统称。 Qt中的控件都是继承自QWidget这个类&#xff0c;是Qt控件体系中&#xff0c;通用的…

【八股战神篇】Java虚拟机(JVM)高频面试题

目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型的核心思想: 3.双亲委派模型的…

NDVI谐波拟合(基于GEE实现)

在遥感影像中&#xff0c;我们常用 NDVI&#xff08;归一化植被指数&#xff09;来衡量地表植被的绿度。它简单直观&#xff0c;是生态监测、农情分析的基础工具。但你是否注意到&#xff1a; NDVI 虽然“绿”&#xff0c;却常常“乱”。 因为云层、观测频率、天气干扰&#xf…

南京邮电大学《智能控制技术》期末抢救(上)

一、智能控制的提出 传统控制方法包括经典控制和现代控制——基于被控对象精确模型的控制方式&#xff0c;缺乏灵活性和应变能力&#xff0c;适于解决线性、时不变性等相对简单的控制问题。传统控制方法在实际应用中遇到很多难解决的问题&#xff0c;主要表现以下几点&#xff…

TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

地理特征类可视化图像

目录 一、蜂窝热力地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 二、变形地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 三、关联地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.pyth…

【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案

一、第三方接口治理的核心挑战与架构设计 1.1 不稳定接口的典型特征 维度表现影响范围响应时间P99超过2秒,波动幅度大(如100ms~5s)导致前端超时,用户体验恶化错误率随机返回5xx/429,日均故障3次以上核心业务流程中断,交易失败率上升协议不一致多版本API共存,字段定义不…

DataGridView中拖放带有图片的Excel,实现数据批量导入

1、带有DataGridView的窗体&#xff0c;界面如下 2、编写DataGridView支持拖放的代码 Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim file…

跨域_Cross-origin resource sharing

同源是指"协议域名端口"三者相同&#xff0c;即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff…

Opencv常见学习链接(待分类补充)

文章目录 1.常见学习链接 1.常见学习链接 1.Opencv中文官方文档 2.Opencv C图像处理&#xff1a;矩阵Mat 随机数RNG 计算耗时 鼠标事件 3.Opencv C图像处理&#xff1a;亮度对比度饱和度高光暖色调阴影漫画效果白平衡浮雕羽化锐化颗粒感 4.OpenCV —— 频率域滤波&#xff…

大疆制图跑飞马D2000的正射与三维模型

1 问题描述 大疆制图在跑大疆无人机飞的影像的时候&#xff0c;能够自动识别相机参数并且影像自带pos信息&#xff0c;但是用飞马无人机获取的影像pos信息与影像是分开的&#xff08;飞马无人机数据处理有讲&#xff09;&#xff0c;所以在用大疆制图时需要对相机参数进行设置…

ConceptAttention:Diffusion Transformers learn highly interpretable features

ConceptAttention: Diffusion Transformers Learn Highly Interpretable Featureshttps://arxiv.org/html/2502.04320?_immersive_translate_auto_translate=1用flux的attention来做图文的显著性分析。 1.i

物联网低功耗保活协同优化方案:软硬件与WiFi网关动态联动

目录 一、总体方案概述 二、架构组成 2.1 系统拓扑 2.2 硬件端(MCU + WiFi 模组) 2.3 WiFi 网关 2.4 云端服务器 三、低功耗保活技术设计模式 3.1 模式一:定时唤醒 + MQTT 保活 3.1.1 设备端 3.1.2 优势 3.2 模式二:网关保活代理 + 本地网络唤醒 3.2.1 网关功能…

LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络|文献速递-深度学习医疗AI最新文献

Title 题目 LW-CTrans: A lightweight hybrid network of CNN and Transformer for 3Dmedical image segmentation LW-CTrans&#xff1a;一种用于三维医学图像分割的轻量级CNN与Transformer混合网络 01 文献速递介绍 三维医学图像分割旨在从计算机断层扫描&#xff08;CT…