信号槽【QT】

文章目录

  • 对象树
  • 字符集
  • 信号槽
  • QT坐标系
  • 信号与槽
    • connect
    • 自定义槽
    • 自定义信号
    • disconnect

对象树

#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
class MyLabel : public QLabel
{
public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWidget * parent);~MyLabel()  ;
};#endif // MYLABEL_H

上述代码,在 Qt 中不会产生内存泄露。

label 对象会在合适的时候被析构释放~~(虽然没有手动写 delete,确实能释放)

之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。

在这里插入图片描述

使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机 (窗口关闭/销毁)

把这些对象统一进行释放.

如果对象树的某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了

 #include "mylabel.h"
#include<iostream>
#include<QDebug>
MyLabel::MyLabel(QWidget * parent):QLabel(parent)
{}MyLabel::~MyLabel()
{//打印日志//会出现乱码//std::cout << "MyLabel 被销毁!" << std::endl;//QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。//直接使用 qDebug() 可以当做 cout来使用qDebug() << "MyLabel 被销毁!";
}

在这里插入图片描述

析构函数是执行了,虽然没有手动 delete,但是由于把 MyLabel 挂到了对象树上。此时窗口被销毁的时候,就会自动销毁对象树中的所有对象。MyLabel 的析构是执行了

解决乱码方案:
Qt 中提供了一个 qDebug() 工具,可以完成打印日志的过程。很好的处理字符编码

QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。
直接使用 qDebug() 这个东西就可以当做 cout 来使用。

使用 qDebug,打印的调试日志,是可以统一进行关闭的,qDebug 可以通过编译开关,来实现一键式关闭

字符集

出现乱码, 就是编码方式不匹配( 不局限于 C++)

如果字符串本身是 utf8 编码的,但是终端(控制台)是按照 gbk 的方式来解析显示的(拿着 utf8 这里的数值,去查询 gbk 的码表),就会出现乱码

用记事本方式来打开文件,将文件另存为,并查看文件字符集

在这里插入图片描述

显示的是 UTF-8,说明这个文件就是 UTF-8 编码

显示的是 ANSI,说明这个文件就是 GBK 编码

信号槽

Qt 中的 connect 是 QObject 这个类提供的静态函数。这个函数的作用就是 “连接信号和槽”

在 Qt Designer 中创建一个控件时,此时就会给这个控件分配一个 objectName 属性。这个属性的值,要求是在界面中得是唯一的(不能重复)

QPushButton :

qmake 在预处理 .ui 文件的时候,就会根据这里的 objectName 生成对应的 C++ 代码。C++ 代码中该 QPushButton 对象的变量名字就是这里的 objectName。这个变量就是 ui 属性中的成员变量。

widget.cpp文件中通过connect连接信号与槽函数

在这里插入图片描述

通过图形化界面的方式,实现的按钮版 hello world

此时按钮对象,不需要new , new 对象的操作已经是被 Qt 自动生成了
而且这个按钮对象,已经作为 ui 对象里的一个成员变量了。
也无需作为 Widget 的成员

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->myButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//获取文本是hello Worldif(ui->myButton->text()  == QString("hello World")){// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello qt");}//获取文本不是hello Worldelse{// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello World");}
}

widget.cpp

纯代码方式实现Hello World

纯代码版本:

myButton按钮对象是new 的
为了保证其他函数中能够访问到这个变量,就需要把myButton按钮对象设定为 Widget 类的成员变量

#include "widget.h"
#include "ui_widget.h"
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this) ;myButton->setText("hello world") ;//将信号与槽函数关联connect(ui->pushButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}
//槽函数void Widget::handleClick (){//检查myButton按钮的当前文本 是否为"hello world"if(myButton->text() == QString("hello world")){myButton->setText("hellp qt") ;}else{myButton->setText("hellp world") ; }}

QT坐标系

在这里插入图片描述

坐标系的原点 (0, 0) 就是屏幕的左上角 / 窗口的左上角

给 Qt 的某个控件,设置位置,就需要指定坐标。对于这个控件来说,坐标系原点就是相对于父窗口/控件的。

例如:

QPushButton 的父元素/父控件/父窗口 是 QWidget

在这里插入图片描述

QWidget 没有父元素 (NULL),就相当于父元素就是整个显示器桌面了~~

在这里插入图片描述

信号与槽

Qt 中,谈到信号,也是涉及到三个要素

