(6)——多窗口编程

news2024/11/16 23:48:03

目录

1. QMessageBox 消息对话框**

2. 窗口类继承关系**

3. QMainWindow 主窗口类**

3.1 QMenuBar 菜单栏

3.2 QToolBar 工具栏

3.3  QWidget 中心组件

3.4 QStatusBar 状态栏

4. parent参数**

5. 自定义窗口类**

6. 跨界面参数传递**

6.1 主窗口→子窗口

6.2 子窗口→主窗口

7. 事件函数**


1. QMessageBox 消息对话框**

QMessageBox继承自QDialog,是一种用于通知用户或询问用户一个问题的对话框窗口,这种窗口是模态的,会抢占窗口焦点,必须优先处理。

Qt内置的Dialog的派生类通常使用静态成员函数弹出:

// 参数1:父窗口
// 参数2:标题,相当于windowTitle属性
// 参数3:显示的信息
// 返回值:点击的按键类型

StandardButton QMessageBox::四种弹窗类型(QWidget * parent, 
                                       const QString & title, 
                                       const QString & text) [static]
dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QButtonGroup>
#include <QtWidgets> //包含所有组件和窗口的头文件

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QButtonGroup *group;

private slots:
    void btnsClickedSlot(int); //按钮点击的槽函数
};

#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);
    group = new QButtonGroup(this);
    group->addButton(ui->pushButtonQ,1);
    group->addButton(ui->pushButtonI,2);
    group->addButton(ui->pushButtonW,3);
    group->addButton(ui->pushButtonC,4);

    connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));

}
void Dialog::btnsClickedSlot(int id){
    if(id == 1){
        QMessageBox::question(this,"question","你今晚吃饭吗?");
    }else if(id == 2){
        QMessageBox::information(this,"information","你今晚要吃饭!");
    }else if(id == 3){
        QMessageBox::warning(this,"warning","一顿不吃饿得慌!");
    }else if(id == 4){
        QMessageBox::critical(this,"critical","顿顿不吃要完蛋!");
}
}
Dialog::~Dialog()
{
    delete group;
    delete ui;
}

 ui:

 运行结果:

在question中加问题

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QButtonGroup>
#include <QtWidgets> //包含所有组件和窗口的头文件
#include <QDebug>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QButtonGroup *group;

private slots:
    void btnsClickedSlot(int); //按钮点击的槽函数
};

#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);
    group = new QButtonGroup(this);
    group->addButton(ui->pushButtonQ,1);
    group->addButton(ui->pushButtonI,2);
    group->addButton(ui->pushButtonW,3);
    group->addButton(ui->pushButtonC,4);

    connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));

}
void Dialog::btnsClickedSlot(int id){
    if(id == 1){
        QMessageBox::StandardButton result = QMessageBox::question(this,"question","你今晚吃饭吗?");
        if(result == QMessageBox::Yes)
            qDebug()<<"吃了!";
        else if(result == QMessageBox::No)
            qDebug()<<"没吃!";
    }else if(id == 2){
        QMessageBox::information(this,"information","你今晚要吃饭!");
    }else if(id == 3){
        QMessageBox::warning(this,"warning","一顿不吃饿得慌!");
    }else if(id == 4){
        QMessageBox::critical(this,"critical","顿顿不吃要完蛋!");
}
}
Dialog::~Dialog()
{
    delete group;
    delete ui;
}

 

 

2. 窗口类继承关系**

窗口类的继承关系如下所示。

QWidget类作为窗口和组件的基类,其内部定义了窗口和组件的基本功能,本节展示一部分作为窗口类的基类所拥有的API:

// 设置窗口状态
// 参数为窗口状态值
void QWidget::setWindowState(Qt::WindowStates windowState)

// 设置窗口标记 
// 参数为窗口标记值,多个值之间可以使用|分割,以实际效果为准 
void setWindowFlags(Qt::WindowFlags type)

dialog.cpp

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

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 设置全屏显示
//    setWindowState(Qt::WindowFullScreen);
    // 设置欢迎页效果
    setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
}

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

QWidget类本身作为所有窗口和组件的基类,QWidget既可以作为窗口对象进行创建,又可以作为组件对象进行创建。

QWidget的构造函数的parent参数传递了一个窗口对象时,此时QWidget会成为这个窗口对象内部的组件。如果不传递此参数,QWidget对象会成为一个独立窗口。

