当前位置: 首页 > news >正文

【Qt编程之Widgets模块】-006:QSortFilterProxyModel代理的使用方法

  • QSortFilterProxyModel是model的代理,不能单独使用,真正的数据需要另外的一个model提供,它的工鞥呢是对被代理的model(source model)进行排序和过滤。所谓过滤:也就是说按着你输入的内容进行数据的筛选,因为器过滤功能是基本正则表达式,所以功能强大。
  • QsortFilterProxyModel类用来为model和view之间提供强大的排序和过滤支持。将模型排序或者过滤后在视图上显示,并且无需对模型中的数据进行任何转换,也无需对模型在中数据进行修改

1 QSortFilterProxyModel使用提要

  • 使用过滤器需要指定一个数据模型(QStandardItemModel)作为数据源,并且该数据模型无需设置到表对象上;
    过滤器指定好数据源后设置到表对象上即可正常使用
    过滤器不指定过滤列时,默认过滤列为0列

2.QSortFilterProxyModel自定义排序

  • 自定义排序需要子类化QsortFilterProxyModel,然后重写lessThan().
  • 注意 : 如果重写了lessThan(),那么就不会再调用model的sort方法了.
    lessThan()使用示例:
bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{//通过当前视图中的index位置获取model中实际的数据QVariant leftData = sourceModel()->data(source_left);QVariant rightData = sourceModel()->data(source_right);switch ( source_left.column() ){case 0 :     //序号,需要判断数字case 3 :     //信号ID,需要判断数字return leftData.toInt() < rightData.toInt();break;default :    //其它,只判断字符串return leftData.toString() < rightData.toString();break;}return true;     }

除了排序外,QSortFilterProxyModel还可以用来隐藏与某个过滤器不匹配的项。使用QRegExp对象指定筛选器,并将筛选器应用于给定列的每个项的filterRole() (默认情况下为Qt::DisplayRole)。QRegExp对象可用于匹配正则表达式、通配符模式或固定字符串。

3.过滤方法1-使用setFilterKeyColumn()过滤列

  • 首先需要通过void QsortFilterProxyModel::setFilterRegExp(const QRegExp ®Exp)来设置FilterProxyModel的过滤器. 然后通过QsortFilterProxyModel::setFilterKeyColumn(int)来过滤某一列.如果要更改大小写匹配,可以通过QsortFilterProxyModel::sortCaseSensitivity()来设置.
  • 示例代码如下所示:
QTableView *view = new QTableView;   
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel); //将model放入代理中   
view->setModel(proxyModel);             //在视图中安装代理QRegExp regExp("^(-?\\d+)(\\.\\d+)?$", Qt::CaseSensitive, QRegExp::RegExp);
//通过^(-?\d+)(\.\d+)?$来匹配整数
proxyModel->setFilterRegExp(regExp);   //安装过滤器proxyModel->setFilterKeyColumn(0);    
proxyModel->setFilterKeyColumn(2);    //将第一列和第三列同时是整数的数据显示出来.
  • 每当过滤格式改变,则setFilterRegExp()重新更新过滤器即可.
    弊端:
  • 但是这样只能"与方式"显示model,要第一列和第三列公共是整数的才能显示出来,不能实现"或方式"显示.
    所以,如果要使用联合多列过滤,建议使用过滤方法2来实现.

4.过滤方法2-重写filterAcceptsRow成员函数

以实现"只要第一列有整数或者第三列有整数的都显示出来"为例,首先需要子类化QsortFilterProxyModel类,然后重写filterAcceptsRow()或者filterAcceptsColumn()函数. 由于我们筛选第一列和第三列,列号是明确的,而行号是未知的, 所以我们只重写filterAcceptsRow()函数.

示例代码如下所示:

bool SortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{//获取model中实际的数据QString dataColumn1 =  sourceModel()->index(source_row, 0, source_parent).data(Qt::DisplayRole).toString();QString dataColumn3 =  sourceModel()->index(source_row, 2, source_parent).data(Qt::DisplayRole).toString();if(dataColumn1.contains(this->filterRegExp()))     {return true;}else if(dataColumn3.contains(this->filterRegExp())) {return true;}return false;        }
  • 然后创建SortFilterProxyModel类时,只需要安装过滤器即可:
SortFilterProxyModel *proxyModel = new SortFilterProxyModel();
proxyModel->setSourceModel(sourceModel);            //将model放入代理中   
treeView->setModel(proxyModel);                     //在视图中安装代理
proxyModel->setFilterRegExp("^(-?\\d+)(\\.\\d+)?$"); //安装过滤器
  • 每当过滤格式改变,则setFilterRegExp()重新更新过滤器即可.

注意事项:

  • 如果过滤方式改变了,比如从过滤第1列变成了过滤第2列,需要调用invalidateFilter()函数,使之前的过滤失效,激活当前过滤.
setSourceModel:用于设置哪个model被代理
setSortCaseSensitivity:用来设置排序时是否区分大小写
setFilterKeyColumn:用来制定当前过滤的列,参数为列好
setFiliterRegExp:用于设置过滤时的筛选规则,参数类型为QRegExp

HardwareLogWidget.h

class CHardwareLogWidget : public QWidget{Q_OBJECTpublic:CHardwareLogWidget(QWidget *parent = Q_NULLPTR);~CHardwareLogWidget();protected:void showEvent(QShowEvent *event);private slots:// 重置筛选条件void onReset();// 查询void onQuery();// 导出void onExport();private:// 初始化原始modelvoid initialModel();std::vector<HardWareOperateLogStr> getFilterLog();private:Ui::CHardwareLogWidget ui;CLogProxyModel *m_pLogProxyModel{ nullptr };        // 数据模型对象指针QStandardItemModel *m_pRrecordModel{ nullptr };     // 数据模型对象指针};

HardwareLogWidget.cpp


CHardwareLogWidget::CHardwareLogWidget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);connect(ui.m_pBtnReset, SIGNAL(clicked()), this, SLOT(onReset()));connect(ui.m_pBtnQuery, SIGNAL(clicked()), this, SLOT(onQuery()));     connect(ui.m_pBtnExport, SIGNAL(clicked()), this, SLOT(onExport()));ui.m_pLineEditUserName->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]{1,16}")));// 弹出日历的形式ui.dateTimeEdit->setCalendarPopup(true);ui.dateTimeEdit_2->setCalendarPopup(true);// 全部/添加用户/删除用户...ui.m_pComboType->addItem(tr("All"));for (int i = UserAdd; i <= EquipmentModify; i++){ui.m_pComboType->addItem(CLogTypeConverter::logtype2String(static_cast<HardWareOperateType>(i)));}// 设置的选择0好索引ui.m_pComboType->setCurrentIndex(0);//===============数据模型(QStandardItemModel)===============//建立数据模型对象空间并指定父对象// 设置以项数据(item data)为基础的标准数据模型m_pRrecordModel = new QStandardItemModel(this);// 添加列标题m_pRrecordModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Operate Time")));m_pRrecordModel->setHorizontalHeaderItem(1, new QStandardItem(tr("User name")));m_pRrecordModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Operate Type")));m_pRrecordModel->setHorizontalHeaderItem(3, new QStandardItem(tr("Operate Detail")));for (size_t i = 0; i < 4; i++){m_pRrecordModel->horizontalHeaderItem(i)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);}//===============过滤器模型(QSortFilterProxyModel)===============//建立过滤器模型对象空间并指定父对象// 设置CLogProxyModel::QSortFilterProxyModel代理m_pLogProxyModel = new CLogProxyModel(this);// 指定过滤器模型的数据源模型m_pLogProxyModel->setSourceModel(m_pRrecordModel);// 指定初始化过滤列m_pFilterModel->setFilterKeyColumn(0);//! 将过滤器模型设置到表对象上//! 数据模型就单纯当过滤器模型的数据源即可ui->tableView->setModel(m_pFilterModel);// 获取tableView的水平表头QHeaderView *verticalHeader = ui.tableView->verticalHeader();// 使用固定行高大小verticalHeader->setSectionResizeMode(QHeaderView::Fixed);// 设置tableview所有列的默认行高为54verticalHeader->setDefaultSectionSize(54);// 所有对setColumnWidth()的调用都要放在setModel()之后,所有对setColumnWidth()的调用都要放在setModel()之后ui.tableView->setModel(m_pLogProxyModel);// 设置表格列宽ui.tableView->setColumnWidth(0, 300);ui.tableView->setColumnWidth(1, 250);ui.tableView->setColumnWidth(2, 250);// 隐藏表头verticalHeader->hide();// 不显示网格ui.tableView->setShowGrid(false);// 行选择ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);// 设置为可以选中多个目标ui.tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);// 设置为不可编辑状态ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);// 设置无交点ui.tableView->setFocusPolicy(Qt::NoFocus);// 初始化initialModel();// 重置onReset();
}
void CHardwareLogWidget::onReset()
{ui.m_pLineEditUserName->clear();m_pLogProxyModel->setFilterKey("");ui.m_pComboType->setCurrentIndex(0);m_pLogProxyModel->setFilterLogType(ui.m_pComboType->currentText());// 默认筛选时间为一年内ui.dateTimeEdit_2->setDateTime(QDateTime::currentDateTime());ui.dateTimeEdit->setDateTime(QDateTime::currentDateTime().addYears(-1));m_pLogProxyModel->setDateTimeRange(QDateTime::currentDateTime().addYears(-1), QDateTime::currentDateTime());m_pLogProxyModel->setFilterRegExp(QRegExp());m_pLogProxyModel->setSourceModel(m_pRrecordModel);}////void CHardwareLogWidget::onQuery(){m_pLogProxyModel->setFilterKey(ui.m_pLineEditUserName->text());m_pLogProxyModel->setFilterLogType(ui.m_pComboType->currentText());QDateTime min = ui.dateTimeEdit->dateTime();QDateTime max = ui.dateTimeEdit_2->dateTime();if (min.toTime_t() > max.toTime_t()){QToolTip::showText(ui.dateTimeEdit->mapToGlobal(QPoint(0, 0)), tr("max time must be more than min time"));return;}QString str1 = min.toString("yyyy-MM-dd hh:mm:ss");m_pLogProxyModel->setDateTimeRange(min, max);m_pLogProxyModel->setFilterRegExp(QRegExp());m_pLogProxyModel->setSourceModel(m_pRrecordModel);}

2 获取过滤器当前选中的文本

  • 获取文本比较简单,步骤如下:
    通过表对象的点击事件能拿到点击位置的QModelIndex对象
    使用转到槽/自定义槽函数+链接信号槽接收点击信号发出的QModelIndex对象
    在槽函数中实现获取当前选中的文本
std::vector<HardWareOperateLogStr> CHardwareLogWidget::getFilterLog()
{std::vector<HardWareOperateLogStr> vecReturn;int rowCount = m_pLogProxyModel->rowCount();for (int i = 0; i < rowCount; i++){HardWareOperateLogStr struLog;// 通过当前视图中的index位置获取model中实际的数据struLog.logTime = m_pLogProxyModel->data(m_pLogProxyModel->index(i, 0)).toString();struLog.strUserNumber = m_pLogProxyModel->data(m_pLogProxyModel->index(i, 1)).toString();struLog.strOperateType= m_pLogProxyModel->data(m_pLogProxyModel->index(i, 2)).toString();struLog.strDetailInfo = m_pLogProxyModel->data(m_pLogProxyModel->index(i, 3)).toString();vecReturn.push_back(struLog);}return vecReturn;
}

3 修改当前选中item的文本

修改item文本,首先需要获取到item对象,方法和获取文本一样都需要接收发出点击信号和参数,但槽函数内容如下:

存放当前点击对象的item指针,在.h/.cpp文件中如下定义

4 实现多列分别过滤

20181207151416201

原理,重写QSortFilterProxyModel类中的filterAcceptsRow即可:

源码如下:

mysortfilterproxymodel.h

#ifndef MYSORTFILTERPROXYMODEL_H
#define MYSORTFILTERPROXYMODEL_H#include <QSortFilterProxyModel>
#include <QRegExp>class MySortFilterProxyModel : public QSortFilterProxyModel
{Q_OBJECT
public:MySortFilterProxyModel(QObject *parent = 0);void setRxCol1(const QString rx);void setRxCol2(const QString rx);protected:bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const Q_DECL_OVERRIDE;private:QString m_rxCol1;QString m_rxCol2;};#endif // MYSORTFILTERPROXYMODEL_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QStandardItemModel;
class QSortFilterProxyModel;
QT_END_NAMESPACEclass MySortFilterProxyModel;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void col1LineEditChanged(const QString text);void col2LineEidtChanged(const QString text);protected:void intsertModel(const int row, const int col, const QString data);private:Ui::Widget *ui;QStandardItemModel *m_model;MySortFilterProxyModel *m_filterModel;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

mysortfilterproxymodel.cpp

#include "mysortfilterproxymodel.h"
#include <QModelIndex>
#include <QDebug>MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{m_rxCol1 = "";m_rxCol2 = "";
}void MySortFilterProxyModel::setRxCol1(const QString rx)
{m_rxCol1 = rx;
}void MySortFilterProxyModel::setRxCol2(const QString rx)
{m_rxCol2 = rx;
}bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{QModelIndex index0 = sourceModel()->index(source_row, 0, source_parent);QModelIndex index1 = sourceModel()->index(source_row, 1, source_parent);return (sourceModel()->data(index0).toString().contains(m_rxCol1)&& sourceModel()->data(index1).toString().contains(m_rxCol2));
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mysortfilterproxymodel.h"
#include <QStandardItemModel>
#include <QRegExp>
#include <QDebug>
#include <QSortFilterProxyModel>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("CSDN IT1995");m_model = new QStandardItemModel;m_filterModel = new MySortFilterProxyModel;QStringList headList;headList << "第一列" << "第二列" << "第三列" << "第四列";m_model->setHorizontalHeaderLabels(headList);ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);for(int row = 0; row < 100; row++){for(int col = 0; col < 4; col++){intsertModel(row, col, "第" + QString::number(row) + "行,第" + QString::number(col) + "列");}}intsertModel(100, 0, "中文");intsertModel(100, 1, "China");intsertModel(100, 2, "japan");intsertModel(100, 3, "日本人");intsertModel(101, 0, "中文");intsertModel(101, 1, "东京");intsertModel(101, 2, "东京热");intsertModel(101, 3, "东京冷");connect(ui->colOneLineEdit,SIGNAL(textEdited(QString)), this, SLOT(col1LineEditChanged(QString)));connect(ui->colTwoLineEdit,SIGNAL(textEdited(QString)), this, SLOT(col2LineEidtChanged(QString)));m_filterModel->setSourceModel(m_model);ui->tableView->setModel(m_filterModel);
}Widget::~Widget()
{delete ui;
}void Widget::col1LineEditChanged(const QString text)
{m_filterModel->setRxCol1(text);m_filterModel->setSourceModel(m_model);
}void Widget::col2LineEidtChanged(const QString text)
{m_filterModel->setRxCol2(text);m_filterModel->setSourceModel(m_model);
}void Widget::intsertModel(const int row, const int col, const QString data)
{QStandardItem *newItem = new QStandardItem(data);newItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);m_model->setItem(row, col, newItem);
}

