QListView的使用(正逆序插入)

news2024/11/25 16:22:45

请添加图片描述
首先在介绍QListView之前,先说一下QListView和QListWidget的区别:
1、QListView是model(模型/视图)表格类型,QListWidget它是Item表格类型。
2、QListView使用较复杂,一般需要配合数据模型QAbstractListModel和item代理QStyledItemDelegate来使用。而QListWidget使用简单,只需要配合QListWidgetItem来使用。
3、QListView在大批量数据操作的场景下比QListTable快很多。原因是QListWidget它的数据都绑定了一个Item控件,数据较多时,对Item操作就较多。而QListView的数据就只绑定了一个代理,大批量数据操作时,只在代理中绘制这些数据。

了解它们的区别后,现在我们来详细了解下QListView它的使用方法。
QListView由于它是模型/视图的结构,所以它的数据交给了QAbstractListModel来处理,它的视图交给了QStyledItemDelegate来处理。
QAbstractListModel常用函数:

//获取指定行列的model项,model项可以用来获取数据。
virtual QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const = 0;
//行数
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
//列数
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
//获取当前index位置的数据
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
//设置数据
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//插入多行
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
//插入多列
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
//删除多行
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
//删除多列
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
//插入行
bool insertRow(int row, const QModelIndex &parent = QModelIndex());
//插入列
bool insertColumn(int column, const QModelIndex &parent = QModelIndex());
//删除行
bool removeRow(int row, const QModelIndex &parent = QModelIndex());
//删除列
bool removeColumn(int column, const QModelIndex &parent = QModelIndex());
//更新数据
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector());
//指定起始插入位置插入,该方法一般用于重写InsertRows后调用。
// void beginInsertRows(const QModelIndex &parent, int first, int last);
//结束插入
void endInsertRows();
//指定起始插入位置删除,该方法一般用于重写removRows后调用
void beginRemoveRows(const QModelIndex &parent, int first, int last);
//结束删除
void endRemoveRows();

QStyledItemDelegate常用函数

//绘制Index项Ui
void paint(QPainter *painter,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
//设置index项大小
QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const override;
//捕获index位置上的事件。
bool editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index);

QListView使用方法,首先需要加载Model和delegate。

    m_listView->setItemDelegate(&m_delegate);
    m_listView->setModel(&m_model);

然后继承QStyledItemDelegate进行绘制
//头文件

class MStyleItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    MStyleItemDelegate();

    void paint(QPainter *painter,
               const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const override;
    bool editorEvent(QEvent *event, QAbstractItemModel *model,
                     const QStyleOptionViewItem &option, const QModelIndex &index);

};

//cpp文件

MStyleItemDelegate::MStyleItemDelegate()
{

}

void MStyleItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (!index.isValid())
        return;
    //取数据
    QString id = index.data(Qt::UserRole + 1).toString();
    QString name = index.data(Qt::UserRole + 2).toString();
    QString age = index.data(Qt::UserRole + 3).toString();

    QStyleOptionViewItem viewoption(option);
    initStyleOption(&viewoption, index);
    if (option.state.testFlag(QStyle::State_HasFocus))
    {
        viewoption.state = viewoption.state ^ QStyle::State_HasFocus;
        painter->setBrush(QBrush(QColor("#234567")));
        painter->drawRect(option.rect);
    }
    else if (option.state.testFlag(QStyle::State_MouseOver))
    {
        painter->setBrush(QBrush(QColor("#543234")));
        painter->drawRect(option.rect);
    }
    QStyledItemDelegate::paint(painter, viewoption, index);

    //绘制文本
    painter->save();

    QRectF rect;
    rect.setX(option.rect.x());
    rect.setY(option.rect.y());
    rect.setWidth(option.rect.width() - 1);
    rect.setHeight(option.rect.height() - 1);

    //设置字体,颜色
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(12);
    painter->setFont(font);

    QRect textRect1(rect.left() + 10, rect.top() + TOP_MARGIN, option.widget->width()/3, HEIGHT);
    QRect textRect2(option.widget->width()/4, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());
    QRect textRect3(option.widget->width()/4*2, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());
    QRect delRect(option.widget->width()/4*3, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());

    painter->setPen(QPen(TEXT_COLOR));
    painter->setFont(QFont("Arial", TEXT_SIZE));

    painter->drawText(textRect1, Qt::AlignLeft, QString::number(index.row()));
    painter->drawText(textRect2, Qt::AlignLeft, name);
    painter->drawText(textRect3, Qt::AlignLeft, age);
    painter->drawText(delRect, Qt::AlignLeft, "删除");

    //设置线的颜色
    painter->setPen(QPen(QColor(LINE_COLOR)));
    painter->drawLine(QPointF(0, rect.bottom() - 1), QPointF(rect.width(), rect.bottom() -1));

    painter->restore();
}

