func:实现了排序功能。

This commit is contained in:
2024-05-18 01:26:52 +08:00
parent f9fd64d90f
commit 4976b5548e
10 changed files with 112 additions and 268 deletions

View File

@@ -11,7 +11,7 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
{
ui->setupUi(this);
setWindowTitle(u8"OneLevelXmlOpr v1.2.7");
setWindowTitle(u8"OneLevelXmlOpr v1.2.8");
setWindowIcon(QIcon("://resource/xml.ico"));
setMinimumWidth(900);
@@ -37,7 +37,8 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
read(file);
});
connect(ui->btnSearch, &QPushButton::clicked, this, [&]() { search(); });
connect(ui->btnRead, &QPushButton::clicked, this, [&]() { read(ui->edStatus->text().trimmed()); });
connect(ui->btnRead, &QPushButton::clicked, this,
[&]() { read(ui->edStatus->text().trimmed()); });
connect(ui->btnSave, &QPushButton::clicked, this, [&]() { save(); });
connect(ui->btnExit, &QPushButton::clicked, this, [&]() { QApplication::exit(0); });
connect(ui->btnReset, &QPushButton::clicked, this, &MainWidget::reset);
@@ -53,13 +54,22 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
unsigned int cur = ui->edCurPage->text().toUInt();
push_content(current_, cur);
});
connect(ui->btnResort, &QPushButton::clicked, this, [&]() {
sort_by_repeat(vec_);
std::vector<Element_t*> nvec{};
xml_.copy_and_del(vec_, nvec);
vec_.clear();
std::swap(vec_, nvec);
current_ = vec_;
push_content(current_);
});
QSettings settings;
settings.beginGroup("xmlopr");
restoreGeometry(settings.value("geometry").toByteArray());
settings.endGroup();
//QFile qss_file("://qss/lightblue.css");
// QFile qss_file("://qss/lightblue.css");
QFile qss_file("://qss/flatgray.css");
if (qss_file.open(QFile::ReadOnly)) {
qApp->setStyleSheet(qss_file.readAll());
@@ -132,8 +142,10 @@ void MainWidget::generate_table_widget()
{
tab_widget_ = new QTableWidget();
tab_widget_->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tab_widget_, &QTableWidget::itemChanged, this, [&](QTableWidgetItem* item) { item_changed_handle(item); });
connect(tab_widget_, &QTableWidget::customContextMenuRequested, this, &MainWidget::show_custom_menu);
connect(tab_widget_, &QTableWidget::itemChanged, this,
[&](QTableWidgetItem* item) { item_changed_handle(item); });
connect(tab_widget_, &QTableWidget::customContextMenuRequested, this,
&MainWidget::show_custom_menu);
auto config = ini_.get_config();
auto keys = splitString(config.purpose, ",");
keys_.clear();
@@ -149,7 +161,7 @@ void MainWidget::generate_table_widget()
tab_widget_->setColumnCount(list.size());
tab_widget_->setHorizontalHeaderLabels(list);
tab_widget_->setSelectionBehavior(QAbstractItemView::SelectRows);
//tab_widget_->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
// tab_widget_->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
for (auto i = 0; i < keys.size(); ++i) {
tab_widget_->setColumnWidth(i, width_[i]);
@@ -433,8 +445,8 @@ void MainWidget::insert_one_line(Element_t* ele, int row)
if (i == 0) {
wgItem->setFlags(wgItem->flags() & ~Qt::ItemIsEditable);
//wgItem->setFlags(wgItem->flags() | Qt::ItemIsUserCheckable);
//wgItem->setCheckState(Qt::Checked);
// wgItem->setFlags(wgItem->flags() | Qt::ItemIsUserCheckable);
// wgItem->setCheckState(Qt::Checked);
}
wgItem->setText(QString(data));
@@ -517,3 +529,39 @@ tinyxml2::XMLElement* MainWidget::get_element_bykey(const QString& key)
}
return ret;
}
void MainWidget::sort_by_repeat(std::vector<Element_t*>& vec)
{
struct SElement_t {
SElement_t(Element_t* e, std::string& s)
{
ele = e;
str = std::move(s);
}
Element_t* ele{};
std::string str{};
};
std::vector<SElement_t> turn_vec{};
for (const auto& item : vec) {
const char* str = item->Attribute(keys_[0].c_str());
turn_vec.emplace_back(item, std::string(str));
}
auto compare = [&](const SElement_t& se1, const SElement_t& se2) {
std::size_t i = 0;
// 逐个字符比较,直到找到不同的字符或者某个字符串到达结尾
while (i < se1.str.length() && i < se2.str.length()) {
if (se1.str[i] != se2.str[i]) {
return se1.str[i] < se2.str[i];
}
++i;
}
// 如果有一个字符串到达结尾,而另一个还没有,则较短的字符串排在前面
return se1.str.length() < se2.str.length();
};
std::sort(turn_vec.begin(), turn_vec.end(), compare);
vec.clear();
for (const auto& item : turn_vec) {
vec.push_back(item.ele);
}
}