3. QMainWindow 主窗口类**

QMainWindow是最合适做主窗口的类型,因为它包含多个组成部分。

3.1 QMenuBar 菜单栏

菜单栏的组成部分如下所示。

QAction支持信号槽的连接,其信号函数如下。

除了在Designer中添加菜单栏和配置QAction的内容,也可以在C++代码中添加。

3.2 QToolBar 工具栏

当使用Action编辑器设置了QAction的图标后,可以直接拖拽到QToolBar变为工具栏按钮。

工具栏所有的操作也都可以在C++代码中找到对应API。

3.3  QWidget 中心组件

见本章第2节中QWidget作为组件使用时的说明。

3.4 QStatusBar 状态栏

状态栏主要用于显示软件的相关辅助信息,可以使用预设的样式(比较简单),也可以自定义样式。本次以预设的样式为例进行讲解。

主要的函数如下所示。

// 显示信息
// 参数1:信息内容
// 参数2:显示时长,单位毫秒,如果为0(默认值)表示持续显示
void QStatusBar::showMessage(const QString & message, int timeout = 0) [slot]
// 清空信息
void QStatusBar::clearMessage() [slot]

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    // QAction点击后触发的槽函数
    void triggeredSlot();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    // 连接信号槽
    connect(ui->actionOpen,SIGNAL(triggered()),
            this,SLOT(triggeredSlot()));
    // 设置状态栏内容
    ui->statusBar->showMessage("哈哈哈哈",3000);
}

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

void MainWindow::triggeredSlot()
{
    // 设置一点显示效果
    ui->plainTextEdit->setPlainText("这是随便设置的内容");
}

ui界面:

 运行结果:

 

4. parent参数**

几乎所有的Qt类的构造函数都有一个parent参数,实际上parent参数是Qt的一种内存管理策略。parent参数会作为新创建对象的父对象存在,当父对象销毁时,会一并销毁子对象。

建议在绝大多数情况下,传递parent参数,防止内存泄漏。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDebug>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    //两个按钮点击的槽函数
    void btn1ClickedSlot();
    void btn2ClickedSlot();
};

#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(ui->pushButton_1,SIGNAL(clicked()),this,SLOT(btn1ClickedSlot()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(btn2ClickedSlot()));
}

Dialog::~Dialog()
{
    qDebug()<<"析构函数";
    delete ui;
}

void Dialog::btn1ClickedSlot()
{
    Dialog* d = new Dialog(this);
    d->show();
}

void Dialog::btn2ClickedSlot()
{
    Dialog* d = new Dialog;
    d->show();
}
 
       

 

 哪个最后关,哪个调出析构函数

 

5. 自定义窗口类**

截止到当前,Qt项目中从来没有完整地创建过一个自定义的窗口类,要么使用的是项目创建后自带的窗口类,要么使用Qt内置的窗口类QMessageBox。

在项目中创建一个Qt的自定义窗口类的操作步骤如下所示。

1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。

2. 在弹出的窗口中,按照下图所示进行操作。

3. 在弹出的窗口中选择窗口的模板样式后,点击“下一步”。

4. 在弹出的窗口中给类命名后,点击下一步。

5. 在项目管理界面点击“完成”。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include "mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    void btnClickedSlot(); // 单击按钮的槽函数
};

#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(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}

void Dialog::btnClickedSlot()
{
    // 创建并启动MyDialog窗口
    MyDialog* md = new MyDialog(this);
    md->show();
    // 屏蔽按钮
    ui->pushButton->setEnabled(false);
}

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

6. 跨界面参数传递**

6.1 主窗口→子窗口

这种情况可以使用子窗口的构造函数/成员函数传参。

【例子】转动主窗口的QDial,使子窗口的QDial跟着一起转动。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include "mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    MyDialog* md;

private slots:
    void btnClickedSlot(); // 单击按钮的槽函数
    void valueChangedSlot(int); // QDial数值变化的槽函数
};

#endif // DIALOG_H

dialoh.cpp

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

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

    // 连接信号槽
    connect(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}

