QT5.14.2使用回顾

news2024/11/16 17:34:24

前面已有博客介绍了QT的安装和配置VS2019配置Qt5.14.2以及在线配置Qt5.15.2,

这里再接着该版本说明下QT的使用,主要是汇总下之前博客中的内容:

Ubuntu下的基本知识点(二)

QT4.8.6工程到QT5.12.1的迁移

注意前面安装时候,做如下的勾选选择:

同时系统环境变量里添加如下变量环境

一.命令行方式编译一个简单的qt程序

  1. 拿之前博客中的现成例子来演示,VS2019配置Qt5.14.2以及在线配置Qt5.15.2,文章最后有附上一个QTCreator创建的工程链接

链接:https://pan.baidu.com/s/1AomYijJobGY855zeBV5U1g

提取码:rky4

将工程中的四个文件拷贝到一个新建目录下,如下所示:

然后运行Qt 5.14.2(MingGW 7.3.0 64-bit)

在弹出来的CMD窗口内先后执行如下命令语句

可看到出现了报错信息fatal error: QDialog: No such file or directory,这里可以修改生成的pro文件,如下是原始生成的

修改为如下:

######################################################################
# Automatically generated by qmake (3.1) Sun Jan 8 10:36:59 2023
######################################################################
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = app
TARGET = commandLine
INCLUDEPATH += .

# You can make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# Please consult the documentation of the deprecated API in order to know
# how to port your code away from it.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Input
HEADERS += dialog.h
FORMS += dialog.ui
SOURCES += dialog.cpp main.cpp

再继续分别执行qmake和mingw32-make命令

然后cd到release目录下,将生成的exe文件跑起来

可看到程序功能运行正常

注:这边在使用mingw32-make命令的时候,生成的中间语句可以注意下:

如果要由ui文件获得对应的.h文件可以使用如上命令

  1. 给程序添加应用图标

拷贝一个ico文件到上面的目录下,同时在该目录下新建一个myico.rc文件,里面内容(可notepad++)修改为如下:

IDI_ICON1 ICON DISCARDABLE "tubiao.ico"

然后打开pro文件,在末尾添加如下一句

RC_FILE += myico.rc

######################################################################
# Automatically generated by qmake (3.1) Sun Jan 8 10:36:59 2023
######################################################################
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = app
TARGET = commandLine
INCLUDEPATH += .

# You can make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# Please consult the documentation of the deprecated API in order to know
# how to port your code away from it.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Input
HEADERS += dialog.h
FORMS += dialog.ui
SOURCES += dialog.cpp main.cpp

RC_FILE += myico.rc

完毕后再分别执行qmake命令和mingw32-make命令,完毕后运行程序,如下:

可看到图标已经正确添加了。

  1. 再继续尝试另一个例子,在一个新的文件夹中纯文本编辑一份main.cpp文件,文件中代码如下:

#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    
    QDialog w;
    w.resize(400,300);
    
    QLabel label(&w);
    label.move(120,120);
    label.setText("Hello World!你好 Qt!");
    w.show();
    return a.exec();
}

然后执行qmake命令获得pro文件,修改pro文件如下:

######################################################################
# Automatically generated by qmake (3.1) Sun Jan 8 18:36:31 2023
######################################################################
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = app
TARGET = commandLine2
INCLUDEPATH += .

# You can make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# Please consult the documentation of the deprecated API in order to know
# how to port your code away from it.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Input
SOURCES += main.cpp

然后再执行qmake命令和mingw32-make命令

执行exe命令,效果如下:

到这边,以这种纯文本形式编辑代码,命令行编译的方式就简单概括了,ui界面的设计可以用Designer 5.14.2(MingGW 7.3.0 64-bit)来设计。对比博客中在ubuntu下命令行形式编译,方法是一样的。

https://blog.csdn.net/jiugeshao/article/details/121845539?spm=1001.2014.3001.5502

但我们更常用的还是通过编译环境来去写代码,方便调试,毕竟还是要站在巨人的肩膀上,善于利用工具,提高效率。

二.利用集成开发环境来设计程序

这里主要来拿QTCreator来做说明。

  1. 手动去设计界面

(1)新建项目,基类型选择QDialog

(2)生成的工程目录结构如下:

初始的pro文件中内容如下:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    dialog.cpp

