Qt QTableWidget表格控件

news2024/12/26 12:08:17

文章目录

  • 1 属性和方法
    • 1.1 行列数目和行表头和列表头
    • 1.2 单元格
    • 1.3 隔行交替背景色
    • 1.4 选择模式和选择行为
    • 1.5 设置样式表
  • 2 实例
    • 2.1 布局
    • 2.2 代码实现

QTableWidget是Qt中的表格控件。

1 属性和方法

QTableWidget有很多属性和方法,完整的可查看帮助文档。

在窗口上放置一个QTableWidget控件后,既可以在设计师UI界面来编辑属性和添加数据,也可以在代码中动态地设置

这里列出常用的属性和方法

1.1 行列数目和行表头和列表头

表格控件的第一行称为行表头,用于设置每一列的标题,

表格控件的第一列称为列表头,用于设置每一行的标题,通常缺省则默认显示行号

设置和获取行列的数目

// 获取和设置行的数目
int rowCount() const;
void setRowCount(int rows);

// 获取和设置列的数目
int columnCount() const;
void setColumnCount(int columns);

设置行列表头

// 设置行表头
void setHorizontalHeaderLabels(const QStringList &labels);

// 设置列表头 - 通常不设置,则默认为行号
void setVerticalHeaderLabels(const QStringList &labels)

设置列的宽度

// 获取行表头
QHeaderView *horizontalHeader() const;

// 设置列的宽度
void QHeaderView::setSectionResizeMode(QHeaderView::ResizeMode mode);

其中ResizeMode是一个枚举,取值如下:

  • QHeaderView::Interactive 0 用户可拖动改变列宽
  • QHeaderView::Fixed 2 固定列宽
  • QHeaderView::Stretch 1 拉伸自适应列宽大小
  • QHeaderView::ResizeToContents 3 根据内容设置列宽

通常,先整体设置为QHeaderView::Stretch,然后根据需要对单独的列进行设置,如下:

// 1.先设置自适应宽度,再单独设置某一列的宽度规则
ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 先自适应宽度

// 2. 然后,单独设置某一列根据内容调整宽度,或者单独设置某一列为固定宽度
// ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);

ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->twStudent->setColumnWidth(0, 80);

1.2 单元格

每个网格单元称为一个单元格。每个单元格有一个行号、列号。

QTableWidget表格控件中,每一个单元格是一个QTableWidgetlitem对象,可以设置其文字内容等。

获取和设置单元格

// 获取和设置指定行列位置的单元格
QTableWidgetItem *item(int row, int column) const;
void setItem(int row, int column, QTableWidget *item);

// 构造 QTableWidgetItem
QTableWidgetItem(const QIcon &icon, const QString &text, int type = type);
QTableWidgetItem(const QString &text, int type = Type);

单元格文本对齐方式

// 获取和设置单元格文本的对齐方式
int textAlignment() const;
void setTextAlignment(int alignment);

参数alignment是一个枚举类型,常用取值如下:

  • Qt::AlignLeft (0x0001) 水平方向-左对齐
  • Qt::AlignRight (0x0002) 水平方向-右对齐
  • Qt::AlignHCenter (0x0004) 水平方向-居中对齐
  • Qt::AlignTop (0x0020) 垂直方向-上对齐
  • Qt::AlignBottom (0x0040) 垂直方向-下对齐
  • Qt::AlignVCenter (0x0080) 垂直方向-居中对齐
  • Qt::AlignCenter (AlignVCenter|AlignHCenter) 垂直方向和水平方向-居中对齐

上面的每一个宏,都代表16进制中的一位,可以进行或(1)操作,来同时设置多个对齐方式。

单元格是否可编辑

// 获取和设置单元格是否可编辑
QAbstractItemView::EditTriggers editTriggers() const;
void setEditTriggers(QAbstractItemView::EditTriggers triggers);

这是继承自其父类QAbstractItemView中的方法

