当前位置: 首页 > news >正文

Qt修仙之路2-1 仿QQ登入 法宝初成

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

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() << "信号与槽已断开";}

相关文章:

Qt修仙之路2-1 仿QQ登入 法宝初成

widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

DeepSeek-V3 论文解读:大语言模型领域的创新先锋与性能强者

论文链接&#xff1a;DeepSeek-V3 Technical Report 目录 一、引言二、模型架构&#xff1a;创新驱动性能提升&#xff08;一&#xff09;基本架构&#xff08;Basic Architecture&#xff09;&#xff08;二&#xff09;多令牌预测&#xff08;Multi-Token Prediction&#xf…...

配置#include “nlohmann/json.hpp“,用于处理json文件

#include “nlohmann/json.hpp” // 需要安装 nlohmann/json.hpp 头文件 using json = nlohmann::json; 下载链接:https://github.com/nlohmann/json/tree/develop 1.下载并解压:首先,需要从nlohmann/json的GitHub仓库下载源代码,并解压得到的文件。 地址: nlohmann/json…...

索引失效的14种常见场景

在 MySQL 中&#xff0c;索引有时可能会失效&#xff0c;导致查询性能下降。以下是常见的 14 种场景&#xff0c;在这些场景下&#xff0c;索引可能会失效 1. 使用 OR 连接多个条件 场景: 当查询中包含 OR 时&#xff0c;如果 OR 连接的多个条件中有一个没有使用索引&#xff0…...

解决com.kingbase8.util.KSQLException: This _connection has been closed.

问题描述 一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend.java.net.SocketTime…...

openAI官方prompt技巧(二)

1. 赋予 ChatGPT 角色 为 ChatGPT 指定一个角色&#xff0c;让其从特定的身份或视角回答问题。这有助于生成针对特定受众或场景的定制化回答。 例如&#xff1a; 你是一名数据分析师&#xff0c;负责我们的市场营销团队。请总结上个季度的营销活动表现&#xff0c;并强调与未…...

【非 root 用户下全局使用静态编译的 FFmpeg】

在非 root 用户下全局使用静态编译的 FFmpeg&#xff0c;可以按照以下方法操作&#xff1a; 1. 下载静态编译的 FFmpeg 如果你还没有下载静态编译的 FFmpeg&#xff0c;可以从官方网站获取&#xff1a; wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd6…...

【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言 本文主要介绍我最近开发的一个个人实战项目&#xff0c;“基于深度学习的人脸门禁 IPC 智能安防监控系统”&#xff0c;全程满帧流畅运行。这个项目我目前全网搜了一圈&#xff0c;还没发现有相关类型的开源项目。这个项目只要稍微改进下&#xff0c;就可以变成市面上目前…...

前端布局与交互实现技巧

前端布局与交互实现技巧 1. 保持盒子在中间位置 在网页设计中&#xff0c;经常需要将某个元素居中显示。以下是一种常见的实现方式&#xff1a; HTML 结构 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><m…...

idea 找不到或者无法加载主类

idea项目&#xff0c;之前一直是正常运行的&#xff0c;放假了之后再回来就遇到启动不了的问题。 WebApplication这个类右键运行的时候&#xff0c;也提示找不到主类。 对于这种之前运行没有问题&#xff0c;突然出问题的项目。 我的点是没有改动代码和数据的情况下项目就跑不起…...

Flink 调用海豚调度器 SQL 脚本实现1份SQL流批一体化的方案和可运行的代码实例

目录 一、流批一体化概述 二、Flink 与海豚调度器结合实现流批一体化的好处 2.1 代码复用性增强 2.2 开发和维护成本降低 2.3 数据一致性保证 2.4 提高系统的灵活性和可扩展性 三、实现思路步骤 3.1 环境准备 3.2 编写 SQL 脚本并上传到海豚调度器 3.3 实现资源下载功…...

ES6 Map 数据结构是用总结

1. Map 基本概念 Map 是 ES6 提供的新的数据结构&#xff0c;它类似于对象&#xff0c;但是"键"的范围不限于字符串&#xff0c;各种类型的值&#xff08;包括对象&#xff09;都可以当作键。Map 也可以跟踪键值对的原始插入顺序。 1.1 基本用法 // 创建一个空Map…...

go结构体详解

结构体简介 Golang 中没有“类”的概念&#xff0c;Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比&#xff0c;Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性&#xff0c;但是当我们想表达一…...

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…...

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…...

后台管理系统网页开发