void Dialog::btnClickedSlot()
{
    // 创建并启动MyDialog窗口
    // 参数1:当前主窗口的QDial数值
    md = new MyDialog(ui->dial->value(),this);
    // 建立QDial的信号槽
    connect(ui->dial,SIGNAL(valueChanged(int)),
           this,SLOT(valueChangedSlot(int)));
    md->show();
    // 屏蔽按钮
    ui->pushButton->setEnabled(false);
}

void Dialog::valueChangedSlot(int value)
{
    // 给子窗口设定参数值
    md->setDialValue(value);
}

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

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    // 增加参数位
    explicit MyDialog(int,QWidget *parent = 0);
    ~MyDialog();
    // 增加成员函数
    void setDialValue(int);

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

mydialog.cpp

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

MyDialog::MyDialog(int value,QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    // 设置QDial的初始值
    ui->dial->setValue(value);
}

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

void MyDialog::setDialValue(int value)
{
    // 设置QDial的变化值
    ui->dial->setValue(value);
}

6.2 子窗口→主窗口

这种情况可以使用信号槽传参,子窗口发射带参数自定义信号给主窗口的槽函数接收。

【例子】转动子窗口的QDial,使主窗口的QDial跟着一起转动。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include "mydialog.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    void btnClickedSlot(); // 单击按钮的槽函数
    // 与子窗口中的自定义信号连接
    void valueSlot(int);
};

#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(ui->pushButton,SIGNAL(clicked()),
            this,SLOT(btnClickedSlot()));
}

void Dialog::btnClickedSlot()
{
    // 创建并启动MyDialog窗口
    MyDialog* md = new MyDialog(this);
    // 建立两个窗口对象之间的信号槽
    connect(md,SIGNAL(valueSignal(int)),
            this,SLOT(valueSlot(int)));
    md->show();
    // 屏蔽按钮
    ui->pushButton->setEnabled(false);
}

void Dialog::valueSlot(int value)
{
    // 更新到组件上
    ui->dial->setValue(value);
}

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

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = 0);
    ~MyDialog();

private:
    Ui::MyDialog *ui;

private slots:
    // QDial转动的槽函数
    void valueChangedSlot(int);

signals:
    // 带参数的自定义信号
    void valueSignal(int);

};

#endif // MYDIALOG_H

mydialog.cpp

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

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

    connect(ui->dial,SIGNAL(valueChanged(int)),
            this,SLOT(valueChangedSlot(int)));
}

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

void MyDialog::valueChangedSlot(int value)
{
    // 发送到主窗口!
    emit valueSignal(value);
}

7. 事件函数**

事件函数的使用依托于Qt的事件机制,一个来自于外部事件的传递机制模型如下所示。

信号槽虽然好用,但是无法包含所有的情况,事件函数可以起到对信号槽无法覆盖的一些时机进行补充。事件函数的使用无需连接。

常用的事件函数如下所示。

// 绘制事件
void QWidget::paintEvent(QPaintEvent * event) [virtual protected] 
// 大小改变事件
void QWidget::resizeEvent(QResizeEvent * event) [virtual protected] 
// 鼠标按压事件
void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected]
// 鼠标释放事件
void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected]
// 鼠标双击事件
void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected]
// 鼠标移动事件
void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected]
// 移动事件
void QWidget::moveEvent(QMoveEvent * event) [virtual protected]
// 按键按压事件
void QWidget::keyPressEvent(QKeyEvent * event) [virtual protected]
// 按键释放事件
void QWidget::keyReleaseEvent(QKeyEvent * event) [virtual protected]
// 获取焦点事件
void QWidget::focusInEvent(QFocusEvent * event) [virtual protected]
// 失去焦点事件
void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected]
// 关闭事件
void QWidget::closeEvent(QCloseEvent * event) [virtual protected]
// 进入事件
void QWidget::enterEvent(QEvent * event) [virtual protected]
void QWidget::leaveEvent(QEvent * event) [virtual protected]

QPaintDevice类表示可绘制设备,其派生类均可以被QPainter类绘制。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDebug>
#include <QPixmap> // 图片类
#include <QPainter> // 画家类

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

protected:
    // 声明事件函数
    void paintEvent(QPaintEvent * event);

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;
}