HEADERS += \
    dialog.h

FORMS += \
    dialog.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

初始的dialog.h中内容如下:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

初始的dialog.cpp中内容如下:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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

初始的main.cpp中内容如下:

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

dialog.ui界面为空

(3)手动在界面上添加如下几个控件

鼠标选中dialog窗体,然后点击栏栅格布局按钮,界面上控件即如下排列了

此设计时,并不会影响dialog.h, dialog.cpp, main.cpp中的代码

2.手动添加信号和槽

(1) 给PushButton按钮手动添加信号和对应的槽

选中按钮后,点击Edit Signals/Slots选项

把线拖到界面外的空白处

出现如下的界面

勾选显示从QWidget继承的信号和槽,点击编辑,可以槽一栏中添加slot1槽

完毕后点击OK按钮。如下界面时,点击Edit Widgets

在Signals Slots Edit栏中能看到如下的信息

(2)在dialog.h文件中添加如下代码:

(3)在dialog.cpp文件中添加如下代码:

到这里运行效果如下:

3.自定义信号和槽

(1)在dialog.h文件中添加如下自定义信号(选中代码)

继续再添加自定义槽

(2)在dialog.cpp文件中添加如下代码(选中代码)

再添加如下代码

运行效果如下:

4.代码绑定界面上某个按钮的信号和槽

(1)界面上添加一个新的按钮

(2)在dialog.h文件中添加如下代码

在dialog.cpp文件中添加如下代码

运行效果如下:

5.自定义对话框,代码设计对话框界面

运行效果如下(点击Test按钮后出现如下界面)

对应该程序dialog.h中代码如下:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QGroupBox>
#include <QLabel>
#include <qmessagebox.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

public:
    //全局变量
    QGroupBox *groupBox[10][10];
    QPushButton *status[10][10];

private:
    Ui::Dialog *ui;

signals:
    void signal_define(QString);

private slots:
    void slot1();
    void slot_define(QString);
    void TestDefineGUI();

    void view();
    void check();
};
#endif // DIALOG_H

对应该程序,dialog.cpp中代码如下:

#include "dialog.h"
#include "ui_dialog.h"


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(this, SIGNAL(signal_define(QString)),this,SLOT(slot_define(QString)));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(TestDefineGUI()));
}

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

void Dialog::slot1()
{
    ui->textEdit_1->setText("has be triggered");

    QString qstring = "test2";
    emit signal_define(qstring);
}


void Dialog::slot_define(QString ccmd)
{
    ui->textEdit_2->setText(ccmd);
}

void Dialog::TestDefineGUI()
{
    ui->textEdit_3->setText("Test Gui");
    //设置字体
    QFont font1;
    font1.setFamily(QString::fromUtf8("Times New Roman"));
    //font1.setBold(true);
    //font1.setItalic(true);
    font1.setPointSize(16);

    //自定义对话框
    QDialog *dialog = new QDialog(this);

    QGridLayout *parent = new QGridLayout;

    QGridLayout *child1 = new QGridLayout;

    QGridLayout *child2 = new QGridLayout;

    parent->addLayout(child1, 0, 0, 1,1);
    parent->addLayout(child2, 1, 0, 30, 1);


    QLabel *info = new QLabel;
    info->setText(tr("代码设计界面"));

    QPushButton *view = new QPushButton;
    view->setText("view");
    view->setFont(font1);

    connect(view, SIGNAL(clicked()), this, SLOT(view()));

    QSpacerItem *hSpace1;
    hSpace1 = new QSpacerItem(40,20,QSizePolicy::Expanding, QSizePolicy::Minimum);

    child1->addWidget(info,0,0,1,1);
    child1->addItem(hSpace1, 0,2,1,2);
    child1->addWidget(view, 0,5,1,1);

    for(int layer=0; layer < 3; layer++)
    {
        QGridLayout *H=new QGridLayout;

        for(int i=0; i<4; i++)
        {
            QGridLayout *local = new QGridLayout;

            groupBox[layer][i] = new QGroupBox(this);
            QPalette p = groupBox[layer][i]->palette();
            p.setColor(QPalette::WindowText, Qt::green);
            groupBox[layer][i]->setPalette(p);

            status[layer][i] = new QPushButton(groupBox[layer][i]);
            status[layer][i]->setFont(font1);
            connect(status[layer][i],SIGNAL(clicked()),this,SLOT(check()));

            local->addWidget(groupBox[layer][i],0,0,20,20);
            local->addWidget(status[layer][i], 9, 1,8,18);
            H->addLayout(local, 0, i*20+1, 1,19);
        }

        QSpacerItem *vSpace1;
        vSpace1 = new QSpacerItem(20,40,QSizePolicy::Minimum, QSizePolicy::Expanding);
        child2->addLayout(H,layer,0,1,1);
    }

    dialog->setLayout(parent);
    dialog->setModal(true);
    dialog->show();

    for(int layer=0; layer < 3; layer++)
    {
        for(int i=0; i<4; i++)
        {
             char flag[100];
             sprintf(flag,"%d%d",layer,i);
             status[layer][i]->setText(flag);
        }
    }
}