//item大小
QSize MStyleItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(index);
    return QSize(option.rect.width(), LISTVIEW_ITEM_HIGHT);
}

bool MStyleItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    QRect rect = option.rect;

    //获取checkbox的rect
    QRect checboxRec(rect.right() - rect.width()/4, rect.top(), rect.height(), rect.width()/4);

    //按钮点击事件,点击坐标是否在rect内
    QMouseEvent* mevent = static_cast<QMouseEvent*>(event);
    if (checboxRec.contains(mevent->pos()) && event->type() == QEvent::MouseButtonPress)
    {
//        model->setData(index, "No", Qt::UserRole + 1);
//        model->dataChanged(index, index);
        model->removeRows(index.row(),1,index);
    }

    return QStyledItemDelegate::editorEvent(event, model, option, index);
}


然后继承QAbstractListModel进行数据处理
头文件

class MListModel : public QAbstractListModel
{
    Q_OBJECT
public:
    MListModel();
    ~MListModel();
    void addRow(QVector<ListData> datas, int row, int count, const QModelIndex &parent = QModelIndex());
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
    int rowCount(const QModelIndex& parent = QModelIndex()) const;
    void setInsertOrder(int type = 0);
    int getInsertOrder(){return m_insertOrder;}
private:
    QVector<ListData> m_ListDataVec;
    int m_insertOrder = 0;
};

cpp文件

MListModel::MListModel()
{

}

MListModel::~MListModel()
{

}

void MListModel::setInsertOrder(int type)
{
    m_insertOrder = type;
}

void MListModel::addRow(QVector<ListData> datas, int row, int count, const QModelIndex &parent)
{
    for (int i = 0; i < count; ++i) {
        if (m_insertOrder)
            m_ListDataVec.append(datas[i]);
        else
            m_ListDataVec.prepend(datas[i]);
    }
    insertRows(row,count,parent);
}

bool MListModel::insertRows(int row, int count, const QModelIndex &parent)
{
    if (count < 1 || row < 0 || row > rowCount(parent))
        return false;

    beginInsertRows(parent,row,row + count - 1);
    endInsertRows();

    return true;
}

bool MListModel::removeRows(int row, int count, const QModelIndex &parent)
{
    if (count <= 0 || row < 0 || (row + count) > rowCount(parent))
        return false;

    beginRemoveRows(parent, row, row + count - 1);

    const auto it = m_ListDataVec.begin() + row;
    m_ListDataVec.erase(it, it + count);

    endRemoveRows();

    return true;
}

QVariant MListModel::data(const QModelIndex &index, int role) const
{
    QVariant bRet;
    int nRow = index.row();
    if (nRow >= m_ListDataVec.size() || (!index.isValid()))
        return false;
    ListData data = m_ListDataVec[nRow];

    switch (role) {
    case Qt::UserRole + 1:
        bRet = data.id;
        break;
    case Qt::UserRole+2:
        bRet = data.name;
        break;
    case Qt::UserRole+3:
        bRet = data.age;
        break;
    default:
        break;
    }
    return bRet;
}

bool MListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool bRet = false;
    int nRow = index.row();
    if (nRow >= m_ListDataVec.size() || (!index.isValid()))
        return false;
    ListData data = m_ListDataVec[nRow];

    switch (role) {
    case Qt::UserRole + 1:
        data.id = value.toString();
        bRet = true;
        break;
    case Qt::UserRole+2:
        data.name = value.toString();
        bRet = true;
    case Qt::UserRole+3:
        data.age = value.toString();
        bRet = true;
    default:
        break;
    }
    m_ListDataVec.replace(nRow,data);
    return bRet;
}