// 定义事件函数
void Dialog::paintEvent(QPaintEvent *)
{
    // 输出窗口宽高
    qDebug() << this->width() << this->height();
    // 创建画家类对象
    QPainter painter(this);
    QPixmap pic(":/new/prefix1/ikun.jpg");

    // 绘制图片函数
    // void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)
    // 参数1:横坐标
    // 参数2:纵坐标
    // 参数3:宽度
    // 参数4:高度
    // 参数5:图片内容
    painter.drawPixmap(0,0,width(),height(),pic);
}

运行结果:

 dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDebug>
#include <QPixmap> // 图片类
#include <QPainter> // 画家类
#include <QKeyEvent> // 键盘事件参数

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

protected:
    // 声明事件函数
    void paintEvent(QPaintEvent * event);
    void keyPressEvent(QKeyEvent * event);

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;
}

// 定义事件函数
void Dialog::paintEvent(QPaintEvent *)
{
    // 输出窗口宽高
    qDebug() << this->width() << this->height();
    // 创建画家类对象
    QPainter painter(this);
    QPixmap pic(":/new/prefix1/ikun.jpg");

    // 绘制图片函数
    // void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)
    // 参数1:横坐标
    // 参数2:纵坐标
    // 参数3:宽度
    // 参数4:高度
    // 参数5:图片内容
    painter.drawPixmap(0,0,width(),height(),pic);
}

// 所有的事件函数的参数都包含了当前类型事件的参数信息
void Dialog::keyPressEvent(QKeyEvent *event)
{
    // 判断按键按哪个
    if(event->key() == Qt::Key_A) // 获得按键码之后进行比对
    {
        // 获得当前进度条的值
        int value = ui->progressBar->value();
        // 减小进度条的值
        ui->progressBar->setValue(--value);
    }else if(event->key() == Qt::Key_D)
    {
        // 获得当前进度条的值
        int value = ui->progressBar->value();
        // 减小进度条的值
        ui->progressBar->setValue(++value);
    }
}

运行结果:

 

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

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

相关文章

合并日志树——LSM Tree

一、背景 大数据情景下&#xff0c;需要巨量的读写数据&#xff0c;即良好的IO效率。传统的B树以及其变种无法满足&#xff0c;因为它的读写在物理上是随机的&#xff0c;这样IO的效率就不高。于是便有了LSM(log_structed_merge_tree) 合并日志树这个设计思想或者说存储结构。…

【亲测好用】解决 OneDrive 同步被挂起

本教程演示了如何以 2 种有效方式修复 OneDrive 同步被挂起错误。如果您被这个问题困扰&#xff0c;可以在本文中找到适合您的方法。 “如何处理 OneDrive 同步被挂起问题&#xff1f; 我的 OneDrive 存在同步问题。即使任务栏上的 OneDrive 图标指示同步完毕状态&#xff0c;某…

导出/入表数据

1、连接mysql导出2、使用mysqldump导出3、mysql命令导出load data导入mysqlimport命令导入 1、连接mysql导出 select columnList from tableName where conditions into outfile fileName [options]-- fileName 默认是secure-file-priv路径 -- options lines必须置于fields后…

git status和git push扩展脚本

git status和git push扩展脚本 1、对git status扩展使用方法 我们先来看看效果&#xff1a; 在之前的时候&#xff0c;我是用git status 查看工作区的变化&#xff0c;我想看某个文件的变化必须使用git diff file_abs_path&#xff0c;必须要输入文件的相对目录。每次都输入我…

计及N-k安全约束的含光热电站电力系统优化调度模型【IEEE14节点、118节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

别再无脑背八股文了

大家好&#xff0c;我是帅地。 记得两年前我参加校招的时候&#xff0c;还没怎么听过八股文这个词&#xff0c;这两年&#xff0c;到处是八股文&#xff0c;可见校招是越来越激烈了。 有些人可能还不知道八股文是啥&#xff0c;八股文其实就是指面试中那些经常被问到的基础知…

前端009_类别模块_修改功能

第九章 1、需求分析2、Mock添加查询数据3、Mock修改数据4、Api调用回显数据5、提交修改后的数据6、效果1、需求分析 需求分析 当点击 编辑 按钮后,弹出编辑窗口,并查询出分类相关信息进行渲染。修改后点击 确定 提交修改后的数据。 2、Mock添加查询数据 请求URL: /article/…

面试篇:多线程

一、线程和进程的区别&#xff1f; 1、进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理I…

PySpark基础入门(8):Spark SQL(内容补充)