相关文章:

【Qt编程之Widgets模块】-006:QSortFilterProxyModel代理的使用方法

QSortFilterProxyModel是model的代理&#xff0c;不能单独使用&#xff0c;真正的数据需要另外的一个model提供&#xff0c;它的工鞥呢是对被代理的model(source model)进行排序和过滤。所谓过滤&#xff1a;也就是说按着你输入的内容进行数据的筛选&#xff0c;因为器过滤功能…...

上林赋 汉 司马相如

亡是公听然而笑曰&#xff1a;“楚则失矣&#xff0c;而齐亦未为得也。夫使诸侯纳贡者&#xff0c;非为财币&#xff0c;所以述职也。封疆画界者&#xff0c;非为守御&#xff0c;所以禁淫也。今齐列为东藩&#xff0c;而外私肃慎&#xff0c;捐国逾限&#xff0c;越海而田&…...

7.对象模型

对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知&#xff0c;槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击]&#xff0c;它会发出一个信号[clicked()]&#xff0c;然后与该对象连接的槽函数将被自动调用。 若某个信号与多…...

机器学习——基本概念

如何选择合适的模型评估指标&#xff1f;AUC、精准度、召回率、F1值都是什么&#xff1f;如何计算&#xff1f;有什么优缺点&#xff1f; 选择合适的模型评估指标需要结合具体的问题场景&#xff0c;根据不同的需求来选择不同的指标。以下是几个常用的评估指标&#xff1a; AUC…...