其中,QAbstractItemView::EditTriggers 是一个枚举,常用取值如下:

  • QAbstractItemView::NoEditTriggers 0 不可编辑
  • QAbstractItemView::CurrentChanged 1 当切换单元格时
  • QAbstractItemView::DoubleClicked 2 当双击单元格时
  • QAbstractItemView::SelectedClicked 4 当单击一个已选中的单元格时
  • QAbstractItemView::EditKeyPressed 8 当一个单元格获取焦点,按编辑按键时(F2)
  • QAbstractItemView::AnyKeyPressed 16 当一个单元格获取焦点,按任意键时
  • QAbstractItemView::AllEditTriggers 31 以上所有条件的组合。(31=1|2|4|8|16)

1.3 隔行交替背景色

如下的奇数行和偶数行,它们的背景色不同,便于用户浏览

在这里插入图片描述

// 获取和设置是否允许隔行交替背景色
bool alternatingRowColors() const;
void setAlternattingRowColors(bool enable);

这是继承自其父类QAbstractItemView中的方法

1.4 选择模式和选择行为

所谓选择行为,是指当点击一个单元格时,是选中该单元格,还是选中一整行

// 获取和设置选择行为
QAbstractItemView::SelectionBehavior selectionBehavior() const;
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior);

这是继承自其父类QAbstractItemView中的方法

其中QAbstractItemView::SelectionBehavior是一个枚举,取值为:

  • QAbstractItemView::SelectItems 0 选中单元格
  • QAbstractItemView::SelectRows 1 选中单元格所在行
  • QAbstractItemView::SelectColumns 2 选中单元格所在列

所谓选择模式,是指设置表格控件只可选择单行、可选择多行等。

// 获取和设置选择模式
QAbstractItemView::SelectionMode selectionMode() const;
void setSelectionMOde(QAbstractItemView::SelectionMode mode);

这是继承自其父类QAbstractItemView中的方法

  • QAbstractItemView::NoSelection 0 不可选择
  • QAbstractItemView::SingleSelection 1 单行选择,一次只允许选择一行
  • QAbstractItemView::MultiSelection 2 多行选择,鼠标单击就可以选择多行
  • QAbstractItemView::ExtendedSelection 3 扩展选择,按shift键选中一个范围内的行,ctrl键可以选中不相邻的行
  • QAbstractItemView::ContiguousSelection 4 相邻选择,按shift键或ctrl键都可以选中一个范围内的行

1.5 设置样式表

通过设置样式表,可以使的表格控件更加美观

void Widget::on_btnStyleSheet_clicked() {
    QString cellStyle = R"(
        QTableView
        {
            text-align:center;
            background-color: rgba(255, 255, 255, 0);
            alternate-background-color:#e3edf9;
            font:14px "微软雅黑";
            color:#677483;
            gridline-color: #ccddf0;
        }
    )";

    const QString horizontalHeaderStyle = R"(
        QHeaderView::section {
            color: black;
            font:bold 14px "微软雅黑";
            text-align:center;
            height:32px;
            background-color: #d1dff0;
            border:1px solid #8faac9;
            border-left:none;
        }
    )";

    const QString verticalHeaderStyle = R"(
        QHeaderView::section {
            color: black;
            font:bold 14px "微软雅黑";
            width:60px;
            text-align:center;

            background-color: #d1dff0;
            border:1px solid #8faac9;
            border-left:none;
        }
    )";

    ui->twStudent->setStyleSheet(cellStyle);
    ui->twStudent->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);
    ui->twStudent->verticalHeader()->setStyleSheet(verticalHeaderStyle);
}

以上R包裹的字符串,就是C++中的原始字符串

原始字符串,就是所见即所得,不用写难以理解的转义字符。

2 实例

本实例展示表格控件的以下操作:

  1. 行表头的设置
  2. 列表头的设置
  3. 交替显示背景色
  4. 单元格可编辑
  5. 设置样式表
  6. 选择行为:单元格选择或行选择
  7. 数据的增删改查
    在这里插入图片描述

2.1 布局

在U设计师界面,拖拽对应的控件,修改显示的文字、控件的name,然后完成布局

在这里插入图片描述

2.2 代码实现