int MListModel::rowCount(const QModelIndex &parent) const
{
    return m_ListDataVec.size();
}

注意有些函数后面带有一些const、override的关键字,这些必须带上,否则可能出现paint不绘制的情况。
完整代码
头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QAbstractListModel>
#include <QStyledItemDelegate>
#include <QListView>
#include <QPainter>
#include <QMouseEvent>

//文字的高、宽及坐标点
#define LEFT_MARGIN 270
#define TOP_MARGIN 10
#define HEIGHT 50

//每个 item 的高度
#define LISTVIEW_ITEM_HIGHT 50
//分割 item 的线的颜色
#define LINE_COLOR "#ad2233"
//文字的颜色
#define TEXT_COLOR "#130c0e"
//文字的大小
#define TEXT_SIZE 12
struct ListData
{
    QString id;
    QString name;
    QString age;
};


class MListModel : public QAbstractListModel
{
    Q_OBJECT
public:
    MListModel();
    ~MListModel();
    void addRow(QVector<ListData> datas, int row, int count, const QModelIndex &parent = QModelIndex());
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
    int rowCount(const QModelIndex& parent = QModelIndex()) const;
    void setInsertOrder(int type = 0); //正逆序
    int getInsertOrder(){return m_insertOrder;}
private:
    QVector<ListData> m_ListDataVec;
    int m_insertOrder = 0;
};

class MStyleItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    MStyleItemDelegate();

    void paint(QPainter *painter,
               const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const override;
    bool editorEvent(QEvent *event, QAbstractItemModel *model,
                     const QStyleOptionViewItem &option, const QModelIndex &index);

};

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
    void timerEvent(QTimerEvent *event);
private:
    QListView* m_listView = nullptr;
    MListModel m_model;
    MStyleItemDelegate m_delegate;
    bool m_start = false;
};




#endif // WIDGET_H

cpp文件

#include "widget.h"
#include <QGridLayout>
#include <QLabel>
#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    QGridLayout* lay = new QGridLayout(this);
    m_listView = new QListView(this);
    QLabel* lab1 = new QLabel("ID",this);
    QLabel* lab2 = new QLabel("NAME",this);
    QLabel* lab3 = new QLabel("AGE",this);
    QPushButton* btn = new QPushButton("start",this);

    m_listView->setItemDelegate(&m_delegate);
    m_listView->setModel(&m_model);
    m_listView->setViewMode(QListView::ListMode);      //设置Item显示模式为列表显示,也可是Icon模式,枚举值
    m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_listView->setDragEnabled(false);                 //控件不允许拖动
    m_model.setInsertOrder(0);

    lay->addWidget(btn,0,0,1,1);
    lay->addWidget(lab1,1,0,1,1);
    lay->addWidget(lab2,1,1,1,1);
    lay->addWidget(lab3,1,2,1,1);
    lay->addWidget(m_listView,2,0,10,4);
    lay->setSpacing(0);
    setLayout(lay);

    connect(btn,&QPushButton::clicked,this,[=]()
    {
       if (!m_start)
           m_start = true;
       else
           m_start = false;
    });
    startTimer(500);
}

Widget::~Widget()
{
}

void Widget::timerEvent(QTimerEvent *event)
{
    if (m_start)
    {
        int row = m_model.rowCount();
        ListData data;
        data.id = QString::number(row);
        data.name = "name"+QString::number(row);
        data.age = "age"+QString::number(row);
        QVector<ListData> datas;
        datas.append(data);
        m_model.addRow(datas,row,1);

        if (m_model.getInsertOrder() == 1)
            m_listView->scrollToBottom();
    }
}

MListModel::MListModel()
{

}

MListModel::~MListModel()
{

}

void MListModel::setInsertOrder(int type)
{
    m_insertOrder = type;
}