信号源:由哪个控件发出的信号。

信号的类型:用户进行不同的操作,就可能触发不同的信号。

例如:点击按钮,触发点击信号。在输入框中移动光标,触发移动光标的信号。勾选一个复选框,选择一个下拉框,都会触发出不同的信号。

信号的处理方式:槽(slot),就是函数

Qt 中可以使用 connect 这样的函数,把一个信号和一个槽关联起来。后续只要信号触发了,Qt 就会自动的执行槽函数

槽函数,本质上也是一种"回调函数" (callback)

一定是先把信号的处理方式准备好,再触发信号

Qt 中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了

connect

connect,这个函数和 Linux 中TCP的socket 中建立连接的函数,没有任何关系,只是名字恰巧一样了。

connect是 QObject 提供的静态的成员函数。

在这里插入图片描述

connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection);

sender : 当前信号是哪个控件发出来的

signal : 信号的类型

receiver : 哪个对象(控件)负责处理

method: 这个对象如何处理 (要处理信号的对象提供的成员函数)

type : 很少使用,暂时不考虑

例如:

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton * button      = new QPushButton(this) ;button->setText("关闭") ;button->move(200,300);//close是QWidget内置的槽函数. Widget继承自QWidget,也就继承了QWidget的槽函数.//close:关闭当前的窗口/控件connect(button ,&QPushButton::clicked , this , &Widget::close) ;
}
Widget::~Widget()
{delete ui;
}

自定义槽

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置按钮//点击按钮就修改窗口标题QPushButton * button = new QPushButton (this) ;  //this,挂到对象树上button->setText("按钮");button->move(100,100); //移动坐标connect(button , &QPushButton::clicked , this , &Widget::handleClicked) ;}Widget::~Widget()
{delete ui;
}void Widget::handleClicked()
{//点击按钮就修改窗口标题setWindowTitle("按钮已经按下");}

自定义槽函数 ,用ui界面

在Qt 中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接

在这里插入图片描述

在这里插入图片描述

选择clicked() ,就会在widget.cpp 生成on_pushButton_clicked 函数的定义

在这里插入图片描述

在这里插入图片描述

​ 当函数名符合上述规则之后,Qt就能自动的把信号和槽给建立上联系

自定义信号

Qt 的信号,本质上也就是一个“函数”

Qt 5 以及更高版本中,槽函数和普通的成员函数之间,基本没有差别

但是信号,则是一类非常特殊的函数。

程序员只要写出函数声明,并且告诉 Qt,这是一个“信号”即可。

这个函数的定义,是 Qt 在编译过程中自动生成的。(自动生成的过程,程序员无法干预)

作为信号函数,这个函数的返回值,必须是void ,有没有参数都可以, 甚至也可以支持重载

signals : 是 Qt 自己扩展出来的关键字

qmake 的时候,调用一些代码的分析/生成工具,

扫描到类中包含signals 这个关键字的时候.此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义

widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定义信号   
signals:void  mysignal() ;//自定义槽函数
public slots: //qt5以上 ,public slots可以省略void handleMySignal() ; private:Ui::Widget *ui;
};
#endif // WIDGET_H

如何才能触发出自定义的信号呢?

Qt 内置的信号,不需要手动通过代码来触发

用户在 GUI,进行某些操作,就会自动触发对应信号。(发射信号的代码已经内置到 Qt 框架中了)

例:

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal()
{setWindowTitle("处理自定义信号");
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal();// 发出自定义的信号//emit可以省略
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定义信号
signals:void  mysignal() ;//自定义槽函数
public slots:void handleMySignal() ;//槽函数
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

信号和槽也可以带参数
当信号带有参数的时候,槽的参数必须和信号的参数一致~~
此时发射信号的时候,就可以给信号函数传递实参。与之对应的这个参数就会被传递到对应的槽函数中。

这里的参数类型必须要一致
个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多。

个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多 ,原因:

一个槽函数,有可能会绑定多个信号,如果我们严格要求参数个数一致,就意味着信号绑定到槽的要求就变高了。换而言之,当下这样的规则,就允许信号和槽之间的绑定更灵活了。更多的信号可以绑定到这个槽函数上了

例如:

参数类型必须要一致 ,个数一致

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text )
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2");// 发出自定义的信号
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定义信号
signals:void  mysignal(const QString &  text) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

参数类型必须要一致 ,信号的参数的个数必须要比槽的参数个数要更多

