【QT开发笔记-基础篇】

2023-10-27

本节对应的视频讲解:B_站_链_接

【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget(1)

QTableWidgetQt 中的表格控件,可以行列的形式来展示数据

案例-演示


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 是一个枚举,取值如下:

  • HeaderView::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 表格控件中,每一个单元格是一个 QTableWidgetItem 对象,可以设置其文字内容等。

获取和设置单元格

// 获取和设置指定行列位置的单元格
QTableWidgetItem *item(int row, int column) const;
void setItem(int row, int column, QTableWidgetItem *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 进制中的一位,可以进行或(|)操作,来同时设置多个对齐方式。

单元格是否可编辑

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

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

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

  • AbstractItemView::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 setAlternatingRowColors(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::SelectionMode 是一个枚举,取值为:

  • 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++ 中的原始字符串

原始字符串:使用前缀 R 来标识,并用 "()" 用作定界符

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


2. 案例


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

  • 行表头的设置
  • 列表头的设置
  • 交替显示背景色
  • 单元格可编辑
  • 设置样式表
  • 选择行为:单元格选择或行选择
  • 数据的增删改查

案例


2.1 布局

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


2.2 代码实现

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

    // 1. 初始化列表控件

    // 1.1 共有4列,并添加列的名称
    ui->twStudent->setColumnCount(4);

    QStringList horizontalHeader;
    horizontalHeader << "姓名";
    horizontalHeader << "性别";
    horizontalHeader << "年龄";
    horizontalHeader << "籍贯";

    ui->twStudent->setHorizontalHeaderLabels(horizontalHeader);

    // 1.2 设置列的宽度
    // 先设置自适应宽度,再单独设置某一列的宽度规则
    ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);    //先自适应宽度
    // 然后,可以单独设置某一列根据内容调整宽度
//    ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
    // 或者,可以单独设置某一列为固定宽度
//    ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
//    ui->twStudent->setColumnWidth(0, 80);

    // 1.3 添加几行初始化数据
    appendOneRow("李雷", "男", 12, "广东");
    appendOneRow("韩梅梅", "女", 11, "北京");
    appendOneRow("林涛", "男", 13, "上海");



    // 2. 设置行表头是否显示
    // 首先根据在属性窗口中设置的属性,初始化复选框
    if(ui->twStudent->horizontalHeader()->isHidden()) {
        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(ui->twStudent->verticalHeader()->isHidden()) {
        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. 交替显示行的背景色
    // 首先根据在属性窗口中设置的属性,初始化复选框
    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) {
            // 当双击单元格/选中单元格然后单击/按下编辑键F2,都可以编辑单元格。
            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);
    }

    // 点击单选按钮时,使能单元格选中或者行选中
    mButtonGroupSelection = new QButtonGroup(this);
    mButtonGroupSelection->addButton(ui->rbCell, 0);
    mButtonGroupSelection->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);
}

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

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

    // 设置当前行数
    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::insertOneRow(int row, QString name, QString gender, int age, QString province)
{
    ui->twStudent->insertRow(row);

    // 上面 insertRow 只是插入一个空行,需要手动添加每个单元格的内容
    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(row, 0, nameItem);
    ui->twStudent->setItem(row, 1, genderItem);
    ui->twStudent->setItem(row, 2, ageItem);
    ui->twStudent->setItem(row, 3, provinceItem);
}

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::onItemClicked(QTableWidgetItem *item)
{
    int row = item->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::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);
}

void Widget::onSelectionRadioButtonClicked()
{
    int checkedId = mButtonGroupSelection->checkedId();
    if(checkedId == 0) {
        ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
        ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectItems);
    } else if (checkedId == 1) {
        ui->twStudent->setSelectionMode(QAbstractItemView::SingleSelection);
        ui->twStudent->setSelectionBehavior(QAbstractItemView::SelectRows);
    }
}