void MListModel::addRow(QVector<ListData> datas, int row, int count, const QModelIndex &parent)
{
    for (int i = 0; i < count; ++i) {
        if (m_insertOrder)
            m_ListDataVec.append(datas[i]);
        else
            m_ListDataVec.prepend(datas[i]);
    }
    insertRows(row,count,parent);
}

bool MListModel::insertRows(int row, int count, const QModelIndex &parent)
{
    if (count < 1 || row < 0 || row > rowCount(parent))
        return false;

    beginInsertRows(parent,row,row + count - 1);
    endInsertRows();

    return true;
}

bool MListModel::removeRows(int row, int count, const QModelIndex &parent)
{
    if (count <= 0 || row < 0 || (row + count) > rowCount(parent))
        return false;

    beginRemoveRows(parent, row, row + count - 1);

    const auto it = m_ListDataVec.begin() + row;
    m_ListDataVec.erase(it, it + count);

    endRemoveRows();

    return true;
}

QVariant MListModel::data(const QModelIndex &index, int role) const
{
    QVariant bRet;
    int nRow = index.row();
    if (nRow >= m_ListDataVec.size() || (!index.isValid()))
        return false;
    ListData data = m_ListDataVec[nRow];

    switch (role) {
    case Qt::UserRole + 1:
        bRet = data.id;
        break;
    case Qt::UserRole+2:
        bRet = data.name;
        break;
    case Qt::UserRole+3:
        bRet = data.age;
        break;
    default:
        break;
    }
    return bRet;
}

bool MListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool bRet = false;
    int nRow = index.row();
    if (nRow >= m_ListDataVec.size() || (!index.isValid()))
        return false;
    ListData data = m_ListDataVec[nRow];

    switch (role) {
    case Qt::UserRole + 1:
        data.id = value.toString();
        bRet = true;
        break;
    case Qt::UserRole+2:
        data.name = value.toString();
        bRet = true;
    case Qt::UserRole+3:
        data.age = value.toString();
        bRet = true;
    default:
        break;
    }
    m_ListDataVec.replace(nRow,data);
    return bRet;
}

int MListModel::rowCount(const QModelIndex &parent) const
{
    return m_ListDataVec.size();
}



MStyleItemDelegate::MStyleItemDelegate()
{

}

void MStyleItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (!index.isValid())
        return;
    //取数据
    QString id = index.data(Qt::UserRole + 1).toString();
    QString name = index.data(Qt::UserRole + 2).toString();
    QString age = index.data(Qt::UserRole + 3).toString();

    QStyleOptionViewItem viewoption(option);
    initStyleOption(&viewoption, index);
    if (option.state.testFlag(QStyle::State_HasFocus))
    {
        viewoption.state = viewoption.state ^ QStyle::State_HasFocus;
        painter->setBrush(QBrush(QColor("#234567")));
        painter->drawRect(option.rect);
    }
    else if (option.state.testFlag(QStyle::State_MouseOver))
    {
        painter->setBrush(QBrush(QColor("#543234")));
        painter->drawRect(option.rect);
    }
    QStyledItemDelegate::paint(painter, viewoption, index);

    //绘制文本
    painter->save();

    QRectF rect;
    rect.setX(option.rect.x());
    rect.setY(option.rect.y());
    rect.setWidth(option.rect.width() - 1);
    rect.setHeight(option.rect.height() - 1);

    //设置字体,颜色
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(12);
    painter->setFont(font);

    QRect textRect1(rect.left() + 10, rect.top() + TOP_MARGIN, option.widget->width()/3, HEIGHT);
    QRect textRect2(option.widget->width()/4, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());
    QRect textRect3(option.widget->width()/4*2, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());
    QRect delRect(option.widget->width()/4*3, rect.top() + TOP_MARGIN, option.widget->width()/4, rect.height());

    painter->setPen(QPen(TEXT_COLOR));
    painter->setFont(QFont("Arial", TEXT_SIZE));

    painter->drawText(textRect1, Qt::AlignLeft, QString::number(index.row()));
    painter->drawText(textRect2, Qt::AlignLeft, name);
    painter->drawText(textRect3, Qt::AlignLeft, age);
    painter->drawText(delRect, Qt::AlignLeft, "删除");

    //设置线的颜色
    painter->setPen(QPen(QColor(LINE_COLOR)));
    painter->drawLine(QPointF(0, rect.bottom() - 1), QPointF(rect.width(), rect.bottom() -1));

    painter->restore();
}