例如:

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text)
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1","");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2","");// 发出自定义的信号
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定义信号
signals:void  mysignal(const QString &  text,const QString & text2) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

Q_OBJECT:

Qt硬性规定:Qt中如果要让某个类能够使用信号槽(可以在类中定义信号和槽函数)

必须要在类最开始的地方,写下 Q_OBJECT 宏。

一个信号,可以 connect到多个槽函数上

一个槽函数,也可以被多个信号 connect

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
signals://自定义信号void mySignal1() ;void mySignal2() ;void mySignal3()  ;
public slots://自定义槽函数void mySlot1();void mySlot2();void mySlot3();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信号与槽函数 ,形成多对多的关系connect(this, &Widget::mySignal1, this, &Widget::mySlot1);connect(this, &Widget::mySignal1, this, &Widget::mySlot2);connect(this, &Widget::mySignal2, this, &Widget::mySlot1);connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
}Widget::~Widget()
{delete ui;
}void Widget::mySlot1()
{qDebug() << "mySlots1" ; 
}
void Widget::mySlot2()
{qDebug() << "mySlots2" ; 
}
void Widget::mySlot3()
{qDebug() << "mySlots3" ; 
}

disconnect

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots :void  handClick() ;
public slots :void handClicked2();
private slots:void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将信号与槽函数关联connect(ui->pushButton  ,& QPushButton::clicked, this , &Widget::handClick) ;
}Widget::~Widget()
{delete ui;
}void Widget::handClick()
{setWindowTitle("修改窗口的标题");qDebug() <<"handClick";
}void Widget::handClicked2()
{setWindowTitle("修改窗口的标题2");qDebug() <<"handClicked2";
}
void Widget::on_pushButton_2_clicked()
{//1、先断开pushButton 的信号槽disconnect(ui->pushButton ,&QPushButton::clicked, this, &Widget::handClick );//2、重新绑定信号槽connect(ui->pushButton ,&QPushButton::clicked, this , &Widget::handClicked2) ;
}

定义槽函数使用lambda

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置一个按钮,并将按钮移动位置QPushButton * button= new QPushButton(this) ;button->setText("按钮" ) ;button->move(200,200) ;//关联信号与槽函数//lambda就是槽函数connect(button ,&QPushButton::clicked , this ,[button,this](){qDebug()<<"lambda被执行了";button->move(500,500) ;this->move(500,500);} );}Widget::~Widget()
{delete ui;
}

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

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

相关文章

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…

400G/800G光模块崛起:AI时代的网络基础设施革命

随着AI技术的不断成熟&#xff0c;各行各业都在大规模投入AI。医疗行业通过AI技术实现了更精准的诊断和治疗&#xff1b;金融行业通过AI技术提高了风险管理能力&#xff1b;制造行业通过AI技术优化了生产流程&#xff1b;娱乐行业通过AI技术创造了更加丰富的用户体验。AI在医疗…

Dalsa线阵CCD相机使用开发手册

要使用Dalsa工业相机进行二次开发&#xff0c;看用户开发手册顺便做下笔记&#xff1a;&#xff08;欢迎加QQ讨论&#xff1a;77248031&#xff0c; 或QQ群&#xff1a;585068192&#xff09; 由于“本公主”用的.NET开发&#xff0c;软件支持只翻译了手册中.NET部分&#xff0…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

分布式系统架构:服务容错

1.为什么需要容错 分布式系统的本质是不可靠的&#xff0c;一个大的服务集群中&#xff0c;程序可能崩溃、节点可能宕机、网络可能中断&#xff0c;这些“意外情况”其实全部都在“意料之中”。故障的发生是必然的&#xff0c;所以需要设计一套健壮的容错机制来应对这些问题。 …

【Latex手册】自用

收录Latex使用文档/工具 个人使用时候的tips&#xff0c;仅供个人使用 核心网页&#xff1a;LaTeX 工作室 【1】首页 | LaTeX 知识库 &#xff08;有详细的入门教程&#xff09; 【2】LaTeX工作室 - LaTeX工作室&#xff08;一些模板&#xff09; 【3】LaTeX 工作室 &…

Pytorch应用实战(1)- 基于YOLO的视频人脸马赛克处理

