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

QT的信号与槽

QT的信号与槽


文章目录

  • QT的信号与槽
  • 前言
  • 一、QT 打印"hello QT"的dome
  • 二、信号和槽机制?
  • 二、信号与槽的用法
    • 1、QT5的方式
      • 1. 无参的信号与槽的dome
      • 2.带参的信号与槽dome
    • 2、QT4的方式
    • 3、C++11的语法 Lambda表达式
      • 1、函数对象参数
      • 2、操作符重载函数参数
      • 3、可修改标示符
      • 4、错误抛出标示符
      • 5、函数返回值
      • 6、是函数体
    • 4.信号与槽的总结
    • 5.信号与槽的扩展
    • 6. 总结


前言

Qt的信号与槽是控件与控件进行交互的方式。是QT中比较重要的内容。


一、QT 打印"hello QT"的dome

#include <QApplication>
#include <QWidget>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;/* 创建一个窗口对象 创建对象会自动调用构造函数 */w.show(); /* 显示窗口 */w.setWindowTitle("hello QT"); /* 设置窗口标题 */return a.exec(); /* 一个程序能程序运行 一般都会用死循环 这里相当于while(1) 同时让程序一直执行,等待用户操作。等待事件的发生 比如鼠标,键盘事件*/
}

现在的操作都在主函数里操作如果代码一多就有点不合适了。在QWidget w 语句会自动调用QWidget的构造函数。放在构造里实现。后面所有的子控件都以这个窗口为中心来扩展。

下面在窗口里添加按钮控件。

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{Q_OBJECT
public:MainWidget(QWidget *parent = 0);~MainWidget();
private:QPushButton b1;  /* 在窗口类里定义按钮对象 */QPushButton *b2; /* 在窗口类里定义指针按钮对象 */
};
#endif // MAINWIDGET_H

mainwidget.cpp

MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{b1.setParent(this);b1.setText("按钮1");b1.move(100, 100); /* 移动按钮的位置 默认0,0 */b2 = new QPushButton(this);b2->setText("按钮2");this->resize(400, 300); /* 设置窗口的大小 */
}

如上代码按钮有指定父对象。
指定父对象的两个方法:

  1. setParent(指定的父对象) b1.setParent(this)
  2. 调用构造函数是指定 b2 = new QPushButton(this)
    this就是当前窗口对象(MainWidget的对象)。

指定父对象的好处:

  1. Qt有一个机制就是指定父对象后不需要手动释放 new过的内存。
  2. 指定父对象后跟随父对象显示,不需要手动显示。

总结:要理解一个类的对象的创建过程才能更好的理解程序的执行顺序。(很重要)
当在一个类的成员中有类类型的成员变量指针时,在构造函数里申请空间。比如上面的 b2 = new QPushButton(this);

二、信号和槽机制?

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个点击信号(signal)。这种发出是没有目的的,类似广播。(任何控件都可以接收这个信号)如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。)

二、信号与槽的用法

首先信号与槽函数的连接都是通过connect函数来实现。总共有三种用法

1、QT5的方式

connect(&b1, &QPushButton::pressed, this, &MainWidget::close) /* b1按钮按下信号触发 窗口接收后关闭窗口  */

connect的参数
参数1:信号的发送者(指针类型)
参数2:信号 具体用法 &发送者类名::信号名
参数3:接收者(指针类型)
参数4:接受者接收到这个信号的处理 具体用法: &接收者类名::槽函数名
参数5:网络模块需要用到,这里先不介绍。

总结:上面的信号与槽都是系统的(系统已经定义好的)通过帮助文档就可以查找到。当然也可以自定义的。

1. 无参的信号与槽的dome

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = nullptr);~MainWidget();
signals:void signal_1(); /* 自定义一个信号 */public slots:void slot_Print(); /* 自定义槽函数 */void slot_cf();private:QPushButton *button;
};
#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
#include <QDebug>MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{button = new QPushButton(this);button->setText("确定");button->move(100, 100);connect(button, &QPushButton::pressed, this, &MainWidget::slot_cf);connect(this, &MainWidget::signal_1, this, &MainWidget::slot_Print);
}MainWidget::~MainWidget()
{
}void MainWidget::slot_Print()
{qDebug()<< "接收到信号";
}void MainWidget::slot_cf()
{emit signal_1();
}

总结:自定义一个信号与自定义两个槽函数。按钮按下信号触发一个槽 slot_cf。接着在槽里发送自定义信号。接着触发另一个槽slot_Print打印 “接收到信号”。可以看到信号与槽都是没有参数的。