void Dialog::view()
{
int ret = QMessageBox::information(this, tr("提示"), tr("click view!"), QMessageBox::Ok);
}

void Dialog::check()
{
   int row, col;

   QPushButton *btn=qobject_cast<QPushButton*>(sender());
   for(int layer=0; layer < 3; layer++)
   {
       for(int i=0; i<4; i++)
       {
           if(btn == status[layer][i])
           {
               row = layer;
               col = i;
           }
       }
   }

   char flag[100];
   sprintf(flag,"click %d%d",row,col);
   int ret = QMessageBox::information(this, tr("提示"), tr(flag), QMessageBox::Ok);
}

可看到弹跳出来的对话框的界面样式是通过代码实现的

6.调用自己手动设计的对话框界面

(1) 手动设计对话框,新建界面模板

(2)可看到会同时生成头文件和对应的源文件

(3)自定义对话框界面简单设计为如下

(4)在自动生成的mydialog.h文件中添加如下代码(红色下划线,加一个槽函数)

(5)在dialog.h中添加如下代码

(6)在dialog.cpp中添加如下代码

(7)mydialog.cpp中代码修改为如下

#include "mydialog.h"
#include "ui_mydialog.h"
#include "dialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(update()));
}

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

void MyDialog::update()
{
    extern Dialog *ex;
    QString command=ui->lineEdit->text();
    QByteArray ba=command.toLocal8Bit();
    char *mm=ba.data();

    ex->Showinfo(mm);
}

(8)在dialog.cpp开头添加如下代码

同时加入如下语句

同时在slot1函数末尾添加如下代码:

执行运行效果如下:

点击PushButton按钮

点击confirm按钮后

7.调用自己定义的类

,新建一个myClass类,其中头文件myClass.h中代码如下:

#ifndef MYCLASS_H
#define MYCLASS_H

#endif // MYCLASS_H
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <qmessagebox.h>
#include <QDebug>
using namespace std;

class myClass
{
public:
    myClass(void);
    ~myClass(void);

    string name;
    QString name2;

    bool printInfo();
};

myClass.cpp

#include "myClass.h"

myClass::myClass(void)
{

}

myClass::~myClass(void)
{

}

bool myClass::printInfo()
{
    qDebug() << name2;
}

在dialog.cpp中添加下#include "myClass.h"包含语句,同时在slot1中增加如下代码

    myClass w;
    w.name2 = "jack";
    w.printInfo();

8.开启线程

创建了myThread线程类,其中myThread.h中代码如下:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#endif // MYTHREAD_H
#include <QThread>

class myThread : public QThread
{
    Q_OBJECT

public:
    myThread(QObject *parent=0,char *name=0);
    ~myThread();
    char info[2048];

private:

protected:
    void run();

signals:
    void signal_show(char*);
};

myThread.cpp中代码如下:

#include "myThread.h"
#include <QMutex>

QMutex m_lock(QMutex::Recursive);

myThread::myThread(QObject *parent, char name[])
{
    sprintf(info, "%s", name);
}

myThread::~myThread()
{

}

void myThread::run()
{
  // m_lock.lock();
   //if(strstr(info,"s"))  //可以就实现一个线程类,但可以根据不同的输入实现不同的功能
   //{
      //char temp[100];
     // sprintf(temp, "%s", "hello world");
      emit signal_show(info);
  // }
  // m_lock.unlock();
}

其余dialog.h中代码为:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QGroupBox>
#include <QLabel>
#include <qmessagebox.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

