Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

2023-11-19

目录

1、Qt 与 Qt Creator简介:

2、关于引用头文件的一些事儿: 

3、信号(Signal)与槽(Slot)机制:

3.1、一个小例子: 

4、自定义信号与槽: 

4.1、运行效果:

5、信号与槽的特性: 

6、Qt 4 版本以前 connect 用法:

7、使用 Lambda 表达式建立连接:


1、Qt 与 Qt Creator简介:

Qt

        Qt (官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库主要用来开发图形用户界面 (Graphical User Interface,GUI) 程序,当然也可以开发不带界面的命令行 (Command-Line Interface,CLI) 程序。
        Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要。当然 Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。
        Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone,嵌入式系统 QNXVxWorks 等等。

        (简介来自http://c.biancheng.net/view/1792.html,里面还提供了 Qt 下载安装教程)

Qt Creator

        除此以外,就像使用 Visual Studio 集成开发环境来创建Windows平台下的 Winform / WPF 应用程序一样;我们也需要一个类似的软件来创建基于 Qt 的应用程序。这个软件就是 Qt Creator

        Qt Creator是跨平台的集成开发环境(IDE),可在Windows、Linux和macOS桌面操作系统上运行,并允许开发人员在桌面、移动和嵌入式平台创建应用程序。

2、关于引用头文件的一些事儿: 

以引用 QDebug 类为例,这里我偷懒贴一段 ChatGPT 的回答: 

3、信号(Signal)与槽(Slot)机制:

  • 信号(Signal):用于反映某件事情发生了,比如 QPushButton 的 clickedpressedreleasedtoggled 等信号。本质是个特殊的成员函数声明
    • QPushButton 就是 Qt 中的按钮控件
  • (Slot):信号处理槽函数,用于响应信号;

        信号与槽之间是一种松散耦合的关系,信号 发送端 和 接收端 本身是没有关联的;但我们可以通过 connect 方法绑定 信号 与对应的 槽函数 : 

connect( 信号发送者sender,发出的信号signal,信号接收者receiver,信号处理slot(槽))

        比如我们点击窗口右上角的 "×" 按钮,窗口就关闭了。在这里面:"×" 按钮即信号发送者;"点击" 即那个具体的信号;"窗口" 即信号接收者;"关闭窗口" 函数即信号处理槽函数

        下面是一个真实使用 connect 方法的 C++ 代码语句,仅供参考:

connect( myTestBtn, &QPushButton::clicked, this, &QWidget::close );

3.1、一个小例子: 

        下面,我将举一个生活中的例子帮助大家更好地理解 信号。不过,其实通过上面的叙述,我相信大部分小伙伴对信号与槽的概念已经非常清晰明朗了;而且,我自己也认为下面这个例子有些小题大做了。所以,这一小节的内容大家酌情跳过!

        在短跑比赛中,我们都知道鸣枪是比赛开始的信号。下面是第一个问题:

                “谁是信号的发送者?裁判还是裁判手上的那把枪?别往下看先思考一下!” 

        以生活常识的角度来看,我认为发送者应该是裁判。因为显然枪是没法主导自己应该什么时候发射的,而且枪也不能自主发射信号弹,是裁判去扣动扳机发射的,信号的发出是由人来主导的。就像我经常在电视上听到那些体育竞赛的解说员说:“裁判发出了比赛结束的信号,本场比赛的胜者是谁谁谁”,可能以常识来说,大部分人会认为裁判是信号的发送者。

        然而计算机是“叛逆”且“纯粹”的。在计算机的世界里,谁能发出信号,谁就是信号的发送者,就这么简单。既然"枪响"是信号,那裁判本身能发出枪响吗?不能。只有枪才能发出枪响嘛,所以信号的发送者是枪而不是手握信号枪扣动扳机的裁判。就像我们点击窗口右上角的 "×" 按钮,窗口就关闭了,信号的发送者是 "×" 按钮而不是手握鼠标点击按钮的我们。

        这一点明了后,关于这个例子中,信号 是“鸣枪”或者说是“枪响”应该能理解就不多做解释了。接下来是第二个问题:

                “上面我们提到信号用于反映某件事情发生了,那这个例子中信号反映了什么事情发生了呢?是反映 "扣动扳机,发射信号弹" 这件事发生了还是反映 "短跑比赛开始了" 这件事发生了?还是先思考一下!

        我认为,应该是反映 "扣动扳机,发射信号弹" 这件事发生了。因为 “鸣枪” 可能只是发生在在一个普通的早晨,发生在观众们还在家中休息、运动员还在场馆训练的时候,裁判只是从仓库里拿出这把信号枪来,朝天扣动扳机 “鸣枪” 以试试信号枪还好不好用,以免正式比赛出岔子。这个时候“鸣枪”显然不能说是在反映 "短跑比赛开始了" 这件事发生了。事实上,我们现在就可以把 "短跑比赛开始了" 理解为槽函数了,因为短跑比赛一开始,运动员就起跑;而运动员起跑,就是在响应 “鸣枪” 信号;而响应处理信号的,那就是槽函数嘛。所以,“鸣枪” 就是纯粹地反映 "开枪了" 这件事儿发生了,而 "短跑比赛开始"/"运动员起跑" 就可以称之为信号处理槽函数,它们之间没有任何关联。这就像 Qt 中 QPushButton 按钮的 clicked 信号就是反映 "点击按钮" 这件事儿发生了,和 "关闭窗口" 没有任何关系。这就是上面提到的 —— 信号与槽之间是一种松散耦合的关系,信号 发送端 和 接收端 本身是没有关联的

        真正将 “鸣枪” 与 “短跑比赛开始” 建立起联系来的,就是正式比赛那天,观众们走出家门、来到场馆,运动员结束训练、站在起跑线,裁判到场就位、整装待发之时,所有人都心知肚明 —— “枪一响,比赛就开始!”,这个时候,它们就建立起联系了。而在 Qt 中,这一切可以简单地用 connect 方法实现。

        最后,我们梳理下思绪,总结下这个例子:

                若以「信号(Signal)与槽(Slot)」的机制来理解本例。那么在本例中,信号的发送者是 裁判手中的那把枪 ;发出的信号是 鸣枪/枪响 ;信号的接收者是 运动员 ;信号处理槽函数是 短跑比赛开始/运动员起跑

4、自定义信号与槽: 

        接下来例举一个简单的自定义信号与槽的 C++ 代码例,该例主要包含三大部分:自定义信号 myprintsignal() (在MySignal类中声明)、自定义槽 myprintslot() (在MySlot类中声明与定义)、发出信号的方法 startprint() (在Widget类中声明与定义) 以及 它们相应的重载。

        这里简单提一下发出信号的方法 startprint() :我们知道对于自带的信号比如 QPushButton 的 clicked 点击信号,已经写好了当我们点击按钮时就会发送信号。而对于自定义的信号与槽,connect 仅仅只是把信号和槽连接起来了,但还没有说啥时候发信号。

        这个时候,我们一般就需要写一个发出信号的方法,调用该方法时,就可以发出信号啦~

信号: 

/* mysignal.h */
#ifndef MYSIGNAL_H
#define MYSIGNAL_H

#include <QObject>

class MySignal : public QObject
{
    Q_OBJECT
public:
    explicit MySignal(QObject *parent = nullptr);

signals:
    //自定义信号写在 signals 下
    //自定义信号无返回值,只需声明,无需在.cpp中定义
    //自定义信号可以有参数,可以重载
    //这里自定义一个我的打印信号
    void myprintsignal();

    //重载自定义信号
    void myprintsignal(QString text);
};

#endif // MYSIGNAL_H
/* mysignal.cpp */
#include "mysignal.h"

MySignal::MySignal(QObject *parent) : QObject(parent)
{

}

槽: 

/* myslot.h */
#ifndef MYSLOT_H
#define MYSLOT_H

#include <QObject>

class MySlot : public QObject
{
    Q_OBJECT
public:
    explicit MySlot(QObject *parent = nullptr);
    //高版本Qt允许自定义槽函数写在public或者全局下
    //自定义槽函数无返回值,同时需要声明和定义
    //自定义槽函数可以有参数,可以重载
    //这里自定义一个我的打印槽函数
    void myprintslot();

    //重载槽函数
    void myprintslot(QString text);
signals:

};

#endif // MYSLOT_H
/* myslot.cpp */
#include "myslot.h"
#include <QDebug>

MySlot::MySlot(QObject *parent) : QObject(parent)
{

}

void MySlot::myprintslot()
{
    qDebug() << "这是我自定义的打印槽函数";
}

void MySlot::myprintslot(QString text)
{
    //将 QString 类型转换为 char * 类型,打印出来的文本就没有引号了
    qDebug() << text.toUtf8().data();    
}

窗口: 

/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mysignal.h"
#include "myslot.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    //声明一个私有的MySignal对象
    MySignal* _mysignal;
    //声明一个私有的MySlot对象
    MySlot* _myslot;

    void startprint();

    //重载发出信号方法
    void startprint(QString text);
};
#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);
    this->setFixedSize(300,300);

    //实例化一个MySignal对象
    _mysignal = new MySignal(this);

    //实例化一个MySlot对象
    _myslot = new MySlot(this);

    //定义函数指针(对于无参的可以在参数列表写个void,也可以空白)
    void (MySignal:: *signalpointer1)() = &MySignal::myprintsignal;
    void (MySlot:: *slotpointer1)(void) = &MySlot::myprintslot;
    void (MySignal:: *signalpointer2)(QString) = &MySignal::myprintsignal;
    void (MySlot:: *slotpointer2)(QString) = &MySlot::myprintslot;

    //建立连接
    connect(_mysignal, signalpointer1, _myslot, slotpointer1);
    connect(_mysignal, signalpointer2, _myslot, slotpointer2);

    //调用"开始打印"方法,即可发出信号,即可自动调用槽函数
    startprint();
    startprint("这是我重载的打印槽函数");
}