//item大小
QSize MStyleItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(index);
    return QSize(option.rect.width(), LISTVIEW_ITEM_HIGHT);
}

bool MStyleItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    QRect rect = option.rect;

    //获取checkbox的rect
    QRect checboxRec(rect.right() - rect.width()/4, rect.top(), rect.height(), rect.width()/4);

    //按钮点击事件,点击坐标是否在rect内
    QMouseEvent* mevent = static_cast<QMouseEvent*>(event);
    if (checboxRec.contains(mevent->pos()) && event->type() == QEvent::MouseButtonPress)
    {
//        model->setData(index, "No", Qt::UserRole + 1);
//        model->dataChanged(index, index);
        model->removeRows(index.row(),1,index);
    }

    return QStyledItemDelegate::editorEvent(event, model, option, index);
}

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

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

相关文章

【Linux】公网环境下Ubuntu系统SSH远程树莓派

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初…

Nginx与Tomcat的区别,什么是HTTP服务器(处理静态资源的服务器),什么是处理动态资源的服务器

Nginx和Tomcat都是常用的Web服务器&#xff0c;但它们的主要作用不同。Nginx是一个HTTP服务器&#xff0c;反向代理服务器和通用TCP/UDP代理服务器。它通常用于静态内容、媒体流和负载均衡。在高流量和高并发负载下&#xff0c;Nginx表现更出色&#xff0c;并且能够轻松处理静态…

解决android studio妙明奇妙出现的模拟器

1&#xff0c;查看设备 adb devices 2&#xff0c; adb命令断开指定的设备 要断开ADB与特定设备的连接&#xff0c;可以使用以下命令&#xff1a; adb disconnect <设备ID> 将 <设备ID> 替换为您要断开连接的设备的实际ID。设备ID可以在运行 adb devices 命令…

C语言刷题------(2)

C语言刷题——————&#xff08;2&#xff09; 刷题网站&#xff1a;题库 - 蓝桥云课 (lanqiao.cn) First Question&#xff1a;时间显示 题目描述 小蓝要和朋友合作开发一个时间显示的网站。 在服务器上&#xff0c;朋友已经获取了当前的时间&#xff0c;用一个整数表…

Ansible的安装和配置

安装和配置 Ansible 安装所需的软件包 创建名为 /home/greg/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; 172.25.250.9 是 dev 主机组的成员 172.25.250.10 是 test 主机组的成员 172.25.250.11 和 172.25.250.12 是 prod 主机组的成员 172.2…

电测知识分享——10分钟学会!超火网络应用测试教程来了,火速收藏

在当今的网络应用中&#xff0c;当属以太网最流行&#xff0c;特别是终端电脑的连接几乎是以太网的天下&#xff0c;即使无线网卡最终也是以太网协议。终端网络分为有线以太网和无线WF,目前都形成了IEEE的标准。 今天&#xff0c;我们就来学习一下&#xff0c;1000M BASE-T&am…

war和war exploded

war和war exploded的区别 war模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b; war exploded模式&#xff1a;将WEB工程以当前文件夹的位置关系上传到服务器&#xff1b;>> war包是自己打包生成的&#xff0c;如pom文件中<packaging>war</packag…

【设计模式】责任链的基本概念及使用Predicate灵活构造校验链

文章目录 1. 概述1.1.背景1.2.责任链模式的概念 2.责任链的基本写法2.1.链表实现2.2.数组实现 3.Predicate校验链2.1.使用Predicate改写代码2.1.更丰富的条件拓展 4.总结 1. 概述 1.1.背景 在最近的开发中遇到了这么一个需求&#xff0c;需要对业务流程中的各个参数做前置校验…

社科院与杜兰大学能源管理硕士——环境不会改变,解决之道在于改变自己