目录 SparkSQL Shuffle 分区数目 SparkSQL 数据清洗API dropDuplicates dropna fillna SparkSQL函数定义&#xff08;UDF函数&#xff09; SparkSQL 使用窗口函数 SparkSQL运行流程 SparkSQL的自动优化 Catalyst优化器 SparkSQL Shuffle 分区数目 在SparkSQL中&…

无魔法插件 - ChatGPT Sidebar with GPT-4

文章目录 1.介绍2.功能一览2.1 唤醒方式2.2 聊天功能2.3 快捷模板2.4 单独聊天界面2.5 ChatPDF2.6 任意位置快捷使用模板2.7 手机 APP 3.GPT-3.0 还是 GPT-3.5&#xff1f;4.免费 or 收费&#xff1f;5.安装 Sidebar 创作不易&#xff0c;如果本文对你有帮助&#xff0c;胖友记…

SpringCloud(22):Sentinel对Feign的支持

Sentinel 适配了 Feign组件。如果想使用&#xff0c;除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2个步骤&#xff1a; 配置文件打开 Sentinel 对 Feign 的支持&#xff1a;feign.sentinel.enabledtrue加入 spring-cloud-starter-openfeign 依赖使 Sentin…

springboot 整合redis

第一步&#xff1a;pom.xml文件导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.5.4</version> </dependency 第二步&#xff1a;appli…

【iOS】—— NSProxy类

NSProxy 文章目录 NSProxyNSProxy简介NSProxy模拟多继承NSProxy 避免NSTimer循环引用 在学消息转发的时候看到过这个类&#xff0c;本来没打算细看&#xff0c;后来看学长博客循环引用的时候也看到了这个类&#xff0c;就来细看看。 NSProxy简介 NSProxy 是一个实现了 NSObjec…

在线病毒分析工具评测试用

总览 1 区分在线杀毒引擎与在线沙盒 在线杀毒引擎用的大多是国际上出名的杀毒厂商的引擎作为底层&#xff0c;对文件进行扫描&#xff0c;结论通常会反馈“无毒”或者杀毒引擎自己的代码。 在线沙盒用云端的机器跑一次程序&#xff0c;然后收集程序的相关信息。 两者各有与…

情感分析讲解

情感分析简述 情感分析(Sentiment Analysis)又称倾向性分析&#xff0c;或意见挖掘&#xff0c;它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。利用情感分析能力&#xff0c;可以针对带有主观描述的自然语言文本&#xff0c;自动判断该文本的情感正负倾向…

MongoDB 聚合操作Map-Reduce

这此之前已经对MongoDB中的一些聚合操作进行了详细的介绍&#xff0c;主要介绍了聚合方法和聚合管道&#xff1b;如果您想对聚合方法和聚合管道进行了解&#xff0c;可以参考&#xff1a; MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022…

ClickHouse为何能超越Elasticsearch?

背景 Elasticsearch是一个强大的分布式全文检索和数据分析引擎&#xff0c;也是日志分析系统经常使用的一种实现方案&#xff0c;但近年来随着ClickHouse的发展&#xff0c;Elasticsearch在日志分析领域的地位逐渐被取代&#xff0c;许多公司已经将自己的日志分析解决方案从ES…

games101作业1

作业1的大致要求就是让我们实现如下两个函数&#xff0c;一个是返回在三维空间中绕着Z轴旋转的矩阵&#xff0c;另一个是返回投影矩阵。正确完成这两个函数之后&#xff0c;运行代码你就会在窗口中看到一个三角形&#xff0c;并且按a键和d键会发生旋转。 首先来实现get_model_m…

RuleApp1.4.0 文章社区客户端

简介&#xff1a; 可以打包成安卓&#xff0c;苹果&#xff0c;h5&#xff0c;小程序&#xff0c;全新的版本增加了私聊和群聊&#xff0c;动态模块等&#xff0c;还有自动和手动封禁机制。[滑稽][滑稽]主要模块&#xff1a;用户模块&#xff0c;文章模块&#xff0c;动态模块…

国产服务器tomcat开机自启

目录结构 前言方法一方法二方法三参考连接 前言 国产服务器配置tomcat开机自启动&#xff1b;目前测试两种服务器 银河麒麟&#xff08;Linux localhost.localdomain 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64 x86_64 x86_64 GNU/Linux&am…