2.带参的信号与槽dome

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = nullptr);~MainWidget();
signals:void signal_1(); /* 自定义一个信号 */void signal_1(int data, QString str); /* 带参自定义一个信号 */public slots:void slot_Print(); /* 自定义槽函数 */void slot_Print(int data, QString str); /* 带参自定义槽函数 */void slot_cf();void slot_cf_1();private:QPushButton *button;QPushButton *button_1;
};
#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
#include <QtDebug>MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{button = new QPushButton(this);button->setText("信号1");button->move(100, 100);button_1 = new QPushButton(this);button_1->setText("信号2");button_1->move(200, 200);connect(button, &QPushButton::pressed, this, &MainWidget::slot_cf);connect(button_1, &QPushButton::pressed, this, &MainWidget::slot_cf_1);/* 信号的函数指针 */void (MainWidget::*funSignal_1)() = &MainWidget::signal_1;void (MainWidget::*funSignal_2)(int, QString) = &MainWidget::signal_1;/* 槽的函数指针 *//* 因为信号与槽函数都可以函数重载 要用函数指针来区分 *//* slot_Print(int data, QString str) 与 slot_Print() 如果不用槽函数就不知道调用有参的还是无参的slot_Print */void (MainWidget::*funSlot_1)() = &MainWidget::slot_Print;void (MainWidget::*funSlot_2)(int, QString) = &MainWidget::slot_Print;connect(this, funSignal_1, this, funSlot_1);connect(this, funSignal_2, this, funSlot_2);
}MainWidget::~MainWidget()
{
}void MainWidget::slot_Print()
{qDebug()<< "接收到信号";
}void MainWidget::slot_Print(int data, QString str)
{qDebug()<< data << str;
}void MainWidget::slot_cf()
{emit signal_1();
}void MainWidget::slot_cf_1()
{emit signal_1(77, "mike");
}

总结:自定义带参的信号与槽。
按键1: 按下调用 slot_Print(int data, QString str) 所以最后对应槽打印的值是77 与 mike。
按键2:按下调用slot_Print()

由于信号与槽都可以函数重载(带参的与无参的信号与槽会函数名一样)在connect里会不知道调用哪一个。所以用到了函数重载。
否则会报如下错误:

error: no matching function for call to 'MainWidget::connect(MainWidget, , MainWidget*, )’
没有匹配的函数用于调用“mainwidget::connect(mainwidget*,<未解析的重载函数类型>,mainwidget*,<已解析的重载功能类型>)”*

2、QT4的方式

QT4的信号与槽是用两个宏来修饰:SIGNAL SLOT。

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = nullptr);~MainWidget();
signals:void signal_1(); /* 自定义一个信号 */public slots:void slot_Print(); /* 自定义槽函数 */void slot_cf();private:QPushButton *button;
};
#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
#include <QDebug>MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{button = new QPushButton(this);button->setText("确定");button->move(100, 100);connect(button, SIGNAL(pressed()), this, SLOT(slot_cf()));connect(this, SIGNAL(signal_1()), this, SLOT(slot_Print()));
}MainWidget::~MainWidget()
{
}void MainWidget::slot_Print()
{qDebug()<< "接收到信号";
}void MainWidget::slot_cf()
{emit signal_1();
}

总结:功能跟QT5无参的信号与槽的功能一样。只是connect用QT4来实现。
QT4的注意事项:
1. 信号与槽必须有signals与slots来修饰。如果是槽还要在slots加上修饰符。
2. 如果是带参的信号与槽在SIGNAL里与SLOT里信号与槽不能包含任何的变量名。只能有类型。
3. SIGNAL与SLOT要配套使用。
4. SIGNAL与SLOT是把信号与槽直接转为字符串。如果信号与槽的名字写错。是没有编译错误的。只有在运行时报错。这无疑增加程序员的负担。

3、C++11的语法 Lambda表达式

