update:导入数据功能进度更新(未完成)。

This commit is contained in:
taynpg 2024-05-19 00:48:03 +08:00
parent a89ef1e677
commit 2bc368c781
7 changed files with 103 additions and 27 deletions

View File

@ -31,7 +31,7 @@ TabWidth: 4
# 构造函数的初始化列表要么都在同一行,要么都各自一行 # 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 每行字符的限制,0表示没有限制 # 每行字符的限制,0表示没有限制
ColumnLimit: 100 ColumnLimit: 110
# 允许短的块放在同一行 # 允许短的块放在同一行
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
# 是否允许短函数在一行 # 是否允许短函数在一行

View File

@ -54,12 +54,8 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
connect(ui->btnImport, &QPushButton::clicked, this, [&]() { connect(ui->btnImport, &QPushButton::clicked, this, [&]() {
CDataEdit edit; CDataEdit edit;
edit.is_import_ = true; edit.is_import_ = true;
edit.set_xml_opr(&xml_);
edit.exec(); edit.exec();
if (edit.is_import_sucess_) {
CUtil::msg(this, u8"导入成功");
} else {
CUtil::msg(this, u8"导入失败");
}
}); });
connect(ui->btnPageNext, &QPushButton::clicked, this, [&]() { connect(ui->btnPageNext, &QPushButton::clicked, this, [&]() {
unsigned int cur = ui->edCurPage->text().toUInt(); unsigned int cur = ui->edCurPage->text().toUInt();

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>985</width> <width>1211</width>
<height>805</height> <height>805</height>
</rect> </rect>
</property> </property>
@ -37,13 +37,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="btnBackup">
<property name="text">
<string>备份快照</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="btnSave"> <widget class="QPushButton" name="btnSave">
<property name="text"> <property name="text">
@ -74,6 +67,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="btnBackup">
<property name="text">
<string>备份快照</string>
</property>
</widget>
</item>
<item> <item>
<widget class="Line" name="line"> <widget class="Line" name="line">
<property name="orientation"> <property name="orientation">

View File

@ -3,6 +3,8 @@
#include <QScreen> #include <QScreen>
#include <QClipboard> #include <QClipboard>
#include <tinyxml2.h> #include <tinyxml2.h>
#include <vector>
#include <string>
#include "../public_def.h" #include "../public_def.h"
CDataEdit::CDataEdit(QWidget* parent) : QDialog(parent), ui(new Ui::CDataEdit) CDataEdit::CDataEdit(QWidget* parent) : QDialog(parent), ui(new Ui::CDataEdit)
@ -10,7 +12,7 @@ CDataEdit::CDataEdit(QWidget* parent) : QDialog(parent), ui(new Ui::CDataEdit)
ui->setupUi(this); ui->setupUi(this);
// setMinimumWidth(600); // setMinimumWidth(600);
setWindowTitle(u8"属性编辑"); setWindowTitle(u8"编辑");
connect(ui->btnExit, &QPushButton::clicked, this, [&]() { close(); }); connect(ui->btnExit, &QPushButton::clicked, this, [&]() { close(); });
connect(ui->btnAdd, &QPushButton::clicked, this, [&]() { import_data(); }); connect(ui->btnAdd, &QPushButton::clicked, this, [&]() { import_data(); });
@ -30,6 +32,11 @@ void CDataEdit::set_data(const QString& data)
data_ = data; data_ = data;
} }
void CDataEdit::set_xml_opr(CXmlOpr* xml_opr)
{
xml_opr_ = xml_opr;
}
void CDataEdit::import_data() void CDataEdit::import_data()
{ {
QString data = ui->plainTextEdit->toPlainText(); QString data = ui->plainTextEdit->toPlainText();
@ -37,18 +44,24 @@ void CDataEdit::import_data()
CUtil::msg(this, u8"内容为空"); CUtil::msg(this, u8"内容为空");
return; return;
} }
if (xml_opr_ == nullptr) {
CUtil::msg(this, u8"xml_opr无实例。");
return;
}
std::vector<std::string> valid_data{};
QStringList list = data.trimmed().split("\n"); QStringList list = data.trimmed().split("\n");
for (int i = 0; i < list.size(); ++i) { for (int i = 0; i < list.size(); ++i) {
const QString& item = list[i]; const QString& item = list[i];
if (item.trimmed().isEmpty()) { if (item.trimmed().isEmpty()) {
continue; continue;
} }
tinyxml2::XMLDocument doc; if (xml_opr_->check_same_struct (item.toStdString())) {
doc.Parse(item.toStdString().c_str()); CUtil::msg(this, u8"不是合法的xml语句或者与现有结构不一致。");
if (doc.Error()) {
CUtil::msg(this, u8"不是合法的xml语句。");
return; return;
} }
valid_data.push_back(item.toStdString());
} }
} }