// 在Widget.h 中
#ifndef WIDGET_H
#define WIDGET_H

#include <QButtonGroup>
#include <QString>
#include <QStringList>
#include <QTableWidgetItem>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget {
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    void appendOneRow(QString name, QString gender, int age, QString province);
    void onSelectionRadioButtonClicked();
    void onItemClicked(QTableWidgetItem *);
    void insertOneRow(int, QString, QString, int, QString);
    ~Widget();

private slots:
    void on_btnAppend_clicked();

    void on_btnInsert_clicked();

    void on_btnDelete_clicked();

    void on_btnModify_clicked();

    void on_btnStyleSheet_clicked();

private:
    Ui::Widget *ui;

    QButtonGroup *mButtonGroupSelect;
};
#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);

    // 1. 初始化列表
    // 1.1 添加4 列
    ui->twStudent->setColumnCount(4);

    QStringList horizontalList;
    horizontalList << "姓名"
                   << "性别"
                   << "年龄"
                   << "籍贯";
    ui->twStudent->setHorizontalHeaderLabels(horizontalList);

    // 1.2 设置列的宽度先   获取行表头   填充满
    ui->twStudent->horizontalHeader()->setSectionResizeMode(
        QHeaderView::Stretch);

    // 1.3 添加几行初始化数据
    appendOneRow("李磊", "男", 15, "江西");
    appendOneRow("李安安", "女", 16, "代西");
    appendOneRow("李发放", "男", 18, "广西");
    appendOneRow("李呃呃", "女", 19, "单西");
    appendOneRow("李单独", "男", 13, "得西");

    // 2. 设置行表头是否显示
    // 初始化
    // if 用来判断行表头是否隐藏 隐藏返回true
    if (ui->twStudent->horizontalHeader()->isHidden()) {
        // 隐藏 设置复选框 取消勾选 (false)
        ui->cboHHeader->setChecked(false);
    } else {
        // 行表头显示 设置复选框勾选
        ui->cboHHeader->setChecked(true);
    }
    // 复选框 与 行表头连接
    connect(ui->cboHHeader, &QCheckBox::stateChanged, this, [=](int state) {
        // 当复选框状态变化 判断复选框是否选中状态
        // 当选中状态
        if (state == Qt::Checked) {
            // 显示行表头
            ui->twStudent->horizontalHeader()->show();
        } else if (state == Qt::Unchecked) {
            // 隐藏行表头
            ui->twStudent->horizontalHeader()->hide();
        }
    });

    // 3. 设置列表头是否显示
    // 初始化
    // if 用来判断列表头是否隐藏 隐藏返回true
    if (ui->twStudent->verticalHeader()->isHidden()) {
        // 隐藏 设置复选框 取消勾选 (false)
        ui->cboVHeader->setChecked(false);
    } else {
        // 列表头显示 设置复选框勾选
        ui->cboVHeader->setChecked(true);
    }
    // 复选框 与 列表头连接
    connect(ui->cboVHeader, &QCheckBox::stateChanged, this, [=](int state) {
        // 当复选框状态变化 判断复选框是否选中状态
        // 当选中状态
        if (state == Qt::Checked) {
            // 显示列表头
            ui->twStudent->verticalHeader()->show();
        } else if (state == Qt::Unchecked) {
            // 隐藏列表头
            ui->twStudent->verticalHeader()->hide();
        }
    });

    // 4. 设置交替显示背景色
    // 初始化
    // 如果返回true 背景色是显示的
    if (ui->twStudent->alternatingRowColors()) {
        // 如果背景色显示,复选框勾选上
        ui->cboAlternate->setChecked(true);
    } else {
        // 如果背景色不显示,复选框不勾选
        ui->cboAlternate->setChecked(false);
    }
    // 进行复选框 连接
    connect(ui->cboAlternate, &QCheckBox::stateChanged, this, [=](int state) {
        // 判断是否勾选
        if (state == Qt::Checked) {
            // 勾选 设置交替背景色
            ui->twStudent->setAlternatingRowColors(true);
        } else if (state == Qt::Unchecked) {
            // 没有勾选 设置不交替背景色
            ui->twStudent->setAlternatingRowColors(false);
        }
    });

    // 5. 单元格是否可编辑
    // 获取可编辑状态
    int trigger = ui->twStudent->editTriggers();
    // 如果不可编辑 取消复选框勾选
    if (trigger == QAbstractItemView::NoEditTriggers) {
        ui->cboEditCell->setChecked(false);
    } else {
        // 否则 可编辑 初始化复选框勾选
        ui->cboEditCell->setChecked(true);
    }
    // 进行复选框 连接
    connect(ui->cboEditCell, &QCheckBox::stateChanged, this, [=](int state) {
        // 判断是否勾选
        if (state == Qt::Checked) {
            // 勾选 设置可编辑状态
            ui->twStudent->setEditTriggers(QAbstractItemView::DoubleClicked |
                                           QAbstractItemView::SelectedClicked |
                                           QAbstractItemView::EditKeyPressed);
        } else if (state == Qt::Unchecked) {
            // 没有勾选 设置不可编辑状态
            ui->twStudent->setEditTriggers(QAbstractItemView::NoEditTriggers);
        }
    });

    // 6. 设置单元格选择,还是行选择
    int selectionBehavior = ui->twStudent->selectionBehavior();
    // 判断选择是否是选中的单元格 选择单元格 复选框勾选
    if (selectionBehavior == QAbstractItemView::SelectItems) {
        ui->rbCell->setChecked(true);
    } else if (selectionBehavior == QAbstractItemView::SelectRows) {
        // 判断选择是否是选中的行 选择行 复选框勾选
        ui->rbRow->setChecked(true);
    }
    mButtonGroupSelect = new QButtonGroup(this);
    mButtonGroupSelect->addButton(ui->rbCell, 0);
    mButtonGroupSelect->addButton(ui->rbRow, 1);
    connect(ui->rbCell, &QRadioButton::clicked, this,
            &Widget::onSelectionRadioButtonClicked);
    connect(ui->rbRow, &QRadioButton::clicked, this,
            &Widget::onSelectionRadioButtonClicked);

    // 7. 点击单元格时,将数据显示到文本框
    connect(ui->twStudent, &QTableWidget::itemClicked, this,
            &Widget::onItemClicked);
}