随着社会经济的不断发展&#xff0c;职场竞争也愈发激烈、工作要求不断提高&#xff0c;许多从业人员既不想放弃工作&#xff0c;又想提升专业能力&#xff0c;深化对专业知识的理解&#xff0c;获取优质的证书。那么考研便是一个不错的方式。考研的专业有很多&#xff0c;我们…

dubbo之整合SpringBoot

目录 zookeeper安装 1.拉取ZooKeeper镜像 2.新建文件夹 3.挂载本地文件夹并启动服务 4.查看容器 5.进入容器&#xff08;zookeeper&#xff09; Dubbo Admin安装 1.下载dubbo-admin 2.zip包解压 3.修改配置文件 4.打包项目 5.启动jar 6.访问 构建项目 api模块 1.创建…

Tik Tok本土mcn怎么入驻,泰国市场发展概况分析!

近日&#xff0c;TikTok海外本土MCN机构“Ma Go”获得数千万级别的A轮融资&#xff0c;本轮融资由北太平投资独家投资。 2021年10月份&#xff0c;“Ma Go”曾获得过知名投资人以及网红朱一旦的千万级别融资。 Ma Go联合创始人倪泽铭表示&#xff0c;本轮融资将继续扩展申请找…

Jupyter Notebook 500 : Internal Server Error

1. 这个问题的根本原因在于&#xff1a; pygments 包 版本过高。 安装pygments 2.6.1 2.jupyter版本如下 如果某个版本有冲突&#xff0c;卸载了重新安装一下就行。 安装命令&#xff1a; pip install pygments 2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 另外…

GWJDN-400型2MHZ自动平衡高温介电温谱仪

GWJDN-400型2MHZ自动平衡高温介电温谱仪 GWJDN-400型2MHZ自动平衡高温介电温谱仪 关键词&#xff1a;介电常数&#xff0c;高温介电&#xff0c;自动平衡 主要功能&#xff1a; 材料介电常数测试仪 半导体材料的介电常数、导电率和C-V特性液晶材料:液晶单元的介电常数、弹性…

【Go语言】Golang保姆级入门教程 Go初学者chapter2

【Go语言】变量 VSCode插件 setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/imgmain/image-20…

自学python,学了又忘,感觉学不好是为啥呢

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 其实造成这样情况根本的…

途乐证券|科创板中签规则?新股中签后多久上市?

科创板是抢手的投资论题之一&#xff0c;满足条件的普通个人投资者也可以参与科创板新股申购&#xff0c;共享科创板市场盈利。那么&#xff0c;科创板中签有什么规矩&#xff1f;新股中签后多久上市&#xff1f;下面就和途乐证券一起来了解一下。 科创板中签规矩&#xff1f; …

(vue)获取对象的键遍历,同时循环el-tab页展示key及内容

(vue)获取对象的键遍历&#xff0c;同时循环el-tab页展示key及内容 效果&#xff1a; 数据结构&#xff1a; "statusData": {"订购广度": [ {"id": 11, "ztName": "广", …

如何使用Word转PDF转换器在线工具?在线Word转PDF使用方法

Word转PDF转换器在线&#xff0c;是一种方便快捷的工具&#xff0c;可帮助您在不需要下载任何软件的情况下完成此任务。无论您是需要在工作中共享文档&#xff0c;还是将文件以PDF格式保存以确保格式不变&#xff0c;都可以依靠这款在线工具轻松完成转换。那么如何使用Word转PD…

使用Openoffice或LibreOffice实现World、Excel、PPTX在线预览

使用Openoffice或LibreOffice实现World、Excel、PPTX在线预览 预览方案使用第三方服务使用前端库转换格式 jodconverterjodconverter概述主要特性OpenOfficeLibreOffice jodconverter的基本使用添加依赖配置创建DocumentConverter实例上传与转换预览启动上传与预览World 与Spri…

海外跨境购物商城汇率自动更新系统开发

要搭建一个海外跨境购物商城多货币汇率自动更新系统&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 选择合适的电子商务平台&#xff1a;选择一款适合海外跨境购物的电子商务平台。 2. 确定支付方式&#xff1a;选择支持多种货币支付的支付网关。确保支付网关支持自动汇…