和处理。其中我用正则表达式过滤的一些无用标签。
代码是经过修改的,尽量通用化,理论上复制下来就能用。宏QTHQ_BASESHARED_EXPORT 删掉即可,原本是用于制作成dll的选项的,具体可以参考我的其它文章。
Qt制作dll(带ui)并调用,兼容32位和64位_redeclared without dllimport_大橘的博客-CSDN博客
hq_base_db_grid_excel.h:
/**************************************************************************************************
** File name: hq_base_db_grid_excel.h (HQ_Base_DB_Grid_Excel)
** Created by: Henrick.Nie at 2023-7-10
** Used for: Import/export the grid data from/to the excel file.
**************************************************************************************************/
#ifndef HQ_BASE_DB_GRID_EXCEL_H
#define HQ_BASE_DB_GRID_EXCEL_H
#include "qt-hq_base_global.h"
#include
#include
#include
#include
#include
#include
#include
#include "hq_base_db_grid.h"
class QTHQ_BASESHARED_EXPORT HQ_Base_DB_Grid_Excel
{
public:
static bool f_SaveToExcel(QTableWidget *oGrid,
const bool &bAskBeforeDoing, const bool &bAskBeforeOpenning, QString *sFilePath = nullptr,
QString *sErr = nullptr, const QString &sSheetName = QString());
static bool f_SaveToExcel(const QString &sExcelHtmlModel, QTableWidget *oGrid,
const bool &bAskBeforeDoing, const bool &bAskBeforeOpenning, QString *sFilePath = nullptr,
QString *sErr = nullptr, const QString &sSheetName = QString());
static bool f_GetFromExcel_AsXML(QString &sXML, QString *sErr = nullptr);
static bool f_GetFromExcel(const QString &sModel, QJsonArray &oArrRows, const bool &bFirstRowIsHeader = false, QString *sErr = nullptr);
static bool f_GetFromExcel(QTableWidget *oGrid, const bool &bFirstRowIsHeader = false, QString *sErr = nullptr);
static bool f_SetFirstRowToHeader(QTableWidget *oGrid, const bool &bSetHeader, QString *sErr = nullptr);
private:
static bool f_Grid_GetDataAsHtml(QTableWidget *oGrid, QString &sTableHtml, QString *sErr = nullptr);
static QString f_Grid_GetAlignByEnum(const int &iAlign);
static bool f_Excel_GetDataAsHtml(QString &sTableHtml, QString *sErr = nullptr);
};
#endif // HQ_BASE_DB_GRID_EXCEL_H
hq_base_db_grid_excel.cpp:
#include "hq_base_db_grid_excel.h"
/**================================================================================================
** Converts the grid data as the html table string, output it in the parameter 'sTableHtml'.
** Returns true on successed, otherwise returns false.
** ---------------------------------
** Format:
**
**
**
**
**
**
**
** f1
** f2
** f3
** f4
**
**
** 1
** 2
** 3
** 4
**
**
** a
** b
** c
** d
**
**
** cwd
** qwe
** xcz
** excz
**
**
**
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_Grid_GetDataAsHtml(QTableWidget *oGrid, QString &sTableHtml, QString *sErr)
{
sTableHtml.clear();
if (nullptr == oGrid)
{
HQ_Base::f_Pointer_SetValue(sErr, QString("The grid is nullptr."));
return false;
}
//Indent
QString sTable_col, sTable_Rows_tr, sIndent_table = " ", sIndent_col = " ", sIndent_tr = " ", sIndent_td = " ";
//Headers and col info( )
sTable_Rows_tr.append(sIndent_tr + "\n");
QString sHeader_td;
for (int iCol = 0; iCol < oGrid->columnCount(); ++iCol)
{
//width
QString sCol_Width = QString::number(oGrid->columnWidth(iCol));
//align
QTableWidgetItem *item = oGrid->horizontalHeaderItem(iCol);
int iAlign = (nullptr == item) ? 0 : item->textAlignment();
QString sCol_Align = f_Grid_GetAlignByEnum(iAlign);
sTable_col.append(sIndent_col + " \n");
//header row
sHeader_td.append(sIndent_td + "" + oGrid->horizontalHeaderItem(iCol)->text() + " \n");
}
sTable_Rows_tr.append(sHeader_td);
sTable_Rows_tr.append(sIndent_tr + " \n");
//data( )
for (int iRow = 0; iRow < oGrid->rowCount(); ++iRow)
{
sTable_Rows_tr.append(sIndent_tr + "\n");
QString sRows_td;
for (int iCol = 0; iCol < oGrid->columnCount(); ++iCol)
{
QTableWidgetItem *item = oGrid->item(iRow, iCol);
QString sText;
if (nullptr != item)
{
sText = item->text();
}
sRows_td.append(sIndent_td + "" + sText + " \n");
}
sTable_Rows_tr.append(sRows_td);
sTable_Rows_tr.append(sIndent_tr + " \n");
}
//table
sTableHtml.append(sIndent_table + "\n");
sTableHtml.append(sTable_col);
sTableHtml.append(sTable_Rows_tr);
sTableHtml.append(sIndent_table + "
\n");
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
QString HQ_Base_DB_Grid_Excel::f_Grid_GetAlignByEnum(const int &iAlign)
{
quint16 iHAlign = iAlign | 0x000F;
QString sAlign;
switch (iHAlign) {
case 1:
sAlign = "left";
break;
case 2:
sAlign = "right";
break;
case 4:
sAlign = "center";
break;
default:
break;
}
return sAlign;
}
/**================================================================================================
** Save the grid data to excel.
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_SaveToExcel(QTableWidget *oGrid,
const bool &bAskBeforeDoing, const bool &bAskBeforeOpenning,
QString *sFilePath, QString *sErr, const QString &sSheetName)
{
try
{
//Get the model.
QString sFile = "excel_html.md";
QFile f(sFile);
if (!f.exists())
{
throw QString("Can not find the model file.");
}
if (!f.open(QIODevice::ReadOnly|QIODevice::Text))
{
if (f.isOpen())
{
f.close();
}
throw QString("The model file openning failed.");
}
QString sExcelHtml = f.readAll();
if (f.isOpen())
{
f.close();
}
return f_SaveToExcel(sExcelHtml, oGrid, bAskBeforeDoing, bAskBeforeOpenning, sFilePath, sErr, sSheetName);
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
bool HQ_Base_DB_Grid_Excel::f_SaveToExcel(const QString &sExcelHtmlModel, QTableWidget *oGrid,
const bool &bAskBeforeDoing, const bool &bAskBeforeOpenning,
QString *sFilePath, QString *sErr, const QString &sSheetName)
{
try
{
HQ_Base::f_Pointer_SetValue(sFilePath, QString());
HQ_Base::f_Pointer_SetValue(sErr, QString());
QString sExcelHtml = sExcelHtmlModel;
if (sExcelHtml.isEmpty())
{
throw QString("The excel model lost.");
}
if (nullptr == oGrid)
{
throw QString("The grid does not exist.");
}
QString sMsg;
//Ask user before doing.
if (bAskBeforeDoing)
{
sMsg = "Export the grid data to the excel. Continue?";
if(QMessageBox::question(nullptr, "", sMsg, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) != QMessageBox::Yes)
{
return false;
}
}
//Select the saving path.
QString sFile_Saved = QFileDialog::getSaveFileName(nullptr, "Select the saving path.",
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
"Excel (*.xlsx);;Excel 97-2003 (*.xls)");
if (sFile_Saved.isEmpty())
{
return false;//If the user canceled, do nothing.
}
//If the target file is not writable.
QFile f_Save(sFile_Saved);
if (f_Save.isOpen() || !f_Save.open(QIODevice::WriteOnly|QIODevice::Text))
{
if (f_Save.isOpen())
{
f_Save.close();
}
throw QString("The target file is using. Perhaps it is already openned by an other program.");
}
//Sheet name.
if (!sSheetName.isEmpty())
{
sExcelHtml.replace(QRegularExpression("(?<=)[\\s\\S]*(?= )"), sSheetName);
}
//Html_table.
QString sTableHtml;
if (!f_Grid_GetDataAsHtml(oGrid, sTableHtml, sErr))
{
return false;
}
sExcelHtml.replace(QRegularExpression(""), sTableHtml);
//Save to file.
qint64 i = f_Save.write(sExcelHtml.toStdString().c_str());
if (f_Save.isOpen())
{
f_Save.close();
}
if (i < 0)
{
throw QString("The file writting failed.");
}
//Ask before openning.
if (bAskBeforeOpenning)
{
sMsg = "The excel file exporting successed, open it?\n";
if(QMessageBox::question(nullptr, "", sMsg + sFile_Saved, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes)
{
//Open the file.
QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(sFile_Saved)));
}
}
HQ_Base::f_Pointer_SetValue(sFilePath, sFile_Saved);
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sFilePath, QString());
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
/**================================================================================================
** Import the excel data to the html string, and output into the parameter 'sTableHtml'.
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_Excel_GetDataAsHtml(QString &sTableHtml, QString *sErr)
{
try
{
sTableHtml.clear();
HQ_Base::f_Pointer_SetValue(sErr, QString());
QString sFileName = QFileDialog::getOpenFileName(nullptr, "Select the saving path.",
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
"Excel (*.xlsx);;Excel 97-2003 (*.xls)");
if (sFileName.isEmpty())
{
return false;//If the user canceled, do nothing.
}
QFile f(sFileName);
if (!f.open(QIODevice::ReadOnly|QIODevice::Text))
{
if (f.isOpen())
{
f.close();
}
throw QString("The excel file openning failed.");
}
QString sExcelHtml = f.readAll();
if (f.isOpen())
{
f.close();
}
QRegularExpressionMatch match = QRegularExpression("").match(sExcelHtml);
if (!match.hasMatch())
{
throw QString("The excel file format is error.");
}
sTableHtml = match.captured();
sTableHtml.replace(QRegularExpression("\\bx:[^ <>]+\\b"), "");//remove 'x:str' or 'x:num', 'x:...'.
sTableHtml.replace(QRegularExpression(" ]*/>"), "");//remove ''.
sTableHtml.replace(QRegularExpression("]*\\]>[\\S\\s]*"), "");//remove '...'.
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
/**================================================================================================
** Import the excel data to the xml string, and output into the parameter 'sXML'.
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_GetFromExcel_AsXML(QString &sXML, QString *sErr)
{
try
{
sXML.clear();
//Import the excel data into the variable 'sTableHtml' as html.
QString sTableHtml;
if (!f_Excel_GetDataAsHtml(sTableHtml, sErr))
{
return false;
}
QDomDocument doc;
QString sErrMsg;
int iRow, iCol;
if (!doc.setContent(sTableHtml, &sErrMsg, &iRow, &iCol))
{
throw sErrMsg + ", the position in excel file is: row = " + QString::number(iRow)
+ ", col = " + QString::number(iCol) + ".";
}
//Get '', and remove the nodes that is not ' '.
QDomNode node_Table = doc.firstChild();
int i = 0;
while (i < node_Table.childNodes().size())
{
QDomNode node = node_Table.childNodes().at(i);
if (node.nodeName() == "tr")
{
++i;
}
else
{
node_Table.removeChild(node);
}
}
doc.replaceChild(node_Table, doc.firstChild());
sXML = doc.toString();
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
/**================================================================================================
** Import the data from the excel file to the json array by the given model.
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_GetFromExcel(const QString &sModel, QJsonArray &oArrRows, const bool &bFirstRowIsHeader, QString *sErr)
{
try
{
oArrRows = QJsonArray();
//Import the excel data into the variable 'sXML' as the xml string.
QString sXML;
if (!f_GetFromExcel_AsXML(sXML, sErr))
{
return false;
}
QDomDocument doc;
QString sErrMsg;
int iRow, iCol;
if (!doc.setContent(sXML, &sErrMsg, &iRow, &iCol))
{
throw sErrMsg + ", the position in excel file is: row = " + QString::number(iRow)
+ ", col = " + QString::number(iCol) + ".";
}
QDomNode node_Table = doc.firstChild();
//Get the cols info from the model.
QJsonObject oJsonModel = HQ_Base::f_Json_StringToJsonObj(sModel);
if (oJsonModel.isEmpty())
{
throw QString("The given model string can not convert to json object.");
}
QStringList sColList = oJsonModel.value("Cols_Visible").toString().split("|", QString::SkipEmptyParts);
//If it has the header, remove the first node.
if (bFirstRowIsHeader)
{
node_Table.removeChild(node_Table.firstChild());
}
//tr (rows)
int iTrCount = node_Table.childNodes().size();
for (int i_tr = 0; i_tr < iTrCount; ++i_tr)
{
QDomNode node_tr = node_Table.childNodes().at(i_tr);
QJsonObject oJsonRow;
//td (cells)
for (int iCol = 0; iCol < sColList.size(); ++iCol)
{
QString sColName = sColList.at(iCol);
QString sValue;
if (iCol < node_tr.childNodes().size())
{
QDomElement el_td = node_tr.childNodes().at(iCol).toElement();
sValue = el_td.text();
}
oJsonRow.insert(sColName, sValue);
}
oArrRows.append(oJsonRow);
}
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
/**================================================================================================
** Import the data from the excel file to the grid.
**===============================================================================================*/
bool HQ_Base_DB_Grid_Excel::f_GetFromExcel(QTableWidget *oGrid, const bool &bFirstRowIsHeader, QString *sErr)
{
try
{
//Import the excel data into the variable 'sXML' as the xml string.
QString sXML;
if (!f_GetFromExcel_AsXML(sXML, sErr))
{
return false;
}
QDomDocument doc;
QString sErrMsg;
int iRow, iCol;
if (!doc.setContent(sXML, &sErrMsg, &iRow, &iCol))
{
throw sErrMsg + ", the position in excel file is: row = " + QString::number(iRow)
+ ", col = " + QString::number(iCol) + ".";
}
QDomNode node_Table = doc.firstChild();
//tr
int iTrCount = node_Table.childNodes().size();
int iRowCount = bFirstRowIsHeader ? iTrCount - 1 : iTrCount;
oGrid->setRowCount(iRowCount);
for (int i_tr = 0; i_tr < iTrCount; ++i_tr)
{
QDomNode node_tr = node_Table.childNodes().at(i_tr);
//td
if (oGrid->columnCount() < node_tr.childNodes().size())
{
oGrid->setColumnCount(node_tr.childNodes().size());
}
for (int i_td = 0; i_td < node_tr.childNodes().size(); ++i_td)
{
QDomElement el_td = node_tr.childNodes().at(i_td).toElement();
QTableWidgetItem *item = new QTableWidgetItem(el_td.text());
if (bFirstRowIsHeader)
{
if (i_tr == 0)
{
oGrid->setHorizontalHeaderItem(i_td, item);
}
else
{
oGrid->setItem(i_tr - 1, i_td, item);
}
}
else
{
oGrid->setItem(i_tr, i_td, item);
}
}
}
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
bool HQ_Base_DB_Grid_Excel::f_SetFirstRowToHeader(QTableWidget *oGrid, const bool &bSetHeader, QString *sErr)
{
try
{
//made header
if (bSetHeader)
{
if (oGrid->rowCount() < 1)
{
throw QString("Operation canceled. For the grid row count is lesser than 1.");
}
for (int iCol = 0; iCol < oGrid->columnCount(); ++iCol)
{
QTableWidgetItem *item = oGrid->horizontalHeaderItem(iCol);
if (nullptr == item)
{
item = new QTableWidgetItem;
}
QString sFirstRowCellText;
if (nullptr != oGrid->item(0, iCol))
{
sFirstRowCellText = oGrid->item(0, iCol)->text();
}
item->setText(sFirstRowCellText);
oGrid->setHorizontalHeaderItem(iCol, item);
delete oGrid->item(0, iCol);
}
oGrid->removeRow(0);
}
//remove header
else
{
oGrid->insertRow(0);
for (int iCol = 0; iCol < oGrid->columnCount(); ++iCol)
{
QTableWidgetItem *item = oGrid->horizontalHeaderItem(iCol);
if (nullptr == item)
{
item = new QTableWidgetItem;
}
QString sText = item->text();
item->setText(QString::number(iCol));
oGrid->setHorizontalHeaderItem(iCol, item);
item = new QTableWidgetItem(sText);
oGrid->setItem(0, iCol, item);
}
}
HQ_Base::f_Pointer_SetValue(sErr, QString());
return true;
}
catch (QString sExceptionMsg)
{
HQ_Base::f_Pointer_SetValue(sErr, sExceptionMsg);
return false;
}
}
代码是我又改了一版通用的。因为之前我的电子表格QTabWidget是自己包装过的,可以根据json模板自动加载表头和数据,并处理对齐,用起来更方便。
而我想把excel功能改得让它更通用,不依赖于我包装了类库。其它就没什么了。下面是我的程序运行情况。
4.运行测试:
首先在界面上添加一个按钮,在它的槽函数中写:
//导出excel:
QString sErr;
if (!HQ_Base_DB_Grid_Excel::f_SaveToExcel(ui->oGridMain, false, true, nullptr, &sErr, "SingleGrid"))
{
if (!sErr.isEmpty())
{
QMessageBox::warning(this, "Exporting failed", sErr, QMessageBox::Ok, QMessageBox::NoButton);
}
}
/* 这里oGridMain是我自己命名的,就是一个QTableWidget。
* 后面参数作用:执行前不询问,执行后询问是否要打开exce文件,
* excel文件路径传入nullptr不获取到外部程序,sheet1表单显示名称设置为“SingleGrid”。
*/
//导入excel:
QString sErr;
QString sModel = ui->oGridMain->f_GetModel(&sErr);
QJsonArray oArrRows;
if (!HQ_Base_DB_Grid_Excel::f_GetFromExcel(sModel, oArrRows, false, &sErr))
{
if (!sErr.isEmpty())
{
QMessageBox::warning(this, "Importing failed", sErr, QMessageBox::Ok, QMessageBox::NoButton);
}
return;
}
ui->oGridMain->addRow(oArrRows);
/* 这里oGridMain是用了我自己做的一个表格类。可以自动根据模板加载表头和数据。
* 如果读者想直接用通用的QTableWidget,可以挑选f_GetFromExcel的其它重载。
*/
很简单,主要就调用f_GetFromExcel函数这一行。然后效果就出来了。
代码中又尝试做了excel导入功能,道理类似。就不再贴图了。当然要注意,这种方式既然是基于文本替换实现的,那导入时对文件也有要求,把excel另存为html,或者粘贴到一个html格式的excel文件中。这样才可以被代码解析。
这里我做了取舍,不想依赖office或wps环境,导入时就多了这一步。除非像开发一个wps一样,能够彻底独立操作excel。
上述方法仅仅是一个思路。网上axobject和openxml的方式都有代码,就是不喜欢ax模式,openxml的代码,qt在处理zip时用到了私有库,想去掉警告还挺麻烦的。因为我想实现一个真正没有任何强依赖,又好用的东西。当然目前我做的还差得远。
5.总结:
开头说过,这种方法不完美,但不仅仅是因为上述原因。亲测,wps支持较好,office不行,毕竟这种方法太粗暴。网上看过openxml相关代码,貌似都在vs环境下使用。目前还没想到更好方法,也不想浪费过多时间。
各位高手可以讨论一下,如果有更好的方式,记得交流一下。
本文完。
你可能感兴趣的:(qt/c++,excel,qt,c++)
C++中map和set的详解
程序员Hagei
c++ 算法 开发语言
C++中map和set的介绍与使用在C++编程中,map和set是标准模板库(STL)中两种非常重要的关联容器。它们基于平衡二叉搜索树(通常是红黑树)的数据结构来实现,提供了高效的数据存储和检索功能。本文将详细介绍map和set的特点、用法以及一些常见的操作示例。一、map的介绍与使用1.map的基本概念map是一个键值对容器,其中每个键都是唯一的,且按照升序排序。map的内部结构是红黑树,这使得
CAD开发经验总结
我的sun&shine
CAD二次开发 c++
作为一个拥有三年CAD二次开发经验的C++程序员,今天将积累的经验总结整理了一下,希望对二次开发人员有帮助,一个word文档,放到下载里面了,挣点积分,文档目录截个图
C++基础系列【26】排序和查找算法
程序喵大人
C++基础系列 c语言 算法 开发语言 c++
博主介绍:程序喵大人35-资深C/C++/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C++20高级编程》《C++23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末记得订阅专栏,以防走丢C++基础系列专栏C语言基础系列专栏C++大佬养成攻略专栏C++训练营排序与查找算法的重要性不用过多介绍了吧,面试也经常考察。
CSP-J备考冲刺必刷题(C++) | AcWing 1253 家谱
热爱编程的通信人
c++ 开发语言
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏:算法题解:C++与Python实现!附上汇总贴:算法竞赛备考冲刺必刷题(C++)|汇总【题目来源】Acwing:1253.家谱-AcWing题库
华为OD机试 - 相对开音节 - 正则表达式(Python/JS/C/C++ 2024 E卷 100分)
哪 吒
华为od 正则表达式 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+
华为OD机试 - 数列描述 - 动态规划(Python/JS/C/C++ 2024 B卷 100分)
哪 吒
华为od 动态规划 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述有一个数列a[N](N=60),从a[0]开始,每一项都是一个数
华为OD机试 - 输出单向链表中倒数第k个结点 - 双指针(Python/JS/C/C++ 2024 B卷 100分)
哪 吒
华为od 链表 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结
华为OD机试 - 图片整理(Python/JS/C/C++ 2024 B卷 100分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要
华为OD机试 - 宜居星球改造计划 - 图的多源BFS(Python/JS/C/C++ 2023 B卷 100分)
哪 吒
华为od 宽度优先 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述2XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理
华为OD机试 - 红黑图(Python/JS/C/C++ 2023 B卷100分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述众所周知红黑树是一种平衡树,它最突出的特性就是不能有两个相邻的红
华为OD机试 - DNA序列(Python/JS/C/C++ 2023 B卷 100分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比
华为OD机试 - 书籍叠放 - 逻辑分析(Python/JS/C/C++ 2024 B卷 200分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述书籍的长、宽都是整数对应(l,w)。如果书A的长宽度都比B长宽大
华为OD机试 - 购买水果最便宜的方案 - 数组(Python/JS/C/C++ 2024 C卷 100分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述有m个水果超市在1-n个小时的不同时间段提供不同价格的打折水果,
华为OD机试 - 目录删除 - 深度优先搜索dfs算法(Python/JS/C/C++ 2024 B卷 200分)
哪 吒
算法 华为od 深度优先
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述某文件系统中有N个目录,每个目录都有一个独一无二的ID。每个目录
华为OD机试 - 寻找最富裕的小家庭(Python/JS/C/C++ 2024 D卷 100分)
哪 吒
华为od python javascript
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富
cmake makefile cmakelists.txt的区别和联系
YRr YRr
CMake c++ 开发语言 cmake
cmakemakefilecmakelists.txt的区别和联系理解CMake、Makefile和CMakeLists.txt的区别和联系,可以帮助我们更好地管理和构建C/C++项目。Makefile(GNUMake):定义与作用:Makefile是一种文本文件,通常用于指定如何编译和链接源代码以生成可执行文件或库文件。它包含了一系列规则(rules),每个规则指定了如何生成一个或多个目标文件(
GStreamer —— 3.1、Qt+GStreamer制作多功能播放器,支持本地mp4文件、rtsp流、usb摄像头等(可跨平台,附源码)
信必诺
GStreamer Qt GStreamer Qt
运行效果 介绍 本项目基于Qt和GStreamer开发了一款多功能播放器,
GStreamer —— 3.2、Qt+GStreamer+OpenCV制作图像处理播放器(对每帧图像处理),支持本地mp4文件、rtsp流、usb摄像头等(可跨平台,附源码)
信必诺
GStreamer Qt GStreamer Qt
运行效果 介绍 本项目是一个结合了Qt、GStreamer和OpenCV的跨平台图像处理播放器项目。该
在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用
daqinzl
linux qt C++ Ubuntu20.04 Qt5 交叉编译 Windows应用
参考链接:https://blog.csdn.net/Interview_TC/article/details/146050419https://bugreports.qt.io/browse/QTBUG-82592重要设置sudoupdate-alternatives--configx86_64-w64-mingw32-g++选择后缀带posix的,(/usr/bin/x86_64-w64-mi
C++小游戏——迷宫探险
Duke369rose
C++ c++ 算法 开发语言 小游戏
一个C++小游戏,编译和运行耗时都有点长,麻烦大神提点建议。联系邮箱:
[email protected] 文件见文章顶部代码#include#include#include#include//定义迷宫单元格类型enumCellType{WALL,PATH,START,END,TREASURE};//迷宫类classMaze{public:Maze(intwidth,intheigh
在QT中进行控件提升操作
琳琳简单点
qt 开发语言 控件提升
目录一、概述二、功能需求三、提升操作1)拖入标准控件2)自定义类3)提升控件一、概述QT中提供的标准控件能够满足我们大多数情况下的功能需求,但是在一些特殊应用场合,我们可能需要对控件的功能进行扩展,或者改写控件的功能实现。为满足此需求,QT提供了对标准控件的提升功能,用于重新自定义标准控件的实现。本文以QListWidget控件为例,详细介绍了控件提升的具体操作和实现。二、功能需求我们需要实现在Q
双一流软件工程大二听闻 Java 前景堪忧,是否该转C++或人工智能或者读研?
程序员yt
java c++ 人工智能
今天给大家分享的是一位粉丝的提问,双一流软件工程大二听闻Java前景堪忧,是否该转C++或人工智能或者读研?接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。同学提问:yt老师好,我是双一流软件工程的大二学生,一直在学习java方向,目前掌握了数据库,spring框架等内容,大一暑假在老家一个小公司找了段实习,有蓝桥杯java组b组国一,专业排名前2(保研名
Effective Modern C++ 条款6:auto推导若非己愿,使用显式类型初始化惯用法
举个栗子2
Effective Modern C++ c++
更多C++学习笔记,关注wx公众号:cpp读书笔记Item6:Usetheexplicitlytypedinitializeridiomwhenautodeducesundesiredtypes在Item5中解释了比起显式指定类型使用auto声明变量有若干技术优势,但是有时当你想向左转auto却向右转。举个例子,假如我有一个函数,参数为Widget,返回一个std::vector,这里的bool表
Python, C ++开发家庭开支
Geeker-2025
python c++
开发一款**家庭开支数字化记录与结算App**是一个非常有意义的项目,旨在帮助家庭用户高效管理开支、记录消费、分析财务状况,并提供结算和预算管理功能。以下是基于**Python**和**C++**的开发方案,结合两者在数据处理、实时通信和系统开发中的优势。---##1.**项目需求分析**家庭开支数字化记录与结算App的核心功能包括:1.**用户管理**:-用户注册、登录,支持家庭成员管理。2.*
MongoDB
z小天才b
MongoDB mongodb 数据库
一、MongoDB简介1.1什么是MongoDB?MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成,类似于JSON对象,字段值可以包含其他文档、数组及文档数组。1.2MongoDB的核心特性文档型数据库:数据以BSON(BinaryJSON)格式存储灵活的
【Q&A】装饰模式在Qt中有哪些运用?
浅慕Antonio
Q&A qt 数据库 服务器
在Qt框架中,装饰模式(DecoratorPattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例:一、QIODevice装饰体系(继承方式)场景为基础IO设备(如文件、缓冲区)添加数据格式解析、缓冲优化等功能。类图(Mermaid)«abstract»QIODevice+readData()+writeData()QFileQBuf
C++从入门到实战(六)类和对象(第二部分)C++成员对象及其实例化,对象大小与this详解
珹洺
C++学习之旅 c++ java 开发语言 数据结构 sql 汇编 算法
C++从入门到实战(六)类和对象(第二部分)C++成员对象及其实例化,对象大小与this详解前言一、类和对象里面成员变量,成员函数是什么1.1成员变量1.2成员函数1.3成员变量、成员函数与局部变量的对比二、类的实例化2.1什么是实例化,实例化的概念2.2类的实例化过程1.类的定义2.实例化对象3.初始化对象4.访问对象的成员函数三、对象大小类对象大小计算示例四、this指针4.1this的原理4
ffmpeg录屏
_洛_神
音视频 音视频
qt+ffmpeg屏幕录制软件完整工程链接:https://download.csdn.net/download/weixin_42538789/85013858测试代码#include#include"screencapture.h"#includeusingnamespacestd;intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv
C++有哪些高级特性值得学习?
c++
C++是一种功能丰富且复杂的编程语言,其中许多高级特性可以帮助开发者编写更高效、更安全、更灵活的代码。以下是一些值得深入学习的C++高级特性:模板编程(Templates)模板是C++中实现泛型编程的核心机制,允许开发者编写与数据类型无关的代码。模板函数cpp复制templateTmax(Ta,Tb){return(a>b)?a:b;}优点:模板函数可以处理多种数据类型,避免了代码重复。应用场景:
流浪地球 - 华为OD机试真题(E卷、C++)
什码情况
华为od c++ 算法 数据结构 面试 机试
针对刷题难,效率慢,我们提供一对一算法辅导,针对个人情况定制化的提高计划(全称1V1效率更高)。有兴趣的同学可以扫码添加我们的微信(code5bug)了解,免费试课一下。题目描述流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N。1).初始状态下所有的发动机都是未启动状态;2).发动机启动的方式分为”手动启动”和”关联启动”两种方式;3).如果在时刻1一个发动机被启动,下一个时刻
面向对象面向过程
3213213333332132
java
面向对象:把要完成的一件事,通过对象间的协作实现。
面向过程:把要完成的一件事,通过循序依次调用各个模块实现。
我把大象装进冰箱这件事为例,用面向对象和面向过程实现,都是用java代码完成。
1、面向对象
package bigDemo.ObjectOriented;
/**
* 大象类
*
* @Description
* @author FuJian
Java Hotspot: Remove the Permanent Generation
bookjovi
HotSpot
openjdk上关于hotspot将移除永久带的描述非常详细,http://openjdk.java.net/jeps/122
JEP 122: Remove the Permanent Generation
Author Jon Masamitsu
Organization Oracle
Created 2010/8/15
Updated 2011/
正则表达式向前查找向后查找,环绕或零宽断言
dcj3sjt126com
正则表达式
向前查找和向后查找
1. 向前查找:根据要匹配的字符序列后面存在一个特定的字符序列(肯定式向前查找)或不存在一个特定的序列(否定式向前查找)来决定是否匹配。.NET将向前查找称之为零宽度向前查找断言。
对于向前查找,出现在指定项之后的字符序列不会被正则表达式引擎返回。
2. 向后查找:一个要匹配的字符序列前面有或者没有指定的
BaseDao
171815164
seda
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
public Conn
Ant标签详解--Java命令
g21121
Java命令
这一篇主要介绍与java相关标签的使用 终于开始重头戏了,Java部分是我们关注的重点也是项目中用处最多的部分。
1
[简单]代码片段_电梯数字排列
53873039oycg
代码
今天看电梯数字排列是9 18 26这样呈倒N排列的,写了个类似的打印例子,如下:
import java.util.Arrays;
public class 电梯数字排列_S3_Test {
public static void main(S
Hessian原理
云端月影
hessian原理
Hessian 原理分析
一. 远程通讯协议的基本原理
网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协
区分Activity的四种加载模式----以及Intent的setFlags
aijuans
android
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置
Activity有四种加载模式:
standard
singleTop
hibernate几个核心API及其查询分析
antonyup_2006
html .net Hibernate xml 配置管理
(一) org.hibernate.cfg.Configuration类
读取配置文件并创建唯一的SessionFactory对象.(一般,程序初始化hibernate时创建.)
Configuration co
PL/SQL的流程控制
百合不是茶
oracle PL/SQL编程 循环控制
PL/SQL也是一门高级语言,所以流程控制是必须要有的,oracle数据库的pl/sql比sqlserver数据库要难,很多pl/sql中有的sqlserver里面没有
流程控制;
分支语句 if 条件 then 结果 else 结果 end if ;
条件语句 case when 条件 then 结果;
循环语句 loop
强大的Mockito测试框架
bijian1013
mockito 单元测试
一.自动生成Mock类 在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。二.自动注入Mock类到被测试类 &nbs
精通Oracle10编程SQL(11)开发子程序
bijian1013
oracle 数据库 plsql
/*
*开发子程序
*/
--子程序目是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用程序中多次调用
--PL/SQL有两种类型的子程序:过程和函数
--开发过程
--建立过程:不带任何参数
CREATE OR REPLACE PROCEDURE out_time
IS
BEGIN
DBMS_OUTPUT.put_line(systimestamp);
E
【EhCache一】EhCache版Hello World
bit1129
Hello world
本篇是EhCache系列的第一篇,总体介绍使用EhCache缓存进行CRUD的API的基本使用,更细节的内容包括EhCache源代码和设计、实现原理在接下来的文章中进行介绍
环境准备
1.新建Maven项目
2.添加EhCache的Maven依赖
<dependency>
<groupId>ne
学习EJB3基础知识笔记
白糖_
bean Hibernate jboss webservice ejb
最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零bug记录,这也让自己腾出不少时间补充知识。花了两天时间把“传智播客EJB3.0”看完了,EJB基本的知识也有些了解,在这记录下EJB的部分知识,以供自己以后复习使用。
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基
angular.bootstrap
boyitech
AngularJS AngularJS API angular中文api
angular.bootstrap
描述:
手动初始化angular。
这个函数会自动检测创建的module有没有被加载多次,如果有则会在浏览器的控制台打出警告日志,并且不会再次加载。这样可以避免在程序运行过程中许多奇怪的问题发生。
使用方法: angular .
java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数
bylijinnan
java
public class SearchInShiftedArray {
/**
* 题目:给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数。
* 请在这个特殊数组中找出给定的整数。
* 解答:
* 其实就是“旋转数组”。旋转数组的最小元素见http://bylijinnan.iteye.com/bl
天使还是魔鬼?都是我们制造
ducklsl
生活 教育 情感
----------------------------剧透请原谅,有兴趣的朋友可以自己看看电影,互相讨论哦!!!
从厦门回来的动车上,无意中瞟到了书中推荐的几部关于儿童的电影。当然,这几部电影可能会另大家失望,并不是类似小鬼当家的电影,而是关于“坏小孩”的电影!
自己挑了两部先看了看,但是发现看完之后,心里久久不能平
[机器智能与生物]研究生物智能的问题
comsci
生物
我想,人的神经网络和苍蝇的神经网络,并没有本质的区别...就是大规模拓扑系统和中小规模拓扑分析的区别....
但是,如果去研究活体人类的神经网络和脑系统,可能会受到一些法律和道德方面的限制,而且研究结果也不一定可靠,那么希望从事生物神经网络研究的朋友,不如把
获取Android Device的信息
dai_lm
android
String phoneInfo = "PRODUCT: " + android.os.Build.PRODUCT;
phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI;
phoneInfo += ", TAGS: " + android.os.Build.TAGS;
ph
最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现
datamachine
java 算法 字符串匹配
原文:http://www.javacodegeeks.com/2013/11/java-implementation-of-optimal-string-alignment.html------------------------------------------------------------------------------------------------------------
小学5年级英语单词背诵第一课
dcj3sjt126com
english word
long 长的
show 给...看,出示
mouth 口,嘴
write 写
use 用,使用
take 拿,带来
hand 手
clever 聪明的
often 经常
wash 洗
slow 慢的
house 房子
water 水
clean 清洁的
supper 晚餐
out 在外
face 脸,
macvim的使用实战
dcj3sjt126com
mac vim
macvim用的是mac里面的vim, 只不过是一个GUI的APP, 相当于一个壳
1. 下载macvim
https://code.google.com/p/macvim/
2. 了解macvim
:h vim的使用帮助信息
:h macvim
java二分法查找
蕃薯耀
java二分法查找 二分法 java二分法
java二分法查找
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年6月23日 11:40:03 星期二
http:/
Spring Cache注解+Memcached
hanqunfeng
spring memcached
Spring3.1 Cache注解
依赖jar包:
<!-- simple-spring-memcached -->
<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>simple-s
apache commons io包快速入门
jackyrong
apache commons
原文参考
http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html
Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:
1) 工具类
2
如何学习编程
lampcy
java 编程 C++ c
首先,我想说一下学习思想.学编程其实跟网络游戏有着类似的效果.开始的时候,你会对那些代码,函数等产生很大的兴趣,尤其是刚接触编程的人,刚学习第一种语言的人.可是,当你一步步深入的时候,你会发现你没有了以前那种斗志.就好象你在玩韩国泡菜网游似的,玩到一定程度,每天就是练级练级,完全是一个想冲到高级别的意志力在支持着你.而学编程就更难了,学了两个月后,总是觉得你好象全都学会了,却又什么都做不了,又没有
架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy
nannan408
Spring3
1.前言。
如题。
2.描述。
@DependsOn用于强制初始化其他Bean。可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean。
@DependsOn({"steelAxe","abc"})
@Comp
Spring4+quartz2的配置和代码方式调度
Everyday都不同
代码 配置 spring4 quartz2.x 定时任务
前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……
quartz定时任务必须搞清楚几个概念:
JobDetail——处理类
Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象
Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发
Hibernate入门
tntxia
Hibernate
前言
使用面向对象的语言和关系型的数据库,开发起来很繁琐,费时。由于现在流行的数据库都不面向对象。Hibernate 是一个Java的ORM(Object/Relational Mapping)解决方案。
Hibernte不仅关心把Java对象对应到数据库的表中,而且提供了请求和检索的方法。简化了手工进行JDBC操作的流程。
如
Math类
xiaoxing598
Math
一、Java中的数字(Math)类是final类,不可继承。
1、常数 PI:double圆周率 E:double自然对数
2、截取(注意方法的返回类型) double ceil(double d) 返回不小于d的最小整数 double floor(double d) 返回不大于d的整最大数 int round(float f) 返回四舍五入后的整数 long round