Qt修仙之路2-1 炼丹初成

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

widget.cpp

#include "widget.h"
#include<QDebug>
//实现槽函数
void Widget::login1()
{QString user=username_input->text();QString pass=password_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"<<endl;return;}if("123"==user&&"123"==pass){qDebug()<<"登入成功";this->close();}else{//错误清空password_input->setText("");}
}Widget::Widget(QWidget *parent): QWidget(parent)
{this->resize(468,657);//创建头像标签avatar=new QLabel(this);//移动位置avatar->resize(114,114);avatar->setStyleSheet(" border-radius: 50px;");avatar->move((this->width()-avatar->width())/2,95);//加载图片avatar->setPixmap(QPixmap("C:\\Users\\xzq\\Desktop\\ava.png"));avatar->setScaledContents(true);//添加输入框username_input=new QLineEdit(this);//设置大小username_input->resize(371,60);username_input->setStyleSheet(" border-radius: 10px;");//设置占位文本username_input->setPlaceholderText("请输入QQ账号");//设置位置username_input->move((this->width()-username_input->width())/2,avatar->y()+avatar->height()+30);//设置文本大小居中username_input->setFont(QFont("黑体",20,5));username_input->setAlignment(Qt::AlignmentFlag::AlignHCenter);password_input=new QLineEdit(this);password_input->resize(371,60);password_input->setStyleSheet(" border-radius: 10px;");password_input->move((this->width()-username_input->width())/2,avatar->y()+avatar->height()+30+80);password_input->setPlaceholderText("请输入QQ密码");password_input->setFont(QFont("黑体",10,5));password_input->setAlignment(Qt::AlignmentFlag::AlignHCenter);password_input->setEchoMode(QLineEdit::Password);//复选框check=new QCheckBox("已阅并同意",this);//check->resize(373,26);check->setStyleSheet(        "QCheckBox::indicator {""    width: 16px;""    height: 16px;""    border-radius: 8px;""    border: 1px solid gray;""}""QCheckBox::indicator:checked {""    background-color: blue;""}");check->move((this->width()-check->width())/2,(password_input->y()+password_input->height())+10);//登入按钮login_btn=new QPushButton("登入",this);login_btn->resize(371,60);login_btn->setStyleSheet(        "QPushButton {""    background-color: #0099FF;"  // 正常状态背景颜色"    color: white;"  // 文字颜色"    border: none;"  // 无边框"    padding: 10px 20px;"  // 内边距"border-radius:10px;""}""QPushButton:pressed {""    background-color: #97D6FF;"  // 按下状态背景颜色"}");login_btn->setFont(QFont("黑体",20,5));//移动login_btn->move(password_input->x(),check->y()+check->height()+20);//链接QObject::connect(login_btn,&QPushButton::clicked,this,&Widget::login1);}Widget::~Widget()
{
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QLabel>
#include<QLineEdit>
#include<QRadioButton>
#include<QPushButton>
#include<QCheckBox>
class Widget : public QWidget
{Q_OBJECT
public slots://登入定义槽函数void login1();
public:Widget(QWidget *parent = nullptr);~Widget();
private:QLabel *avatar;//头像QLineEdit *username_input;//QQ号QLineEdit *password_input;//密码QPushButton *login_btn;//登入QCheckBox *check;//协议};
#endif // WIDGET_H

修仙笔记

一、对象树模型

1.1 对象树的构建

Qt中,每个QObject或其派生类对象都能有一个父对象和多个子对象。在创建对象时,如果指定了父对象,该对象会自动被添加到父对象的子对象列表中。这种父子关系形成了一种树形结构,父对象处于树的顶端,子对象在其下方,并且子对象还可以拥有自己的子对象。例如,在一个图形界面应用中,窗口可以作为父对象,而按钮、文本框等控件则是其子对象。

1.2 对象树的自动管理

这一特性是对象树模型的一大亮点。当父对象被销毁时,Qt会自动递归地销毁其所有子对象。这意味着开发者无需手动释放子对象的内存,大大简化了内存管理的过程,有效减少了内存泄漏的风险。在实际开发中,这一机制能让开发者更专注于业务逻辑的实现,而无需过多担心对象的生命周期管理。

1.3 对象树的遍历

在开发过程中,经常需要查找或遍历对象树中的子对象。Qt提供了findChildfindChildren方法,通过这两个方法,可以按名称或类型查找子对象。另外,使用children方法能够获取所有子对象的列表,方便进行遍历操作。比如,想要获取窗口中所有的按钮控件,就可以利用这些方法来实现。

1.4 对象树的事件传递

Qt的事件系统借助对象树来传递事件。事件通常从子对象向父对象传递,直到事件被处理或者到达根对象。同时,父对象还可以通过eventFilter方法拦截并处理子对象的事件。这一机制在实现一些全局的事件处理逻辑时非常有用,例如在一个包含多个输入框的窗口中,统一处理所有输入框的焦点变化事件。

1.5 对象树的动态修改

对象树支持动态修改,既可以通过setParent方法,也可以在构造函数中指定父对象来动态添加子对象。如果想要移除子对象,可以使用setParent(nullptr)将其从树中移除,但此时需要手动管理该子对象的生命周期。

二、信号与槽机制

2.1 信号

信号是类中的特殊成员函数,用于组件向外界传递信息。它定义在类体内的signals权限下,只有声明,没有函数体实现,返回值为void类型,参数可有可无。在程序需要的地方,通过emit关键字来手动发射信号。例如,一个按钮被点击时,就可以发射一个信号来通知其他组件。

2.2 槽

槽是用于接收其他组件发射的信号并执行相应逻辑的特殊成员函数,定义在类体内的slots权限下,是一个完整的函数,既有声明也有定义。槽函数不仅可以接收信号,还能当作普通成员函数被调用,但普通成员函数不能当作槽函数使用。其返回值类型通常为void,参数用于接收信号函数传递过来的数据。槽函数需要与信号函数进行连接,当信号发射时,与之连接的槽函数会自动执行。

2.3 一个包含了信号与槽的类的定义

class Widget : public QWidget
{Q_OBJECT          //信号与槽机制的元对象signals:void my_signal();              //定义一个信号函数public slots:void my_slot();               //自定义的槽函数public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};//自定义槽函数的实现
void Widget::my_slot()
{// 这里编写槽函数的具体逻辑
}

2.4 信号与槽的连接

  • 基于ui界面的连接:可以直接使用系统默认提供的组件信号与槽函数进行连接。
  • 右键转到槽:在ui界面中,通过右键转到槽的方式,信号函数由系统提供,开发者可以自己实现槽函数的逻辑,此时槽函数会自动生成。
  • 手动实现QT4版本的连接:这种连接方式不太友好,需要使用SIGNAL()SLOT()两个宏函数来转换信号函数和槽函数的函数名(因为它们实际是函数指针类型,而参数要求是字符串类型)。
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));
  • QT5版本的连接:相比QT4版本,QT5的连接方式更加简洁,直接使用信号函数和槽函数的地址进行连接。
QObject::connect(lineEdit, &QLineEdit::textChanged,label,  &QLabel::setText);
  • 使用仿函数作为信号的接收者:接收信号后的处理逻辑可以是全局函数、仿函数或者Lambda表达式。

2.5 信号与槽的断开连接

如果需要断开信号与槽的连接,只需将连接函数connect改为disconnect,并根据不同的连接方式提供相应的参数即可。

    void disconnectSlots() {QObject::disconnect(this, &MyWidget::customSignal, this, &MyWidget::customSlot);qDebug() << "信号与槽已断开";}

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

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

相关文章

【R语言】环境空间

一、环境空间的特点 环境空间是一种特殊类型的变量&#xff0c;它可以像其它变量一样被分配和操作&#xff0c;还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点&#xff1a; 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践&#xff0c;按重要程度分层说明&#xff1a; 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…

LabVIEW2025中文版软件安装包、工具包、安装教程下载

下载链接&#xff1a;LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安装图文教程》 1、解压后&#xff0c;双击install.exe安装 2、选中“我接受上述2条许可协议”&#xff0c;点击下一步 3、点击下一步&#xff0c;安装NI Packa…

BUU17 [RoarCTF 2019]Easy Calc1

自用 源代码 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…

Java并发编程笔记

Java并发基础知识补全 启动 启动线程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start 2、X implements Runnable&#xff1b;然后交给Thread运行 线程的状态 Java中线程的状态分为6种&#xff1a; 1. 初始(NEW)&#xff1a;新创建了一个线程对象&…

使用多模态大语言模型进行深度学习的图像、文本和语音数据增强

在过去的五年里&#xff0c;研究方向已从传统的机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;方法转向利用大语言模型&#xff08;LLMs&#xff09;&#xff0c;包括多模态方法&#xff0c;用于数据增强&#xff0c;以提高泛化能力&#xff0c;并在…

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中&#xff0c;了解并安装成功了Docker&#xff0c;本章讲述如何使用Docker拉取镜像。 使用Docker&#xff0c;主要是想要创建并运行Docker容器&#xff0c;而容器又要根据Docker镜像来创建&#xff0c;那么首当其冲&#xff0c;必须要先有一个…

Office/WPS接入DS等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐&#xff0c;怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌&#xff0c;手册确实比较详细但繁琐&#xff0c;如何快速知晓该部分信息&#xff0c;涛tao道长给你们说&#xff0c;简单得很&#xff0c;一般新入门的道友有所不知&#xff0c;往往后面…

告别手动操作!用Ansible user模块高效管理 Linux账户

在企业运维环境中&#xff0c;服务器的用户管理是一项基础但非常重要的任务。比如&#xff0c;当有新员工加入时&#xff0c;我们需要在多台服务器上为他们创建账户并分配合适的权限。而当员工离职或岗位发生变化时&#xff0c;我们也需要迅速禁用或删除他们的账户&#xff0c;…

ADC模数转换器概念函数及应用

ADC模数转换器概念函数及应用 文章目录 ADC模数转换器概念函数及应用1.ADC简介2.逐次逼近型ADC2.1逐次逼近型ADC2.2stm32逐次逼近型2.3ADC基本结构2.4十六个通道 3.规则组的4种转换模式3.1单次转换&#xff0c;非扫描模式3.2连续转换&#xff0c;非扫描模式3.3单次转换&#xf…

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的大语言模型&#xff08;LLM&#xff09;正在逐步渗透到传统硬件开发领域。在FPGA&#xff08;现场可编程门阵列&#xff09;和IC&#xff08;集成电路&#xff09;开发这一技术密集型行业中&#xff0c;DeepSeek凭借其…

【Elasticsearch】nested聚合

在 Elasticsearch 中&#xff0c;嵌套聚合&#xff08;nestedaggregation&#xff09;的语法形式用于对嵌套字段&#xff08;nestedfields&#xff09;进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型&#xff0c;用于存储数组中的对象&#xff0c;这些对象需要独…

【Uniapp-Vue3】创建DB schema数据表结构

右键uniCloud文件下的database文件&#xff0c;点击“新建DB schema”&#xff0c;选择模板&#xff0c;修改文件名&#xff0c;点击“创建” 创建完成后会出现对应的文件&#xff0c;进入该文件进行配置 对文件中的必填选项&#xff0c;用户权限&#xff0c;字段进行配置 其…

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索&#xff08;BFS&#xff09;是一种广泛应用于图论中的算法&#xff0c;常用于寻找最短路径、图的遍历等问题。与深度优先搜索&#xff08;DFS&…

蓝耘智算平台使用DeepSeek教程

目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点&#xff1a; 一.平台架构与技术特点 基于 Kubernetes 原…

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

基于STM32设计的仓库环境监测与预警系统

目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程&#xff0c;尤其是在制造业、食品业、医药业等行业&#xff0c;仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…

PbootCMS 修改跳转提示,修改笑脸时间

在使用时&#xff0c;每次都提示这个&#xff1a; 修改方法&#xff1a; 修改跳转时间&#xff1a;找到 handle.php 文件编辑 &#xff0c;调整 setTimeout 函数的时间参数。 修改提示文字&#xff1a;编辑 handle.php 文件&#xff0c;修改提示文字的内容。 隐藏提示页面&am…

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…