View File

@ -3,6 +3,8 @@
#include <QDialog> #include <QDialog>
#include "xml_opr.h"
namespace Ui { namespace Ui {
class CDataEdit; class CDataEdit;
} }
@ -18,6 +20,7 @@ public:
public: public:
void set_data(const QString& data); void set_data(const QString& data);
void import_data(); void import_data();
void set_xml_opr(CXmlOpr* xml_opr);
protected: protected:
void showEvent(QShowEvent* event) override; void showEvent(QShowEvent* event) override;
@ -30,6 +33,7 @@ public:
private: private:
Ui::CDataEdit* ui; Ui::CDataEdit* ui;
QString data_{}; QString data_{};
CXmlOpr* xml_opr_{};
}; };
#endif // DATA_EDIT_H #endif // DATA_EDIT_H

View File

@ -101,6 +101,61 @@ Element_t* CXmlOpr::copy_element(Element_t* ele)
return ret; return ret;
} }
bool CXmlOpr::check_valid_xml_data(const std::string& data)
{
tinyxml2::XMLDocument doc;
doc.Parse(data.c_str());
if (doc.Error()) {
return false;
}
return true;
}
bool CXmlOpr::check_same_struct(const std::string& data)
{
auto* own_ele = parent_node_->FirstChildElement(opr_base_.the_node.c_str());
if (own_ele == nullptr) {
return true;
}
tinyxml2::XMLDocument doc;
doc.Parse(data.c_str());
if (doc.Error()) {
return false;
}
const auto* import_ele = doc.FirstChildElement(opr_base_.the_node.c_str());
if (import_ele == nullptr) {
return false;
}
const auto* attribute = own_ele->FirstAttribute();
int own_cnt = 0;
while (attribute) {
++own_cnt;
if (import_ele->FindAttribute(attribute->Name()) == nullptr) {
return true;
}
attribute = attribute->Next();
}
const auto* attr_import = import_ele->FirstAttribute();
int import_cnt = 0;
while (attr_import) {
++import_cnt;
attr_import = attr_import->Next();
}
if (import_cnt != own_cnt) {
return false;
}
return true;
}
bool CXmlOpr::import_newer_data(const std::vector<std::string>& vec)
{
return false;
}
void CXmlOpr::del_element(Element_t* ele) void CXmlOpr::del_element(Element_t* ele)
{ {
parent_node_->DeleteChild(ele); parent_node_->DeleteChild(ele);

View File

@ -21,15 +21,23 @@ public:
~CXmlOpr(); ~CXmlOpr();
public: public:
bool open(const std::string& xml_path); bool open(const std::string& xml_path);
void set_baseinfo(const OprBase& base); void set_baseinfo(const OprBase& base);
bool parse_xml(std::vector<Element_t*>& vec); bool parse_xml(std::vector<Element_t*>& vec);
void copy_and_del(std::vector<Element_t*>& vec, std::vector<Element_t*>& out); void copy_and_del(std::vector<Element_t*>& vec, std::vector<Element_t*>& out);
void insert_brother_node(Element_t* brother, Element_t* newer); void insert_brother_node(Element_t* brother, Element_t* newer);
void del_element(Element_t* ele);
bool check_key_exists(const Property_t& property);
bool save();
public:
Element_t* copy_element(Element_t* ele); Element_t* copy_element(Element_t* ele);
void del_element(Element_t* ele); // 检查 xml 格式合法性
bool check_key_exists(const Property_t& property); bool check_valid_xml_data(const std::string& data);
bool save(); // 不检查 xml 格式合法性,请自行调用 check_valid_xml_data
bool check_same_struct(const std::string& data);
// 不检查 xml 格式合法性,请自行调用 check_valid_xml_data
bool import_newer_data(const std::vector<std::string>& vec);
public: public:
void get_key_value(Element_t* ele, Property_t& vec); void get_key_value(Element_t* ele, Property_t& vec);