public:
    //全局变量
    QGroupBox *groupBox[10][10];
    QPushButton *status[10][10];

public:
    void Showinfo(char *info);

private:
    Ui::Dialog *ui;

signals:
    void signal_define(QString);

private slots:
    void slot1();
    void slot_define(QString);
    void TestDefineGUI();

    void view();
    void check();
    void thread_slot(char*);
};
#endif // DIALOG_H

dialog.cpp中代码如下:

#include "dialog.h"
#include "ui_dialog.h"
#include "mydialog.h"
#include "myClass.h"
#include "myThread.h"
#include "windows.h"
#include <unistd.h>

Dialog *ex = NULL;

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(this, SIGNAL(signal_define(QString)),this,SLOT(slot_define(QString)));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(TestDefineGUI()));
    ex=this;
}

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

void Dialog::slot1()
{
    ui->textEdit_1->setText("has be triggered");

    QString qstring = "test2";
    emit signal_define(qstring);

    MyDialog *mydialog = new MyDialog(ex);
    mydialog->exec();

    myClass w;
    w.name2 = "jack";
    w.printInfo();

    char s[100];
    sprintf(s, "s");

    myThread *thread = new myThread(this, s);
    connect(thread, SIGNAL(signal_show(char*)), this, SLOT(thread_slot(char*)));
    thread->start();

    qDebug() << "over";
}

void Dialog::thread_slot(char* command)
{
    QString string = command;
    while(true)
    {
       qDebug() << string;
       Sleep(2000);
    }
}

void Dialog::slot_define(QString ccmd)
{
    ui->textEdit_2->setText(ccmd);
}

void Dialog::TestDefineGUI()
{
    ui->textEdit_3->setText("Test Gui");
    //设置字体
    QFont font1;
    font1.setFamily(QString::fromUtf8("Times New Roman"));
    //font1.setBold(true);
    //font1.setItalic(true);
    font1.setPointSize(16);

    //自定义对话框
    QDialog *dialog = new QDialog(this);

    QGridLayout *parent = new QGridLayout;

    QGridLayout *child1 = new QGridLayout;

    QGridLayout *child2 = new QGridLayout;

    parent->addLayout(child1, 0, 0, 1,1);
    parent->addLayout(child2, 1, 0, 30, 1);


    QLabel *info = new QLabel;
    info->setText(tr("代码设计界面"));

    QPushButton *view = new QPushButton;
    view->setText("view");
    view->setFont(font1);

    connect(view, SIGNAL(clicked()), this, SLOT(view()));

    QSpacerItem *hSpace1;
    hSpace1 = new QSpacerItem(40,20,QSizePolicy::Expanding, QSizePolicy::Minimum);

    child1->addWidget(info,0,0,1,1);
    child1->addItem(hSpace1, 0,2,1,2);
    child1->addWidget(view, 0,5,1,1);

    for(int layer=0; layer < 3; layer++)
    {
        QGridLayout *H=new QGridLayout;

        for(int i=0; i<4; i++)
        {
            QGridLayout *local = new QGridLayout;

            groupBox[layer][i] = new QGroupBox(this);
            QPalette p = groupBox[layer][i]->palette();
            p.setColor(QPalette::WindowText, Qt::green);
            groupBox[layer][i]->setPalette(p);

            status[layer][i] = new QPushButton(groupBox[layer][i]);
            status[layer][i]->setFont(font1);
            connect(status[layer][i],SIGNAL(clicked()),this,SLOT(check()));

            local->addWidget(groupBox[layer][i],0,0,20,20);
            local->addWidget(status[layer][i], 9, 1,8,18);
            H->addLayout(local, 0, i*20+1, 1,19);
        }

        QSpacerItem *vSpace1;
        vSpace1 = new QSpacerItem(20,40,QSizePolicy::Minimum, QSizePolicy::Expanding);
        child2->addLayout(H,layer,0,1,1);
    }

    dialog->setLayout(parent);
    dialog->setModal(true); //模态对话框
    dialog->show();

    for(int layer=0; layer < 3; layer++)
    {
        for(int i=0; i<4; i++)
        {
             char flag[100];
             sprintf(flag,"%d%d",layer,i);
             status[layer][i]->setText(flag);
        }
    }



}

