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提供了findChild
和findChildren
方法,通过这两个方法,可以按名称或类型查找子对象。另外,使用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 炼丹初成
widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue宠物预约上门服务预约平台
开题报告 本研究论文旨在构建并阐述一个基于 SpringBoot 和 Vue 技术栈开发的宠物上门服务预约平台的设计与实现。该平台集成了丰富的功能模块,为用户提供一体化的便捷服务体验。首先,用户能够通过注册并登录系统,享受个性化的服务流程。在平…...
无线AP之详解(Detailed Explanation of Wireless AP)
无线AP是什么? 市场上的AP基本上分为两大类:单纯型AP和扩展型AP。扩展型AP除了基本的AP功能之外,还可能带有若干以太网交换口、路由、NAT、DHCP、打印服务器等功能。 无线AP也就是一个无线交换机 无线路由器就是一个带路由功能的无线AP&am…...
Spring Boot Actuator与JMX集成实战
在微服务架构中,监控和管理应用的运行状态是至关重要的。Spring Boot Actuator 提供了一种便捷的方式来监控和管理 Spring Boot 应用,而 JMX(Java Management Extensions)则是一种用于管理 Java 应用的标准技术。本文将通过一个实…...

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署
春节期间,deepseek迅速火爆全网,然后回来上班,我就浅浅的学习一下,然后这里总结一下,我学习中,总结的一些知识点吧,分享给大家。具体的深度安装部署,这里不做赘述,因为网…...

camera光心检测算法
1.概要 光心检测算法,基于opencv c实现,便于模组厂快速集成到软件工具中,适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度,便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…...
【MySQL】向后兼容设计规范(无回滚场景)
MySQL 向后兼容设计规范(无回滚场景) 在 不支持数据库回滚 且需保证 长期向后兼容性 的系统中,需通过 架构设计 和 流程管控 规避风险。以下是关键设计规范: 一、变更流程规范 变更分类分级 变更类型风险评估等级审批流程测试要求…...

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!
1.stm32启动 1.1 msp和pc的初始值,第一步: 2.boot的值就被锁定了 可以根据实际绑定的值变动, 这里补充一点boot1和0的原理: 1.2来点刺激的: 这里我插入一个链接: 【明解STM32】一文搞明白STM32芯片存储…...

无界构建微前端?NO!NO!NO!多系统融合思路!
文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…...

DeepSeek辅助段落扩写的能力怎么样?
DeepSeek-R1在学术写作的诸多细节层面展现出了显著的应用价值。接下来我们将通过一系列具体案例,深入探讨该工具如何在扩写、翻译、发表以及内容改进等关键环节为学术写作提供有力支持。在提问环节,DeepSeek-R1能够高效地简化提示词,并精准地…...

分形的魅力:数学与艺术的完美结合
分形的魅力:数学与艺术的完美结合 分形(Fractal)是一种神奇的数学结构,它以其无限的复杂性和自相似性吸引了无数科学家、艺术家和数学爱好者。分形不仅仅是数学中的一个概念,它还广泛应用于自然科学、计算机图形学和艺…...

如何通过工业智能网关进行数控机床数据采集?
数控机床数据采集过程是一个从物理连接到数据处理的完整链条,涉及设备连接、数据采集、预处理和传输的复杂过程,包含通信协议匹配、设备配置、数据采集设置、数据预处理和传输等多个环节。天拓四方自主研发的TDE工业智能网关作为这一过程中的核心设备&am…...

水波效果
水波效果指在计算机图形学中模拟水面波纹的视觉效果,通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感,比如水的波动、反射、折射、透明等,可以让人感觉像真实的水一样流动闪耀。 核心特点就是: 动态波纹光学特…...

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案
随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...

【重新认识C语言----结构体篇】
目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体? 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…...

#渗透测试#批量漏洞挖掘#Splunk Enterprise for Windows 任意文件读取漏洞( CVE-2024-36991)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
苹果公司宣布正式开源 Xcode 引擎 Swift Build145
2025 年 2 月 1 日,苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言,用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生:2014 年,苹果在全球…...

7.list
本篇博客梳理C的STL中的list容器 一、list的基本结构与使用 1.list的介绍 list的底层是带头循环双向链表 带头:含哨兵位 循环:尾节点的next指针指向哨兵位 双向:每个节点具有两个指针域,一个指针指向前一个结点 2…...

Qt+海康虚拟相机的调试
做机器视觉项目的时候,在没有相机或需要把现场采集的图片在本地跑一下做测试时,可以使用海康的虚拟相机调试。以下是设置步骤: 1.安装好海康MVS软件,在菜单栏->工具选择虚拟相机工具,如下图: 2.打开虚拟…...
数据库基础练习4(有关索引,视图完整解答)
建立需要的表 学生表 mysql> create table studnet(sno int primary key auto_increment,sname varchar(30) not null unique,ssex varchar(2) check (ssex男 or ssex女) not null ,sage int not null,sdept varchar(10) default 计算机 not null); Query OK, 0 rows affe…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...