//开始打印方法
void Widget::startprint()
{
    //该方法用于发出信号
    emit _mysignal->myprintsignal();
}

void Widget::startprint(QString text)
{
    //发出带参数的信号
    emit _mysignal->myprintsignal(text);
}

Widget::~Widget()
{
    delete ui;
}

        通过窗口类 Widget::startprint() 方法可以看到,自定义信号是通过 emit 关键字发出的;而 emit 关键字的存在是为了让程序员在看到 emit 语句时知道这里在做的事情是发出该信号。

4.1、运行效果:

5、信号与槽的特性: 

  1. 一个信号可以绑定连接到多个槽;
  2. 多个信号可以绑定连接到一个槽;
  3. 信号的参数个数可以多于槽函数的参数个数,反之不行;
  4. 信号和槽函数都有的参数,类型必须按照参数表从头一一对应。以上面自定义的信号和槽为例:
    //假设信号声明成这样:
    void myprintsignal(int num, QString text);
    
    
    //那么,这样的槽是允许与该信号 connect 的:
    void myprintslot(int num, QString text);
    void myprintslot(int num);
    void myprintslot();
    
    //而这样的槽是不允许的:
    void myprintslot(QString text);
    void myprintslot(QString text, int num);
    void myprintslot(int num, bool flag);
    void myprintslot(int num, QString text, bool flag);
  5. 一个信号可以连接另一个信号:还是以上面自定义的信号与槽为例,假设我们在窗口内新增了一个 QPushButton 命名为 "btn",现在我们想用按钮的"点击"信号去触发另一个不带参数的 myprintsignal() 信号。我们同样用 connect 把这两个信号绑定连接起来就可以了:
    //信号连接信号
    QPushButton* btn = new QPushButton("打印", this);
    connect(btn, &QPushButton::clicked, _mysignal, signalpointer1);
    
    /*对于信号之间的连接,同样满足前面的4条特性:
    比如在官方文档提供的信息中,QPushButton 的 clicked 信号声明形式是:
    void clicked(bool checked = false);
    那么 clicked 信号就不能与
    void myprintsignal(QString text);
    信号相绑定连接*/
  6. 运行效果如下图所示:
  7. 信号是可以断开的,信号与槽的连接、信号与信号的连接都是可以断开的。调用 disconnect  方法断开信号即可:
    //断开信号
    disconnect(_mysignal, signalpointer1, _myslot, slotpointer1);
    disconnect(btn, &QPushButton::clicked, _mysignal, signalpointer1);

