【Qt】深入理解QWidget常用控件: enable属性、geometry属性和window frame属性

server/2024/10/22 8:06:31/

文章目录

  • 前言:
  • 1. 什么是控件
  • 2. Qt中QWidget控件的常用属性及元编程
    • QWidget 核心属性
    • enable属性:
    • geometry 属性 :
        • window frame 窗口框架
  • 总结:

前言:

图形化界面的开发常常需要使用各种控件,而Qt作为一个强大的跨平台GUI应用程序开发框架,提供了丰富的控件库和属性,使得界面开发变得更加简单高效。本文将介绍控件的概念以及Qt中QWidget控件的常用属性及元编程方法,帮助读者快速上手Qt界面开发。

1. 什么是控件

实现图形化界面的程序,Qt中已经给我们提供了很多的“控件”
就需要学习和了解这些控件,学会如何使用这些控件。
在这里插入图片描述

编程 讲究的是“站在巨人的肩膀上”,而不是“从头发明轮子”,一个图形化界面上的内容,不需要咱们全都从零去实现. Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮,下拉框 … ) 界面上各种元素,各种部分的“统称”咱们拿过来就能直接使用。

2. Qt中QWidget控件的常用属性及元编程

QWidget 核心属性

Qt 中的各种控件都是就继承自QWidget 类, Qt控件体系中通用的部分
在这里插入图片描述

Qt Creator 右侧,可以看到QWidget的各种属性 ,并且在这里也能直接进行编辑,上述属性都可以通过Qt的文档来一一进行了解 。

这些属性不需要大家每个都去了解,只需要认识其中的一些常用的,重要的属性即可。

enable属性:

描述了一个控件是否处于“可用”状态,相对的概念,禁用。

所谓“禁用”指的是该控件不能接收任何用户的输入事件,并且外观上往往是灰色的.
如果一个widget被禁用,则该widget的子元素也被禁用.

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在同一个界面中,要求不同的控件的 objectName 也是必须不同的。(不能重复) 后续就可以通过 ui->objectName
方式来获取到对应的控件对象了。

ui->pushButton // 得到了第一个按钮对象
ui->pushButton_2 // 得到了第二个按钮对象

元编程,Qt会根据ui文件,生成一个 ui_widget.h 文件,生成的过程中会感知到,界面都有哪些控件,每个控件的objectName。

自动生成的名字,结尾是用数字命名,改成pushButton_enable 好一些。

void Widget::on_pushButton_clicked()
{qDebug() << "执行了槽函数";
}void Widget::on_pushButton_enable_clicked()
{// 切换第一个按钮的禁用状态// 1. 先获取到第一个按钮当前的可用状态bool enable = ui->pushButton->isEnabled();if (enable) {ui->pushButton->setEnabled(false);} else {ui->pushButton->setEnabled(true);}
}

在这里插入图片描述

geometry 属性 :

几何 ,可以把这个东西视为四个属性的统称:x, y, width, height
(当前控件的尺寸和位置)
在这里插入图片描述
在这里插入图片描述
Qt 中针对一些几何上的概念也进行封装。
QPoint 表示一个点
QRect 表示一个矩形
这些属于小对象,里面的属性非常少,占用空间也小,C++中用上述对象,通常会按照值的方式传递参数了。

move 只是修改位置,setGeometry 既可以修改位置,右可以修改尺寸。

void Widget::on_pushButton_up_clicked()
{// 获取到 target 本身的 geometryQRect rect = ui->pushButton_target->geometry();qDebug() << rect;
//    rect.setY(rect.y() - 5);  // 这种写法只修改 button 左上角的那个点
//    ui->pushButton_target->setGeometry(rect);ui->pushButton_target->setGeometry(rect.x(), rect.y()-5,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_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_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()); // 平移
}

在这里插入图片描述

window frame 窗口框架

操作系统自带
在这里插入图片描述
Qt 中坐标系
在 Qt 中, 关于位置尺寸,提供了很多的API。
有的API的位置信息是以 Widget 本体左上角为原点(不考虑 Window frame)
有的 API 的位置信息是以 windows frame 左上角为原点的

geometry() 、setGeometry() 都不考虑 window frame
frameGeometry() 、setFrameGeometry() 考虑 window frame
在这里插入图片描述

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 此处直接针对 widget 对象来使用 geometry 和 frameGeometry, 观察区别。QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();qDebug() << rect1;qDebug() << rect2;
}

在这里插入图片描述
当前代码是放到了构造函数中。
此时这个 Widget 对象正在构造。
还没有被加入到 window frame 中,因此还看不到 window frame 的影响。

void Widget::handle()
{QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();qDebug() << rect1;qDebug() << rect2;
}

在这里插入图片描述
用槽函数,就可以看出,window frame 的影响

总结:

本文首先介绍了控件的概念,以及为什么在界面开发中需要使用控件。随后详细讲解了QWidget控件的常用属性,包括enable属性、geometry属性和window frame属性,并通过示例代码展示了如何使用这些属性进行界面布局和控件状态的管理。最后,通过元编程的方式介绍了如何利用Qt自动生成的ui文件和相应的ui_widget.h文件来简化界面控件的操作,提高开发效率。希望本文能够帮助读者更好地理解和应用Qt界面开发中的核心概念和技术。


http://www.ppmy.cn/server/38915.html

相关文章

Java实现NFS文件上传、下载和读取功能的工具类

Java实现NFS文件上传、下载和读取功能的工具类 引言&#xff1a;代码示例一、准备工作二、工具类设计与核心方法三、异常处理与性能优化四、总结 引言&#xff1a; NFS&#xff08;Network File System&#xff09;广泛应用于分布式环境的情况下&#xff0c;这里介绍使用Java工…

基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园悬赏任务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

INNODB和MyISAM有什么区别

InnoDB和MyISAM是MySQL数据库中两种常见的存储引擎&#xff0c;它们之间存在一些重要的区别。 事务支持&#xff1a;InnoDB支持ACID&#xff08;原子性、一致性、隔离性和持久性&#xff09;事务&#xff0c;这保证了数据的完整性和一致性。相比之下&#xff0c;MyISAM不支持事…

2024OD机试卷-数组连续和 (java\python\c++)

题目:数组连续和 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000) 第二行有N个正整数(每个正整数小于等于100)。 输出描述 输出一…

基于自己数据微调LLama3并本地化部署

首发网站https://tianfeng.space 准备数据 这是一条数据&#xff0c;格式如下&#xff1a; {"instruction": "胡女士出现了黄疸、恶心、呕吐等症状&#xff0c;可能患了什么疾病&#xff1f;", "input": "", "output": &…

算法提高之迷宫问题

算法提高之迷宫问题 核心思想&#xff1a;最短路问题 从(n-1,n-1)开始bfs 往前走一个就存入pre数组 之后再遍历pre数组输出 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1010,M N*N;#define x first#def…

信通院智能体标准发布,实在智能牵头编写

4月28日&#xff0c;由人工智能关键技术和应用评测工业和信息化部重点实验室、中国信息通信研究院&#xff08;以下简称&#xff1a;中国信通院&#xff09;人工智能研究所共同主办的“人工智能”高质量发展研讨会顺利召开&#xff0c;会上中国信通院正式发布全国首个Agent&…

Nginx 线程池

并发基本概念 并发&#xff1a;在同一时间段内&#xff0c;多个任务同时执行&#xff0c;偏向于多个任务交替执行&#xff0c;在某一时刻其实只有一个任务在执行&#xff08;单个CPU就可并发&#xff0c;比如时间片轮转机制&#xff09;。 并行&#xff1a;同一时刻&#xff0…