void Dialog::view()
{
int ret = QMessageBox::information(this, tr("提示"), tr("click view!"), QMessageBox::Ok);
}

void Dialog::check()
{
   int row, col;

   QPushButton *btn=qobject_cast<QPushButton*>(sender());
   for(int layer=0; layer < 3; layer++)
   {
       for(int i=0; i<4; i++)
       {
           if(btn == status[layer][i])
           {
               row = layer;
               col = i;
           }
       }
   }

   char flag[100];
   sprintf(flag,"click %d%d",row,col);
   int ret = QMessageBox::information(this, tr("提示"), tr(flag), QMessageBox::Ok);
}

void Dialog::Showinfo(char *info)
{
    ui->textEdit_1->setText(info);
}


执行结果如下,可看到线程中的while死循环并没有阻塞主线程代码的执行

这边再附上该篇帖子的测试工程程序,链接如下:

链接:https://pan.baidu.com/s/1bsyksfotjux_4DdW3B6w3A

提取码:sbjb

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

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

相关文章

小程序开发超好用的UI组件——Vant Weapp

Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库&#xff0c;助力开发者快速搭建小程序应用。它所使用的是 MIT 开源许可协议&#xff0c;对商业使用比较友好,官网地址&#xff1a;https://vant-contrib.gitee.io/vant-weapp/#/home 安装 Vant 组件库 在小程序项目中&a…

设计模式学习(十):lterator迭代器模式

一、什么是Iterator模式使用Java语言显示数组arr中的元素时&#xff0c;我们可以使用下面这样的for循环语句遍历数组。for (int i 0; i < arr.length; i){system.out.println(arr[i]); }请注意这段代码中的循环变量i。该变量的初始值是o&#xff0c;然后会递增为1,2&#x…

halo 1.4.17 使用Mysql 安装与配置

1 下载代码 https://github.com/halo-dev/halo/archive/refs/tags/v1.4.17.zip 2 查看1.4版本文档 https://docs.halo.run/1.4/ 1.3 使用idea打开并设置jdk 11 1.4 将h2配置成为mysql 修改前 修改后 1.5 打包成jar halo使用的是Gradle&#xff0c;打包时&#xff0c…

微软官宣裁员 10000 人。分享一些我的建议给大家

大家好&#xff01;我是韩老师。昨天&#xff0c;西雅图双雄经历着不眠之夜。早些时间&#xff0c;就有传言说 1 月 18 日&#xff0c;亚马逊会裁员 18000 人。微软要裁员的各种消息也是满天飞。北京时间昨天晚上&#xff0c;微软官方博客发了一篇标题为 Focusing on our short…

10. 元组tuple类型详解

python3 tuple类型的使用 1. 基本知识 a. 元组&#xff08;tuple&#xff09;与列表类似, 不同之处在于元组的元素(项)不能修改。 b. 元组写在小括号 () 里&#xff0c;元素之间用逗号隔开。 c. 元组中的元素类型也可以不相同。 d. 构造包含0个或1个元素的元组比较特殊, 所以…

自增主键为什么不是连续的?

在前面文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。 之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递…

【深度学习数学基础之线性代数】研究使用链式法则进行反向传播的求导算法

链式法则 简单的说链式法则就是原本y对x求偏导&#xff0c;但是由于过程较为复杂&#xff0c;我们需要将函数进行拆分&#xff0c;通过链式进行分别求导&#xff0c;这样会使整个计算更为简单。 假设f k ( a b c ) f k(a bc)fk(abc) 通俗来说&#xff0c;链式法则表明&a…

宝贝代码部署笔记

记录前后端分离项目部署到云服务器 文章目录1. 启动数据库2. 创建数据库3. 阿里云开放后端项目端口4. 运行SQL文件5. 打包前端文件6. 服务端创建文件夹7. 打包后端jar包8. 安装配置Nginx服务器9. 启动Tomcat10. 项目文件上传部署1. 启动数据库 使用命令cd /opt/mysql/support-…

Generative Adversarial Network (GANs) 对抗神经网络 基础 第一部分

Generative Adversarial Network (GANs) 对抗神经网络 基础 第一部分 定义 Definition Discriminative model&#xff1a; Classifier 判别器Generative model: (random set of value , class) as input -> Create new features X 生成器 对抗神经网络模型主要就是通过判…

android的system域解耦