Lambda表达式是匿名槽函数。C++11的新特性。配合QT的信号一起使用非常方便。
用法:
connect(发送者,&发送者类名::信号,
[ ] ()
{
};

在这里插入图片描述
[ 函数对象参数 ] (操作符重载函数参数) mutable或exception ->返回值{函数体}
下面重点介绍上面六部分

1、函数对象参数

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

2、操作符重载函数参数

()中接收信号的参数,跟信号的函数原型一致。
在这里插入图片描述

3、可修改标示符

在这里插入图片描述

4、错误抛出标示符

在这里插入图片描述

5、函数返回值

在这里插入图片描述

6、是函数体

在这里插入图片描述
Lambda的dome:

#include "mainwidget.h"
#include <QDebug>
MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{button = new QPushButton(this);button->setText("确定");button->move(100, 100);/* 简单的Lambda表达式 */connect(button, &QPushButton::pressed,[=](){qDebug() << "信号";});
}

4.信号与槽的总结

信号与槽的用法有三种:建议优先用QT5的与Lambda表达式的。
信号注意点:
1、信号必须在类中声明并且加sigals关键字 没有定义也无返回值。
2、两个同名的信号可以函数重载。用函数指针来区分。
3、发送信号用emit 关键字

槽函数注意点:
1、函数名相同可以重载。用函数指针来区分。
2、函数可以是任意的成员函数,普通函数全局函数、静态函数。
3、槽函数要与信号一致。没有返回值。
在这里插入图片描述

5.信号与槽的扩展

在这里插入图片描述
第三点就是信号的扩散

6. 总结

主要介绍了QT中信号与槽的各种用法以及信号与的槽的注意事项。

相关文章:

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制&#xff1f;二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…...

Python 为UnityAndroid端自动化接入Tradplus广告SDK

Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…...

Matplotlib基础

目录&#xff1a; 一、绘制yx^2图像&#xff1a; 一、绘制yx^2图像&#xff1a; from matplotlib import pyplot as plt import numpy as np #生成&#xff08;-50,50&#xff09;的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…...

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告 招标&#xff5c;招标公告 上海市|闵行区 项目编号&#xff1a;0773-2340GNSHFWCS2823 招标单位&#xff1a;上海东海职业技术学院 代理单位&#xff1a;中金招标有限责任公司 预算金额&#xff1a;59万元 联系方式&…...

c语言之将输入的十进制转换成二进制数并打印原码反码补码

十进制转二进制 首先&#xff0c;我们要知道的是十进制转换成二进制数的方法。我们一般采用的除二取余的方法&#xff0c;在这里我用32位数组来进行转换。 int main() {printf("请输入一个十进制数\n");int n 0;scanf("%d", &n);int arr[32];int* p…...

算法题明明的随机数

第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数&#xff0c;代表明明生成的随机数。 具体格式可以参考下面的"示例"。 import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; // 注意类名必须为 Main, 不要有任何 pa…...

B站不赚钱、“芒果”赚钱难,视频“后浪”火拼跨年夜

又是一年跨年时。 各大视频平台跨年晚会展开火拼&#xff0c;今年谁是赢家&#xff1f; 作为视频“后浪”&#xff0c;芒果超媒&#xff08;300413.SZ&#xff09;、哔哩哔哩&#xff08;09626.HK&#xff0c;下称“B站”&#xff09;此前相继公布了2023年三季报&#xff0c;…...

ajax请求的详细流程+详细示例

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步 Web 应用程序的技术。下面是 AJAX 请求的详细流程&#xff1a; 创建 XMLHttpRequest 对象&#xff1a;在 JavaScript 代码中&#xff0c;使用 new XMLHttpRequest() 创建一个 XMLHttpRequest 对…...

这些产品手册制作工具,你都值得收藏

产品手册是企业向消费者传达产品信息的重要媒介&#xff0c;它能够直接影响消费者对产品的了解和购买决策。然而&#xff0c;制作一份专业而吸引人的产品手册并非易事&#xff0c;需要一定的设计和排版能力。为了帮助企业和个人更轻松地制作出优质的产品手册&#xff0c;下面将…...

跨账号和同账号的ECS云服务器之间迁移教程

阿里云ECS实例间迁移场景如下&#xff1a; 场景一&#xff1a;跨账号ECS实例间迁移 此场景适用于跨账号&#xff0c;同地域或者跨地域下的ECS实例间的迁移。例如&#xff1a;将阿里云账号A下的ECS实例&#xff0c;迁移阿里云B账号下。 场景二&#xff1a;同账号ECS实例间迁移 …...

python virtualenv 虚拟环境命令

# 安装 virtualenv pip3.9 install virtualenv # 创建虚拟环境test mkdir /envs # 创建一个文件夹放置虚拟环境 cd /envs/ virtualenv /envs/test # --pythonpython3.9 # 激活虚拟环境test source /envs/test/bin/activate # 安装依…...

深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快&#xff1f;什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…...

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…...

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…...

分布式定时任务Xxl_Job详细使用手册

看了很多网上的版本&#xff0c;思路描述的都不是很清晰&#xff0c;都只是几步操作就完成了&#xff0c;看效果&#xff0c;导致容易走入弯路&#xff08;不排除是自己理解能力把&#xff09;&#xff0c;最开始以为是把admin模块集成到项目&#xff0c;后来测试了会&#xff…...

【PostgreSQL】表操作-修改表

【PostgreSQL】表操作快速链接 创建表及基础表命令 修改表 表权限 添加列 ALTER TABLE products ADD COLUMN description text;新列最初填充给定的任何默认值DEFAULT&#xff08;如果未指定子句&#xff0c;则为 null&#xff09;。 注意&#xff1a; 从 PostgreSQL 11 开始…...

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …...

docker-compose 安装 RocketMq

目录 1、rocketMq 官网 2、工作流程 RocketMQ集群工作流程​ 1. 启动NameServer​ 2. 启动 Broker​ 3. 创建 Topic​...

【心得】PHP反序列化高级利用(phar|session)个人笔记

目录 ①phar反序列化 ②session反序列化 ①phar反序列化 phar 认为是java的jar包 calc.exe phar能干什么 多个php合并为独立压缩包&#xff0c;不解压就能执行里面的php文件&#xff0c;支持web服务器和命令行 phar协议 phar://xxx.phar $phar->setmetadata($h); m…...

MyBatisPlus之增删改查

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 MyBatisPlus之增删改查 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是Mybati…...

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…...

blob文件流前端显示pdf

首先请求需要修改 responseType: ‘blob’, 需要修改 请求头 {responseType: blob,url: url,method: get,}三种方法&#xff1a; 1.直接处理&#xff0c;在新页面打开 const blob new Blob([data],{ type:application/pdf }) let url window.URL.createObjectURL(blob) wi…...

Android 接入第三方数数科技平台

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数数科技平台是什么&#xff1f;二、使用步骤1.集成SDK2. 初始化3. 发送事件和设置账号id4. 验证发送事件是否成功 小结 前言 一个成熟的App必然不可缺少对…...

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…...

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

C语言——格式说明符前面加修饰符

在C语言中&#xff0c;格式说明符前面可以添加一些修饰符来控制输出或输入的格式&#xff0c;主要包括宽度、精度、左对齐标志和前缀填充字符等。 1. 宽度&#xff08;Width&#xff09; %[width]type&#xff1a;这里的width是一个非负整数&#xff0c;表示输出字段的最小宽度…...

实验室(检验科)信息系统LIS源码,客户端:WPF+Windows Forms

lis系统源码&#xff0c;医学检验信息系统源码 LIS系统&#xff08;Laboratory Information System&#xff09;即实验室&#xff08;检验科&#xff09;信息系统&#xff0c;它将检验仪器付出的检验数据与相关信息接入计算机网络系统中&#xff0c;让患者、实验室、临床科室、…...

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…...

uni-app API接口扩展组件(uni-ui)

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

信息化和数字化的本质区别是什么?

信息化和数字化是两个概念的区别 它们有什么区别和联系呢&#xff1f;信息化&#xff1a;“业务数据化”&#xff0c;先让业务流程能被数据记录下来。信息化“业务数据化”。数字化&#xff1a;“数据业务化”&#xff0c;用已累积的业务数据去反哺优化业务流程。数字化“数据…...

新会住房建设局网站/举例网络营销的例子

零散知识 主存与cache地址映像有 直接映像、全相连映像、组相连映像 三种方式DMA的三种工作方式为 CPU暂停工作方式、CPU周期窃取工作方式、直接访问存储器工作方式奇偶校验码 是一种开销最小&#xff0c;能发现数据代码中的一位出错情况的编码三层次存储系统包括&#xff1a…...

安卓系统上怎样做网站前端开发/营销的方法和技巧

//查看公钥openssl pkcs7 -inform DER -in android_.rsa -noout -print_certs -text//查看证书指纹keytool -printcert -file cert.rsa转载于:https://www.cnblogs.com/littlefishxu/p/3969198.html...

达州网站建设qinsanw/郑州网络营销公司哪个好

这个 Python 库 Text2Human 仅通过提供有关性别和衣服的文本描述来生成一个人的图像。 原始数据集 DeepFashion-MultiModal,具有丰富多模态注释的大规模高质量人体数据集。它具有以下属性: 总共有44,096张高分辨率人体照片,12,701张全身图像。 我们为每张完整的人体图片手…...

学校网站建设管理相关规定/抖音怎么推广

MySQL是一种关系数据库管理系统&#xff0c;关系数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策&#xff0c…...

更改wordpress密码/网站打开

基本CSS选择器有标记选择器、类别选择器、ID选择器3种1。标记选择器 每一种HTML标记的名称都可以作为相应的标记选择器的名称&#xff0c;如h1,p,等等2。类别选择器 类别选择器的名称可以由用户自定义 格式如下&#xff1a;.class{color:green;font-size:20px;}3。ID选…...

网站宣传单模板/无代码免费web开发平台

今天好像有同学因为用了宝塔 所以mqtt不能连接了...