void Widget::appendOneRow(QString name, QString gender, int age,
                          QString province) {
    //  获取当前行数
    int count = ui->twStudent->rowCount();

    // 在表格基础上行数增加一行 ,用来添加数据
    ui->twStudent->setRowCount(count + 1);

    QTableWidgetItem *nameItem = new QTableWidgetItem(name);
    QTableWidgetItem *genderItem = new QTableWidgetItem(gender);
    QTableWidgetItem *ageItem = new QTableWidgetItem(QString::number(age));
    QTableWidgetItem *provinceItem = new QTableWidgetItem(province);

    // 设置居中显示
    nameItem->setTextAlignment(Qt::AlignCenter);
    genderItem->setTextAlignment(Qt::AlignCenter);
    ageItem->setTextAlignment(Qt::AlignCenter);
    provinceItem->setTextAlignment(Qt::AlignCenter);

    // 第一个参数代表行 第二个代表列
    ui->twStudent->setItem(count, 0, nameItem);
    ui->twStudent->setItem(count, 1, genderItem);
    ui->twStudent->setItem(count, 2, ageItem);
    ui->twStudent->setItem(count, 3, provinceItem);
}

void Widget::onSelectionRadioButtonClicked() {
    // 获取选中那个单选框按钮
    int checkeId = mButtonGroupSelect->checkedId();
    if (checkeId == 0) {
        // 当选中单元格时
        ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
        // 设置选中单元格
        ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectItems);
    } else {
        // 当选中单元格时
        ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
        // 设置选中行
        ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectRows);
    }
}

