【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的代理,不能单独使用,真正的数据需要另外的一个model提供,它的工鞥呢是对被代理的model(source model)进行排序和过滤。所谓过滤:也就是说按着你输入的内容进行数据的筛选,因为器过滤功能…...
上林赋 汉 司马相如
亡是公听然而笑曰:“楚则失矣,而齐亦未为得也。夫使诸侯纳贡者,非为财币,所以述职也。封疆画界者,非为守御,所以禁淫也。今齐列为东藩,而外私肃慎,捐国逾限,越海而田&…...
7.对象模型
对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。 若某个信号与多…...
机器学习——基本概念
如何选择合适的模型评估指标?AUC、精准度、召回率、F1值都是什么?如何计算?有什么优缺点? 选择合适的模型评估指标需要结合具体的问题场景,根据不同的需求来选择不同的指标。以下是几个常用的评估指标: AUC…...
Qt---感觉挺重要的部分
目录 一、讲述Qt信号槽机制与优势与不足 二、Qt信号和槽的本质是什么 三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别 四、描述QT的TCP通讯流程 服务端:(QTcpServer) 客户端:(QTcpSocket…...
springboot+vue家乡特色推荐系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...
在Shell脚本中通过ssh从脚本运行函数
文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f,这两个命令有什么区别declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办&a…...
简单学习一下 MyBatis 动态SQL使用及原理
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是其中一个非常重要的功能,可以让我们根据不同的条件动态…...
WhatsApp如何让客户参与变得更简单?
WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要,你可能已经把它们纳入你的社交媒体战略。 是的,WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天,它也适用于商业。 在发展WhatsApp业务时,小企业主得到了最优…...
记一次 MySQL 主从同步异常的排查记录,百转千回
本文主要内容如下: 一、现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的数据更改。 备库报错如下: 完整的错误信息: Relay log read failure: Could not parse relay log even…...
Cpython的多线程技术之痛
历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初,计算机都是单核CPU,每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作,这里采用了模拟机制,让不同线程根据时间片段&#…...
NDK OpenGL离屏渲染与工程代码整合
NDK系列之OpenGL离屏渲染与工程代码整合,本节主要是对上一节OpenGL渲染画面效果代码进行封装设计,将各种特效代码进行分离解耦,便于后期增加其他特效。 实现效果: 实现逻辑: 1.封装BaseFilter过滤器基类,…...
Python基础入门编程代码练习(二)
一、求1~100之间不能被3整除的数之和 循环条件:i<100循环操作 实现代码如下: def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为:%s" % (sum))sums() print("1~…...
C# | 对象池
对象池 文章目录 对象池前言什么是对象池对象池的优点对象池的缺点 实现思路示例代码 结束语 前言 当我们开发一个系统或者应用程序时,我们通常需要创建很多的对象,这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下,我们需…...
CSS小技巧之圆形虚线边框
虚线相信大家日常都用的比较多,常见的用法就是使用 border-style 控制不同的样式,比如设置如下边框代码: border-style: dotted dashed solid double;这将设置顶部的边框样式为点状,右边的边框样式为虚线,底部的边框样…...
QString与QByteArray互相转换的方法
QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString,主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...
Springboot +Flowable,设置流程变量的方式(一)
一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…...
机器学习13(正则化)
文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容,并就 sklearn 中逻辑回归(评估器)的参数进行详细解释由于 skle…...
并发编程学习(十一):原子数组、
1、数组类型的原子类 原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的…...
递归到动态规划:省去枚举行为
如果在动态规划的过程中没有枚举行为,那严格位置依赖和傻缓存的方式并没有太大区别,但是当有枚举行为的时候(一个位置依赖于多个位置),那严格位置依赖是有优化空间的,枚举行为也许可以省去,题目…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