google很早在为此做准备&#xff0c;要求所有设备能够刷GSI&#xff08;通用系统镜像&#xff09;&#xff0c;并跑过XTS测试。动态分区解耦方案如上图。一、分区描述单一系统映像 (SSI)。包含system和system_ext图像的新概念图像。当这些分区对于一组目标设备是通用的时&#…

二叉树(一)

先简单了解一下树的概念&#xff0c;从而进一步了解二叉树&#xff0c;最后进行代码测试。树概念及结构(了解)在认识而二叉树之前我们首先了解一下树的概念。树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。…

图扑喜获第十一届中国创新创业大赛全国赛优秀奖!

在近期结束的第十一届中国创新创业大赛全国赛&#xff08;新一代信息技术&#xff09;比赛中&#xff0c;图扑软件喜获成长组优秀奖。这是继“创客中国”创新创业大赛优胜奖荣誉后&#xff0c;再一次对图扑软件在新一代信息技术领域专业的认可&#xff01;大赛围绕新一代信息技…

电机行业EDI案例分析

项目背景 J公司需要与国内某知名电机品牌Z公司建立EDI对接&#xff0c;J公司选择通过知行EDI系统与Z公司建立AS2连接&#xff0c;通过AS2接收Z公司发送过来的ORDERS&#xff08;采购订单&#xff09;和ORDCHG&#xff08;采购订单变更&#xff09;&#xff0c;并根据发接收到的…

Linux常见命令 15 - 权限管理命令 chmod

1. chmod 语法 chmod为修改文件/文件夹权限&#xff0c;有以下两种操作&#xff0c;其中-R表示递归修改 chmod {ugoa} {-} {rwx} [文件或目录] -Rchmod [mode421] [文件或目录] -R 2. chmod {ugoa} {-} {rwx} [文件或目录] -R u&#xff1a;文件或目录的所有者&#xff0c;g…

C++设计模式(5)——观察者模式

观察者模式 亦称&#xff1a; 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式&#xff0c; 允许你定义一种订阅机制&#xff0c; 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象&a…

概论第6章_正态总体的抽样分布_卡方分布_F分布_t分布

一 卡方分布 定义 设X1,X2,...,XnX_1, X_2,..., X_nX1​,X2​,...,Xn​ 独立同分布于标准正态分布N(0, 1), 则χ2X12...Xn2\chi^2X_1^2 ... X_n^2χ2X12​...Xn2​的分布称为 自由度为 n 的χ2\chi^2χ2分布&#xff0c; 记为χ2\chi^2χ2 ~ χ2(n)\chi^2(n)χ2(n) χ2\chi…

Python爬虫序章---爬取csdn作者排行榜

上篇文章介绍了requests库获取数据的基本方法&#xff0c;本篇文章利用自动化测试工具selenium进行数据抓取&#xff0c;也会对代码部分进行详细解释&#xff0c;以便小伙伴们能够更加理解和上手。 一.selenium技术介绍 Selenium是最广泛使用的开源 Web UI&#xff08;用户界面…

windows11远程连接Ubuntu桌面

如何通过Windows 11远程连接Ubuntu桌面 在日常开发过程中&#xff0c;很多时候是这样一种情形&#xff1a;一台装了Ubuntu系统的计算机作为远程服务器&#xff0c;开发人员则使用带Windows系统的计算机去连服务器进行开发。 连接服务器的方式有很多种&#xff0c;最简单的就是…

图扑软件荣获第十一届中国创新创业大赛全国赛优秀奖!

在近期结束的第十一届中国创新创业大赛全国赛&#xff08;新一代信息技术&#xff09;比赛中&#xff0c;图扑软件喜获成长组优秀奖。这是继“创客中国”创新创业大赛优胜奖荣誉后&#xff0c;再一次对图扑软件在新一代信息技术领域专业的认可&#xff01;大赛围绕新一代信息技…

DW动手学数据分析Task4:数据可视化

目录1 了解matplotlib2 可视化图案3 matplotlib用法4 了解Seaborn1 了解matplotlib Matplotlib&#xff1a; 是 Python 的绘图库&#xff0c; 它可与 NumPy 一起使用&#xff0c;提供了一种有效的 MatLab 开源替代方案。 2 可视化图案 基本可视化团及场景使用 柱状图 场景&am…