void Widget::onItemClicked(QTableWidgetItem *item) {
    // 获取当前选中的行
    int row = item->row();
    // 获取row行的数据
    QString name = ui->twStudent->item(row, 0)->text();
    QString gender = ui->twStudent->item(row, 1)->text();
    QString age = ui->twStudent->item(row, 2)->text();
    QString province = ui->twStudent->item(row, 3)->text();

    // 设置到文本框中
    ui->leName->setText(name);
    ui->leGender->setText(gender);
    ui->leAge->setText(age);
    ui->leProvince->setText(province);
}

void Widget::insertOneRow(int currentRow, QString name, QString gender, int age,
                          QString province) {
    ui->twStudent->insertRow(
        currentRow);  // 在currentRow行 插入的是一个空行,需要插入数据

    QTableWidgetItem *nameItem = new QTableWidgetItem(name);
    QTableWidgetItem *genderItem = new QTableWidgetItem(gender);
    QTableWidgetItem *ageItem = new QTableWidgetItem(QString::number(age));
    QTableWidgetItem *provinceItem = new QTableWidgetItem(province);

    // 设置居中显示
    nameItem->setTextAlignment(Qt::AlignCenter);
    genderItem->setTextAlignment(Qt::AlignCenter);
    ageItem->setTextAlignment(Qt::AlignCenter);
    provinceItem->setTextAlignment(Qt::AlignCenter);

    // 第一个参数代表行 第二个代表列
    ui->twStudent->setItem(currentRow, 0, nameItem);
    ui->twStudent->setItem(currentRow, 1, genderItem);
    ui->twStudent->setItem(currentRow, 2, ageItem);
    ui->twStudent->setItem(currentRow, 3, provinceItem);
}

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

void Widget::on_btnAppend_clicked() {
    // 获取文本框内容
    QString name = ui->leName->text();
    QString gender = ui->leGender->text();
    int age = ui->leAge->text().toInt();
    QString province = ui->leProvince->text();
    // 添加一行
    appendOneRow(name, gender, age, province);
}

void Widget::on_btnInsert_clicked() {
    // 获取文本框内容
    QString name = ui->leName->text();
    QString gender = ui->leGender->text();
    int age = ui->leAge->text().toInt();
    QString province = ui->leProvince->text();

    // 获取当前选中的行
    int currentRow = ui->twStudent->currentRow();
    // 插入数据
    insertOneRow(currentRow, name, gender, age, province);
}

void Widget::on_btnDelete_clicked() {
    // 获取当前选中的行
    int currentRow = ui->twStudent->currentRow();
    ui->twStudent->removeRow(currentRow);
}

void Widget::on_btnModify_clicked() {
    // 获取文本框内容
    QString name = ui->leName->text();
    QString gender = ui->leGender->text();
    int age = ui->leAge->text().toInt();
    QString province = ui->leProvince->text();
    // 获取当前选中的行
    int currentRow = ui->twStudent->currentRow();

    QTableWidgetItem *nameItem = new QTableWidgetItem(name);
    QTableWidgetItem *genderItem = new QTableWidgetItem(gender);
    QTableWidgetItem *ageItem = new QTableWidgetItem(QString::number(age));
    QTableWidgetItem *provinceItem = new QTableWidgetItem(province);

    // 设置居中显示
    nameItem->setTextAlignment(Qt::AlignCenter);
    genderItem->setTextAlignment(Qt::AlignCenter);
    ageItem->setTextAlignment(Qt::AlignCenter);
    provinceItem->setTextAlignment(Qt::AlignCenter);

    // 第一个参数代表行 第二个代表列
    ui->twStudent->setItem(currentRow, 0, nameItem);
    ui->twStudent->setItem(currentRow, 1, genderItem);
    ui->twStudent->setItem(currentRow, 2, ageItem);
    ui->twStudent->setItem(currentRow, 3, provinceItem);
}