Qt---感觉挺重要的部分

目录 一、讲述Qt信号槽机制与优势与不足 二、Qt信号和槽的本质是什么 三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别 四、描述QT的TCP通讯流程 服务端&#xff1a;&#xff08;QTcpServer&#xff09; 客户端&#xff1a;&#xff08;QTcpSocket&#xf…...

springboot+vue家乡特色推荐系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…...

在Shell脚本中通过ssh从脚本运行函数

文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f&#xff0c;这两个命令有什么区别declare -f 和typset -f&#xff0c;这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh&#xff0c;并且在main.sh中引用了util.sh&#xff0c;该怎么办&a…...

简单学习一下 MyBatis 动态SQL使用及原理

MyBatis 是一个优秀的持久层框架&#xff0c;它提供了丰富的 SQL 映射功能&#xff0c;可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作&#xff0c;提高了开发效率。动态 SQL 是其中一个非常重要的功能&#xff0c;可以让我们根据不同的条件动态…...

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要&#xff0c;你可能已经把它们纳入你的社交媒体战略。 是的&#xff0c;WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天&#xff0c;它也适用于商业。 在发展WhatsApp业务时&#xff0c;小企业主得到了最优…...

记一次 MySQL 主从同步异常的排查记录,百转千回

本文主要内容如下&#xff1a; 一、现象 最近项目的测试环境遇到一个主备同步的问题&#xff1a; 备库的同步线程停止了&#xff0c;无法同步主库的数据更改。 备库报错如下&#xff1a; 完整的错误信息&#xff1a; Relay log read failure: Could not parse relay log even…...