CSS样式代码 /* 后台管理系统样式文件 */ #container{ width:100%; height:100%; /* background-color:antiquewhite;*/ display:flex;} /* 左侧导航区域:宽度300px*/ .left{ width:300px; height: 100%; background-color:#203453; display:flex; flex-direction:column; jus…...

使用一个大语言模型对另一个大语言模型进行“调教”

使用一个大语言模型对另一个大语言模型进行“调教”&#xff08;通常称为微调或适配&#xff09;&#xff0c;是一种常见的技术手段&#xff0c;用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法&#xff1a; 1.准备工作 安装必要的…...

golang使用sqlite3,开启wal模式,并发读写

因为sqlite是基于文件的&#xff0c;所以默认情况下&#xff0c;sqlite是不支持并发读写的&#xff0c;即写操作会阻塞其他操作&#xff0c;同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库&#xff0c;从sqlite3.7.0版本开始&#xff08;SQLite Release 3.…...

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…...

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …...

AI和大模型——拟合

一、拟合 Fitting,中文翻译成拟合&#xff0c;这个翻译还是比较贴切的。怎么理解拟合呢&#xff1f;其实非常好理解&#xff0c;如果接受过九年义务教育&#xff0c;基本都有极限或微积分的概念。有没有想起过积分中用高低不等的小矩形来拼凑出曲线面的面积&#xff0c;那个过程…...

从平面到立体:基于OpenLayers与Cesium的无缝地图维度切换实践

1. 二维与三维地图融合的必要性 在现代WebGIS开发中&#xff0c;单纯依赖二维地图已经难以满足用户对空间数据展示的需求。想象一下&#xff0c;当你查看一个城市规划系统时&#xff0c;平面地图能告诉你道路走向&#xff0c;但只有切换到三维视图才能直观看到建筑高度、地形起…...

Cursor Free VIP:如何一键突破AI编程助手使用限制?

Cursor Free VIP&#xff1a;如何一键突破AI编程助手使用限制&#xff1f; 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached …...

企业微信打卡数据API实战:用Java+FastJSON手把手教你拉取员工考勤记录

企业微信考勤数据集成实战&#xff1a;JavaFastJSON构建高可用API对接方案 考勤数据作为企业管理的重要基础数据&#xff0c;其自动化采集与处理能力直接影响人力资源管理的效率。企业微信作为国内主流的企业级通讯工具&#xff0c;其开放的打卡数据API为开发者提供了便捷的集成…...

MicroClaw:跨平台智能体运行时,统一AI助手部署与管理

1. 项目概述&#xff1a;一个跨平台的智能体运行时如果你曾经尝试过在不同的聊天平台上部署AI助手&#xff0c;比如在Telegram上搞一个&#xff0c;又在Discord上搞一个&#xff0c;你大概率会感到头疼。每个平台都有自己的一套API、认证方式和消息格式&#xff0c;这意味着你几…...

机箱机柜模块化设计方法

在机箱机柜制造领域&#xff0c;模块化设计正逐渐成为提升生产效率、降低成本、增强产品灵活性的关键方法。今天&#xff0c;我们就来深入探讨机箱机柜模块化设计方法&#xff0c;同时为大家推荐深圳市机汇五金制品有限公司&#xff08;以下简称“机汇五金”&#xff09;&#…...

APK Installer技术解析与实践指南:Windows平台安卓应用部署的革命性方案

APK Installer技术解析与实践指南&#xff1a;Windows平台安卓应用部署的革命性方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Windows系统上运行安卓应用一直是…...

基于Refine框架的企业级后台管理系统实战开发指南

1. 项目概述与核心价值最近在梳理企业内部后台管理系统的技术栈时&#xff0c;我又一次把目光投向了refine这个框架。如果你也和我一样&#xff0c;长期被各种业务后台的重复性开发工作所困扰——比如没完没了的增删改查&#xff08;CRUD&#xff09;界面、复杂的权限控制、数据…...

Skill Library:AI智能体技能库的模块化设计与工程实践

1. 项目概述&#xff1a;一个为AI智能体打造的“技能武器库”如果你和我一样&#xff0c;每天都在和Claude、ChatGPT、Cursor这些AI工具打交道&#xff0c;那你肯定也经历过这样的时刻&#xff1a;想让AI帮你写个复杂的SQL查询、设计一个微服务架构&#xff0c;或者起草一份产品…...

3分钟学会Xbox Game Pass存档提取:免费工具实现跨平台游戏进度迁移

3分钟学会Xbox Game Pass存档提取&#xff1a;免费工具实现跨平台游戏进度迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 作为游戏…...