6、Qt 4 版本以前 connect 用法:

        本文使用的 Qt 版本是 5.14.2,在稍早一些的 Qt 版本比如 Qt 4 版本以前,connect 方法的使用方式会有些许不同。还是以上面自定义的信号和槽为例,现我们绑定链接无参的 myprintsignal() 信号和无参的 myprintslot() 槽,形式应当如下:

connect(_mysignal, SIGNAL(myprintsignal()), _myslot, SLOT(myprintslot()));

        这个形式在目前的 Qt 5 和 Qt 6 版本仍然是适用的。不过需要注意的是:若要使用这种形式,就必须把槽函数声明在 public slots: 下!若声明在 public全局下则会弹出找不到槽的提示:

        这个形式优点是参数直观;缺点是类型不安全。所以现在不推荐使用了

7、使用 Lambda 表达式建立连接:

        Lambda 表达式匿名函数)是 C++ 11 中的新特性。对于本文第 5 章提到的信号和槽函数的参数特性(第3条和第4条特性),我们可以使用 Lambda 表达式来解决参数限制的问题。比如现在我们来修改下第5条特性(信号连接信号)的那段代码:

connect(btn, &QPushButton::clicked, _mysignal, [=](){
    emit _mysignal->myprintsignal("这是使用 Lambda 表达式的连接");   //在匿名函数中发送带参信号
    btn->setText("test");                                          //在匿名函数中调用普通成员函数
    _myslot->myprintslot("测试下呢");                               //在匿名函数中调用槽
});