Cpython的多线程技术之痛

历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初&#xff0c;计算机都是单核CPU&#xff0c;每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作&#xff0c;这里采用了模拟机制&#xff0c;让不同线程根据时间片段&#…...

NDK OpenGL离屏渲染与工程代码整合

NDK​系列之OpenGL离屏渲染与工程代码整合&#xff0c;本节主要是对上一节OpenGL渲染画面效果代码进行封装设计&#xff0c;将各种特效代码进行分离解耦&#xff0c;便于后期增加其他特效。 实现效果&#xff1a; 实现逻辑&#xff1a; 1.封装BaseFilter过滤器基类&#xff0c…...

Python基础入门编程代码练习(二)

一、求1~100之间不能被3整除的数之和 循环条件&#xff1a;i<100循环操作 实现代码如下&#xff1a; def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为&#xff1a;%s" % (sum))sums() print("1~…...

C# | 对象池

对象池 文章目录 对象池前言什么是对象池对象池的优点对象池的缺点 实现思路示例代码 结束语 前言 当我们开发一个系统或者应用程序时&#xff0c;我们通常需要创建很多的对象&#xff0c;这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下&#xff0c;我们需…...

CSS小技巧之圆形虚线边框

虚线相信大家日常都用的比较多&#xff0c;常见的用法就是使用 border-style 控制不同的样式&#xff0c;比如设置如下边框代码&#xff1a; border-style: dotted dashed solid double;这将设置顶部的边框样式为点状&#xff0c;右边的边框样式为虚线&#xff0c;底部的边框样…...

QString与QByteArray互相转换的方法

QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString&#xff0c;主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...

Springboot +Flowable,设置流程变量的方式(一)

一.简介 为什么需要流程变量。 举个例子&#xff0c;假设有如下一个流程&#xff0c;截图如下&#xff1a; 这是一个请假流程&#xff0c;那么谁请假、请几天、起始时间、请假理由等等&#xff0c;这些都需要说明&#xff0c;不然领导审批的依据是啥&#xff1f;那么如何传递…...