void Widget::on_btnStyleSheet_clicked() {
    QString cellStyle = R"(
        QTableView
        {
            text-align:center;
            background-color: rgba(255, 255, 255, 0);
            alternate-background-color:#e3edf9;
            font:14px "微软雅黑";
            color:#677483;
            gridline-color: #ccddf0;
        }
    )";

    const QString horizontalHeaderStyle = R"(
        QHeaderView::section {
            color: black;
            font:bold 14px "微软雅黑";
            text-align:center;
            height:32px;
            background-color: #d1dff0;
            border:1px solid #8faac9;
            border-left:none;
        }
    )";

    const QString verticalHeaderStyle = R"(
        QHeaderView::section {
            color: black;
            font:bold 14px "微软雅黑";
            width:60px;
            text-align:center;

            background-color: #d1dff0;
            border:1px solid #8faac9;
            border-left:none;
        }
    )";

    ui->twStudent->setStyleSheet(cellStyle);
    ui->twStudent->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);
    ui->twStudent->verticalHeader()->setStyleSheet(verticalHeaderStyle);
}

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

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

相关文章

牛客周赛 Round 3 解题报告 | 珂学家 | 贪心思维场

前言 寒之不寒无水也&#xff0c;热之不热无火也。 整体评价 感觉比较简单&#xff0c;更加侧重于思维吧。和前几场的Round系列&#xff0c;风格不太一样。 A. 游游的7的倍数 因为连续7个数&#xff0c;比如有一个数是7的倍数 因此从个位数中着手添加&#xff0c;是最好的选…

Matter - 体验,灯泡(1)

一、前言 Matter&#xff08;当时称为 Project Connected Home over IP 或 Project CHIP&#xff09;于2019年12月11日首次宣布。当时&#xff0c;它是由苹果、谷歌、亚马逊和联发科技等公司共同发起的一个项目&#xff0c;目的是创建一个开放标准&#xff0c;提高智能家居设备…

【Linux】Git - 新手入门

文章目录 1. git 版本控制器 - 该如何理解&#xff1f;2. git / gitee / github 区别&#xff1f;3. Linux 中 git 的使用3.1 安装 git3.2 使用 github 新建远端仓库3.2.1 账号注册3.2.2 创建代码仓库3.2.3 克隆仓库到本地3.2.4 .gitignore 文件 3.3 使用 git 提交代码到 githu…

【方法】Excel表格如何“限制编辑区域”?

在制作Excel表格的时候&#xff0c;你是否遇到这些情况&#xff1f;有时候需要限定部分区域让他人协助填写&#xff0c;有时候会有很多数据或公式&#xff0c;要防止误改&#xff0c;否则会引起错误。要保护好这些区域&#xff0c;我们可以给Excel表格设置“限制编辑区域”。 …

震惊!你还搞不懂PMP中的合同类型?

PMP中的合同类型包括固定总价合同、总价加激励费用合同、总价加经济价格调整合同、成本加固定费用合同、成本加激励费用合同和成本加奖励费用合同等。 下面分别针对各类合同进行详细的说明&#xff1a; 固定总价合同&#xff08;FFP&#xff09;&#xff1a;是最常用的合同类型…

ERP和MES对接的几种接口方式

在数字化工厂的规划建设中&#xff0c;信息化系统的集成&#xff0c;既是重点&#xff0c;但同时也是难点。ERP和MES对接时&#xff0c;ERP主要负责下达生产计划&#xff0c;MES是执行生产计划&#xff0c;二套系统在数据交互时&#xff0c;需要确保基础数据的一致性&#xff0…

mysql原理--redo日志2

1.redo日志文件 1.1.redo日志刷盘时机 我们前边说 mtr 运行过程中产生的一组 redo 日志在 mtr 结束时会被复制到 log buffer 中&#xff0c;可是这些日志总在内存里呆着也不是个办法&#xff0c;在一些情况下它们会被刷新到磁盘里&#xff0c;比如&#xff1a; (1). log buffer…

B端产品经理学习-B端产品的项目管理

项目管理的作用 指导Roadmap落地 每个节点的项目时间需要按照时间点落地&#xff0c;才不会影响后面的项目事件 为了明确需求&#xff0c;明确研发的工作 避免产研部门因为需求扯皮、研发部门抱怨需求文档不够清晰、在开发过程中增加很多细节需求、增加了研发的工作量、初次…

探寻爬虫世界01:HTML页面结构