运行效果如下图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制 的相关文章

  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 新安装的ubuntu,遇到的问题记录

    镜像版本 https mirror nju edu cn ubuntu releases 22 04 ubuntu 22 04 1 live server amd64 iso 安装后无法切换 root 用户 问题截图 null 解决办法 解
  • glslViewer编译

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 glslViewer下载 二 编译步骤 1 使用CMake 前言 一 glslViewer下载 glslViewer下载地址 二 编译步骤 1 使用CMake 2 配置
  • android常用框架!万字长文轻松彻底入门Flutter,使用指南

    前言 说不焦虑其实是假的 因为无论是现在还是最近几年 很早就有人察觉Android开发的野蛮生长时代已经过去 过去的优势是市场需要 这个技术少有人有 所以在抢占市场的时候 基本上满足需要就已经可以了 但是现在 各式各样的APP层出不穷 AP
  • python类

    python是一种面向对象的变成语言 python几乎所有的东西都是对象 包括对象和属性 一 类的定义 python类的定义 class ClassName pass 实例 注意 类中的函数称为方法 有关于函数的一切适用于方法 唯一的区别在
  • MySQL出现“Lost connection to MySQL server during query”问题分析与解决

    问题重现 有一个表总是在写入数据的时候报2013的错误 原因分析 官方文档 总结一下3种可能性 一般都是第一或第二种原因 首先SQLAlchemy官方对该错误的解释 针对与数据库操作相关的错误而引发的异常 并且不一定在程序员的控制之下 例如
  • BUUCTF [CSAWQual 2019]Web_Unagi 1

    BUUCTF CSAWQual 2019 Web Unagi 1 提示在 flag 有提示了上传xml文件及其格式 直接用之前xml注入的上传即可 改文件名为1 xml上传即可得flag gt
  • 关于如何解决:Maven无法从aliyun仓库自动下载jar包(情况之一)

    如果你出现修改Maven配置文件settings xml无法生效 或者无法从aliyun仓库自动下载jar包的情况 除了其他博主提出的情况与解决方案以外 你如果还没有解决 检查是否遇到以下情况 最首先应当去aliyun官网 https de
  • C++之数据类型

    数据类型可以分为 基本数据类型 和 非基本数据类型 1 基本数据类型 整型 int 布尔值类型 bool 浮点数类型 double 字符类型 char void类型 2 非基本数据类型 指针类型 type 数组类型 type 引用类型 do
  • 1028 人口普查 (20分))(C语言)

    1028 人口普查 20分 某城镇进行人口普查 得到了全体居民的生日 现请你写个程序 找出镇上最年长和最年轻的人 这里确保每个输入的日期都是合法的 但不一定是合理的 假设已知镇上没有超过 200 岁的老人 而今天是 2014 年 9 月 6
  • 计算机修改桌面图标大小,windows更改桌面图标大小设置

    对于windows系统使用 不同的人有不同的使用习惯 有些人不习惯windows桌面的默认图标大小 想更改桌面图标大一些或小一些 小编就遇到一个有高度近视的同事 默认的桌面图标他根本看不清 需要把眼睛贴近显示器才能看清 所以他就需要把图标设
  • koa使用之node.js 文件加密与解密

    利用node js的crypto模块实现文件加密解密 代码 加密函数 param text 需要加密的内容 param key 秘钥 returns Query 密文 function encode text key var secret
  • 解释 RESTful API,以及如何使用它构建 web 应用程序

    RESTful API stands for Representational State Transfer Application Programming Interface It is a set of principles and g
  • uniapp开发app原生子窗体subNvue的使用

    用uniapp开发app的时候经常会有以下问题 1 覆盖原生导航栏 tabbar 的弹出层组件 比如侧滑菜单盖不住地图 视频 原生导航栏 比如 popup盖不住tabbar 2 弹出层内部元素可滚动 3 在map video等组件上的添加复
  • FPGA——按键消抖常用模板代码

    模板如下 define UD 1 module key jitter input clkin input key in output key value output 15 0 tout inner signal reg 1 0 key i
  • Angular1.x 基础入门

    一 Angular1 x概述 致力于单页面应用 single page application 不直接操作DOM元素 数据驱动为核心 以操作数据完成页面的一系列 二 Angular1 x特点 MVC MVC模式 Model 模型 业务数据
  • ts(TypeScript)常用语法(Omit、Pick、Partial、Required)

    ts TypeScript 常用语法 比如有一个联系人列表 export interface Contact name string 姓名 phone string 手机号 email string 邮箱 avatar string 头像
  • appium根据屏幕大小滑动界面driver.get_window_size()、driver.swipe()

    driver get window size 获取屏幕的宽 高 driver swipe 从坐标1滑动到坐标2 t毫秒时间内完成 上下滑动时 坐标的x值可以不变 只改变坐标y值的大小 左右滑动时 坐标的y值可以不变 只改变坐标x值的大小 上
  • 分布式系统与微服务的区别是什么?

    分布式系统和微服务是两个相关但不同的概念 它们都是在构建复杂的软件应用时使用的架构思想 分布式系统 分布式系统是指由多个独立的计算机或服务器通过网络连接共同工作 协同完成一个任务或提供一个服务 在分布式系统中 各个计算机节点可以分担任务的负
  • “华为杯”研究生数学建模竞赛2019年-【华为杯】D题:汽车行驶工况构建(附获奖论文和MATLAB代码实现)

    目录 摘 要 1 问题重述 2 模型假设 2 1 题目对模型给出的假设
  • Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

    目录 1 Qt 与 Qt Creator简介 2 关于引用头文件的一些事儿 3 信号 Signal 与槽 Slot 机制 3 1 一个小例子 4 自定义信号与槽 4 1 运行效果 5 信号与槽的特性 6 Qt 4 版本以前 connect