机器学习13(正则化)

文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容&#xff0c;并就 sklearn 中逻辑回归&#xff08;评估器&#xff09;的参数进行详细解释由于 skle…...

并发编程学习(十一):原子数组、

1、数组类型的原子类 原子数组类型&#xff0c;这个其实和AtomicInteger等类似&#xff0c;只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址&#xff0c;肯定是不行的&#xff0c;只能比较下标元素。而比较下标元素&#xff0c;就和元素的…...

递归到动态规划:省去枚举行为

如果在动态规划的过程中没有枚举行为&#xff0c;那严格位置依赖和傻缓存的方式并没有太大区别&#xff0c;但是当有枚举行为的时候&#xff08;一个位置依赖于多个位置&#xff09;&#xff0c;那严格位置依赖是有优化空间的&#xff0c;枚举行为也许可以省去&#xff0c;题目…...

服务(第二十一篇)mysql高级查询语句(二)

①视图表&#xff1a; 视图表是虚拟表&#xff0c;用来存储SQL语句的定义 如果视图表和原表的字段相同&#xff0c;是可以进行数据修改的&#xff1b; 如果两者的字段不通&#xff0c;不可以修改数据。 语法&#xff1a; 创建&#xff1a;create view 试图表名 as ... 查…...

MYSQL高可用配置(MHA)

1、什么是MHA MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...

单精度浮点数与十进制数据相互转换

一、float基础&#xff1a; Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制&#xff1a; 下面…...

PMP敏捷-4大价值观、12原则

宣言及4大价值观 个体及互动 胜于 流程和工具 以人为本 工作的软件 胜于 完整的文档 以价值为导向 客户合作 胜于 合同谈判 合作共赢 应对变更 胜于 遵循计划 拥抱变化 12原则 工作原则&#xff1a;精益、至简&#xff0c;实现这种原则的方式是“定期反省”。9、10、12 …...

K8S—Helm

一、Helm介绍 helm通过打包的方式&#xff0c;支持发布的版本管理和控制&#xff0c;很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理&#xff08;Deployment、Service等&#xff09;可配置&#xff0c;能动态生成。通过动态生成K8S资源清单文件&a…...

ALSA内部函数调用流程

ALSA内部函数调用流程 一直都有这样的一个疑问 就是在linux系统中我们调用snd_pcm_open后&#xff0c;就不知道alsa内部是怎么运行的了 用户的pcm_open()相当于先对ASoC各个驱动模块startup()&#xff0c;再做hw_params()。 pcm_open()pcm->fd open("/dev/snd/pcm…...

Python正则表达式详解,保姆式教学,0基础也能掌握正则

正则作为处理字符串的一个实用工具&#xff0c;在Python中经常会用到&#xff0c;比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中&#xff0c;通过导入re模块就可以使用&#xff0c;作为刚学Python的新手大多数都听说”正则“这个术语。 今天来给…...

ChatGPT 接入飞书教程,创建自己的聊天机器人

ChatGPT 接入飞书教程,创建自己的聊天机器人 一、飞书进入开发者平台。点击创建应用。二、打开Aircode,点击创建应用,上面输入名字,下面选择Node.js v16三、配置环境,点击Environments,创建四个变量,全部要大写本教程收集于: AIGC从入门到精通教程 首先,准备三个账号…...

JS生成随机数(多种解决方案)

JS生成随机数 概述 随机数是编程语言中的重要组成部分。在JavaScript中&#xff0c;生成随机数是一项简单的任务。本文将介绍生成随机数的各种方法。 Math.random() Math.random()是JavaScript中生成随机数最常见的方法。该方法返回介于0和1之间的随机数。例如&#xff0c;…...

文件IO 函数 静态库和动态库的创建 5.11

5.11 文件IO函数 1.数据读写 ssize_t read(int fd,void *buf,size_t count); 功能&#xff1a; ​ 从fd对应的文件中 读取前count个字节的数据到buf缓冲区中 头文件&#xff1a; ​ #include <unistd.h> 参数&#xff1a; ​ fd &#xff1a;文件描述符 ​ buf…...