免费链接: Blogger(需翻Q), Github 文章目录 本文介绍给图片的人脸打码给视频的人脸打码本文介绍 YoloV11(Github)提供了非常方便的API帮助用户实现目标检测(detect)、语义分割(segement)、肢体识别(Pose)等功能。 本文将基于YoloV11的目标检测来实现一个视频人脸马…

[IT项目管理]九.项目质量管理

九&#xff0e;项目质量管理 9.1项目质量管理的重要性 对于很多IT项目的差劲&#xff0c;大多数人只可以忍受。项目质量管理是IT项目管理的重要组成部分&#xff0c;对于提高项目成功率、降低项目成本、提升客户满意度至关重要。尽管很多人对IT项目的质量问题感到无奈&#x…

【Threejs】从零开始(六)--GUI调试开发3D效果

请先完成前置步骤再进行下面操作&#xff1a;【Threejs】从零开始&#xff08;一&#xff09;--创建threejs应用-CSDN博客 一.GUI界面概述 GUI&#xff08;Graphical User Interface&#xff09;指的是图形化用户界面&#xff0c;广泛用在各种程序的上位机&#xff0c;能够通过…

ffmpeg-SDL显示BMP

效果图如下 本文主要将我们通过创建窗口、渲染上下文工具、纹理工具、矩形框工具&#xff1b;其需要主要的是&#xff1a;首先我们在显示BMP时&#xff0c;需要先创建好窗口&#xff0c;再使用渲染工具对窗口进行格式刷&#xff0c;使用纹理工具和渲染工具配合进行BMP图片显示…

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画&#xff0c;但是有很多是多音轨视频但是默认的都是日语&#xff0c;电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步&#xff0c;先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目&#xff0c;包含了处理视频的…

基础二分查找总结题-单峰序列2类做法

&#x1f330;单峰序列题目描述 晴问算法 题目描述&#xff1a; 单峰序列是指&#xff0c;在这个序列中存在一个位置&#xff0c;满足这个位置的左侧&#xff08;含该位置&#xff09;是严格递增的、右侧&#xff08;含该位置&#xff09;是严格递减的&#xff0c;这个位置被…

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用&#xff08;以后的重点&#xff09; 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…

Vue3 重置ref或者reactive属性值

需要重新定义一个对象绑定复制给原对象 。 实例代码: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置对象值 const reset()>{Object.assign(formData, data()…

C#速成(GID+图形编程)

常用类 类说明Brush填充图形形状,画刷GraphicsGDI绘图画面&#xff0c;无法继承Pen定义绘制的对象直线等&#xff08;颜色&#xff0c;粗细&#xff09;Font定义文本格式&#xff08;字体&#xff0c;字号&#xff09; 常用结构 结构说明Color颜色Point在平面中定义点Rectan…

vue iframe进行父子页面通信并切换URL

使用通义千问提问后得到一个很好的示例。 需求是2个项目需要使用同一个面包屑进行跳转&#xff0c;其中一个是iframe所在的项目&#xff0c;另一个需要通过地址访问。通过 window.parent.postMessage &#xff0c;帮助 <iframe> 内嵌入的子页面和其父页面之间进行跨域通…

谁说C比C++快?

看到这个问题&#xff0c;我我得说&#xff1a;这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子&#xff1a; // C风格 char* str (char*)malloc(100…

【ADS射频电路学习笔记】1. ADS基本操作

下面介绍ADS中主要仿真器的使用 1. 直流仿真 直流仿真器在控制面板的simulator-dc 直流仿真器 但是ADS自带有很多仿真器&#xff0c;可以直接来调用 选用晶体管电流扫描的模板 就可以输出模板 然后调入晶体管模型 然后要设置扫描的电压&#xff0c;选择dc仿真器对vds进行扫描…

CSS学习记录12

CSS浮动 CSSfloat属性规定元素如何浮动 CSSclear属性规定哪些元素可以在清除的元素旁边以及在哪一侧浮动。 float属性 float属性用于定位和格式化内容&#xff0c;例如让图像向左浮动到容器的文本那里。 float属性可以设置以下值之一&#xff1a; left - 元素浮动到其容器…

Chinese-Clip实现以文搜图和以图搜图(transformers版)

本文不生产技术&#xff0c;只做技术的搬运工&#xff01; 前言 作者昨天使用cn_clip库实现了一版&#xff0c;但是觉得大家复现配置环境可能有点复杂&#xff0c;因此有使用transformers库实现了一版&#xff0c;提供大家选择&#xff0c;第一篇参考链接如下&#xff1a; Ch…