本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV15N4y177W2


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【QT开发笔记-基础篇】 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • Opencv contours找出最大轮廓

    在处理二值图像时 常用 cv2 findContours 查找轮廓 如下所示 find all contours contours hierarchy cv2 findContours binary cv2 RETR TREE cv2 CH
  • vue前端缓存问题解决方案

    问题描述 大家用vue脚手架搭建前端工程时 常被缓存问题所困扰 具体的表现就是 当程序版本升级时 用户因为缓存访问的还是老的页面 然后很多同学很暴力的直接在index html中加入了这几行代码 升级时缓存问题倒解决了 但直接导致了用户每次
  • 用Eclipse创建第一个Spring项目(最最入门级)

    网上关于Spring的介绍资料已经数不胜数 但大多篇幅冗长 初学者不易理解记忆 这里先作一个简短的提炼 不作详细解释 主要内容是带大家创建一个Spring项目 感受一下这东西到底是什么样的 1 Spring Framework是用来干嘛的
  • 高效实现数据仓库的七个步骤

    高效实现数据仓库的七个步骤 数据仓库和我们常见的RDBMS系统有些亲缘关系 但它又有所不同 如 果你没有实施过数据仓库 那么从设定目标到给出设计 从创建数据结构到编写数据分析程序 再到面对挑剔的用户的评估 整个过程都会带给你一种与以往的项目
  • Hbase常用SQL命令

    这里写目录标题 Hbase常用SQL命令 1 启动hbase 2 进入hbase 3 hbase查看数据表 4 hbase建表语句 5 hbase禁用表 启用表 6 hbase添加单行数据 7 hbase文档添加数据 8 hbase扫描表
  • 分块矩阵求行列式

    分块矩阵求行列式 注意 第二个公式有误 将矩阵写为 P A B B A 那么det P det A det A BA 1B def A BA 1B a 1 1 A a b1 B a b2 a 0或a 1均可构造无穷多解 def A det
  • 基于Redis的原子操作优化秒杀逻辑

    对于缓存中间件Redis 相信各位小伙伴或多或少都有听说过 甚至实战过 本文我们将基于SpringBoot整合Redis中间件 并基于其优秀的 单线程 特性和原子操作实现一种 分布式锁 进而控制 高并发情况下多线程对于共享资源的访问 最终解
  • 递归法取硬币java_递归算法

    递归算法 在函数或子过程的内部 直接或者间接地调用自己的算法 特点 1 递归就是在过程或函数里调用自身 2 在使用递归策略时 必须有一个明确的递归结束条件 称为递归出口 3 递归算法解题通常显得很简洁 但递归算法解题的运行效率较低 所以一般
  • 线程池合理估算大小

    分配线程池究竟设置多大还是要看你的执行的任务 不要单方面看 线程任务分为Cpu密集型和IO密集型 混合型 主要看系统运行的任务是什么类型的 主要分为3种类型任务 CPU密集型和IO密集型 混合型任务 cpu密集型 一般分配N 1 什么是cp
  • Java 面试题(什么是分布式架构)

    Java 的分布式架构是指将应用程序分为不同的部分 这些部分可分别部署在不同的计算机上 它们相互之间通过网络进行通信和协作 从而共同完成某些任务 分布式应用程序通常需要满足以下几个特点 1 模块化 将应用程序模块化 将不同的功能放在独立的模
  • idea2022.2.2体验

    IntelliJ IDEA 2022 2 最新变化 IntelliJ IDEA 2022 2 为远程开发功能带来了多项质量改进 使其更美观 更稳定 从 v2022 2 开始 IntelliJ IDEA 使用 JetBrains Runtim
  • Java 构造方法与静态方法全解析

    构造方法 作用 一个类 可以有多个构造函数 构造函数的主要作用 一是用来实例化该类 二是 让该类实例化的时候执行哪些方法 初始化哪些属性 注意事项 如果你没写无参构造方法 系统会给你提供一个无参构造方法 如果只写了有参的构造方法 这时系统不
  • QT信号和槽参数传递

    写了一个这样的信号 void caculateReady QList
  • 异常检测专栏(三)传统的异常检测算法——上

    前言 在上一篇推文中 我们简要介绍了异常检测常用的几种数据集如ImageNet CIFAR10 CIFAR100 MNIST等 接下来 我们将基于传统的异常检测算法分为上 下两部分 逐一介绍不同类别的方法 本教程禁止转载 同时 本教程来自知
  • 基于 Postman 接口自动化场景设计

    一个强大的工具 基于 Postman 接口自动化场景设计 使用Xmind或者Yaml 设计 postman 自动化场景 引言 postman是一个比较轻量级的接口测试工具 在单个接口的测试表现优秀 在批量测试接口方面则提供了Runner C
  • ajax数据类型json,Ajax请求不与数据类型“jsonp”或“JSON”

    我想使用JSON作为Ajax请求 使用jQuery 的返回类型 但我的代码总是导致错误 我试过改变json和jsonp之间的MIME类型 但无济于事 Ajax请求不与数据类型 jsonp 或 JSON 我也不确定是否正确格式化数据 部分 我
  • 如何让HTTPS站点评级达到A+? 还得看这篇HTTPS安全优化配置最佳实践指南

    文章目录 0x00 前言简述 SSL TLS 简单说明 SSL TLS 相关术语一览 0x01 HTTPS安全实践指南 1 证书 certificate 与私钥 Private key 2 中间件SSL TLS服务器配置 3 SSL TLS
  • [news] Lion: The Complete Macworld Review

    the complete version is from http www macworld com article 161026 2011 07 osx lion review html In a decade Mac OS X evol
  • js常用数组操作方法

    1 concat 用于连接两个或多个数组 该方法不会改变现有的数组 仅会返回被连接数组的一个副本 2 join 用于把数组中的所有元素放入一个字符串 元素是通过指定的分隔符进行分隔的 默认使用 号分割 不改变原数组 3 push 可向数组的
  • 【QT开发笔记-基础篇】

    本节对应的视频讲解 B 站 链 接 QT开发笔记 基础篇 第二章 常用控件 2 12 表格控件 QTableWidget 1 QTableWidget 是 Qt 中的表格控件 可以行列的形式来展示数据 1 属性和方法 QTableWidge