文章目录 一、引言&#xff08;一&#xff09;背景介绍&#xff1a;选择爬取51job网站数据的原因&#xff08;二&#xff09;目标与需求明确&#xff1a;爬取51job网站数据的目的与用户需求 二、网页结构探索&#xff08;一&#xff09;51job网页结构分析1、页面组成&#xff1…

紫光展锐T770安卓核心板_展锐T770 5G核心板规格参数

紫光展锐T770安卓核心板是一款高性能的5G安卓智能模块&#xff0c;拥有先进的6nm制程工艺和强大的性能。板载8GB Ram 256GBROM的内存单元&#xff0c;支持4K H.265/ H.264视频编解码&#xff0c;搭载Android 13以上操作系统&#xff0c;功能丰富。除了支持5G NSA和SA双模式向下…

分布式搜索——Elasticsearch

Elasticsearch 文章目录 Elasticsearch简介ELK技术栈Elasticsearch和Lucene 倒排索引正向索引倒排索引正向和倒排 ES概念文档和字段索引和映射Mysql与Elasticsearch 安装ES、Kibana安装单点ES创建网络拉取镜像运行 部署kibana拉取镜像部署 安装Ik插件扩展词词典停用词词典 索引…

勾股数 - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 如果三个正整数A、B、C &#xff0c;A B C 则为勾股数&#xff0c; 如果ABC之间两两互质&#xff0c;即A与B&#xff0c;A与C&#xff0c;B与C均互质没有公约数&#xff0c;则称其为勾股数元组。 请求出给定 n ~ …

一篇教你生成密钥给自己打的exe添加密钥

一篇教你生成密钥给自己打的exe添加密钥 我这里是自己写了一个python 打包exe,说总是给我报毒什么的 文章目录 一篇教你生成密钥给自己打的exe添加密钥前言一、使用java jdk 自带的keytool&#xff1f;二、进行转换2.把证书密钥写入到你的exe 总结 前言 生成密钥并为自定义 .…

【IPC通信--共享内存】

进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…

xlua源码分析(五) struct类型优化

xlua源码分析&#xff08;五&#xff09; struct类型优化 上一节我们分析了xlua是如何实现lua层访问C#值类型的&#xff0c;其中我们重点提到了xlua默认实现方式下&#xff0c;struct访问的效率问题。实际上&#xff0c;xlua还提供了两种优化的方式&#xff0c;可以大大提高str…

软件测试|如何使用Selenium处理隐藏元素

简介 我们在使用selenium进行web自动化测试时&#xff0c;有时候会遇到元素被隐藏&#xff0c;从而无法对元素进行操作&#xff0c;导致我们的用例报错的情况。当我们遇到元素被隐藏的情况时&#xff0c;需要先对隐藏的元素进行处理&#xff0c;才能继续进行我们的操作&#x…

一篇文章搞懂Jenkins持续集成解决的是什么问题

01 持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

第08章_面向对象编程(高级)拓展练习(关键字:static,代码块,关键字:final,抽象类和抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程&#xff08;高级&#xff09;拓展练习01-关键字&#xff1a;static1、银行账户类2、图形类3、数组工具类4、二分查找5、二分查找6、素数7、阅读代码&#xff0c;分析运行结果8、阅读代码&#xff0c;分析运行结果 02-代码块9、阅读代码&#xff0…

软件测试|如何使用selenium处理下拉框?

简介 下拉框是网页表单中常见的元素之一&#xff0c;通常用于选择不同的选项。对于我们的自动化测试工作来说&#xff0c;操作下拉框是我们经常需要处理的元素&#xff0c;selenium作为我们最常使用的web自动化测试框架&#xff0c;也是支持我们对下拉框进行操作的。本文我们就…

Github镜像加速器-FastGit

简介 FastGit 是一个对于 GitHub.com 的镜像加速器。使用共享资源为 GitHub 加速。 FastGit中文指南 # 基本使用 关于 FastGit 的使用&#xff0c;本质上与 git 有关。常规的面向 GitHub 的 clone 命令可能如下&#xff1a; git clone https://github.com/author/repo使用 F…