|
@@ -1,4 +1,4 @@
|
|
|
-#include "compareitemlistdialog.h"
|
|
|
+#include "compareitemlistdialog.h"
|
|
|
#include "ui_compareitemlistwidget.h"
|
|
|
|
|
|
|
|
@@ -13,6 +13,7 @@
|
|
|
#include "warning.h"
|
|
|
#include "compareitemdetailwidget.h"
|
|
|
#include "baseheader.h"
|
|
|
+#include "DelegateCheckBox.h"
|
|
|
|
|
|
|
|
|
/* 重载比较函数 */
|
|
@@ -65,7 +66,7 @@ CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
|
|
|
/* 设置标题 */
|
|
|
setTitle("对比项列表", QSize(120, 18));
|
|
|
|
|
|
- UIStyle.registerWidget(widgetContent);
|
|
|
+ // UIStyle.registerWidget(widgetContent);
|
|
|
|
|
|
|
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "ObjectName: {}", widgetContent->objectName().toStdString());
|
|
@@ -79,12 +80,11 @@ CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
|
|
|
connect(ui->pBtn_enableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_enable_Clicked);
|
|
|
connect(ui->pBtn_disableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_disable_Clicked);
|
|
|
|
|
|
- connect(ui->tableView, &QTableView::doubleClicked, this, &CompareItemListDialog::do_tableView_doubleClicked);
|
|
|
|
|
|
/* 初始化表格 */
|
|
|
initTable();
|
|
|
|
|
|
-
|
|
|
+ UIStyle.registerWidget(widgetContent);
|
|
|
}
|
|
|
|
|
|
CompareItemListDialog::~CompareItemListDialog()
|
|
@@ -145,7 +145,7 @@ void CompareItemListDialog::do_pBtn_add_Clicked()
|
|
|
void CompareItemListDialog::do_pBtn_delete_Clicked()
|
|
|
{
|
|
|
/* 获取是否有选中的行 */
|
|
|
- QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
|
|
|
+ const QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
|
|
|
if(selectedRows.isEmpty())
|
|
|
{
|
|
|
TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", GInfo.getTopWindow());
|
|
@@ -164,12 +164,36 @@ void CompareItemListDialog::do_pBtn_delete_Clicked()
|
|
|
for(const QModelIndex& index : selectedRows)
|
|
|
{
|
|
|
/* 获取对比项ID */
|
|
|
- int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
+ // int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
+ // int nID = m_model->data(index, m_userRole_CompareItemID).toInt();
|
|
|
+ int nID = index.data(m_userRole_CompareItemID).toInt();
|
|
|
+ // SPDLOG_LOGGER_INFO(m_logger, "删除对比项ID: {}", nID);
|
|
|
/* 从全局对比项数据中删除 */
|
|
|
CIData.removeCompareItem(nID);
|
|
|
- /* 从表格模型中删除 */
|
|
|
- m_model->removeRow(index.row());
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
+ /* 删除表格中的数据,需要倒叙删除,因为 selectedRows 也会继续向 m_model 获取数据 */
|
|
|
+ for (int i = selectedRows.size() - 1; i >= 0; --i)
|
|
|
+ {
|
|
|
+ m_model->removeRow(selectedRows[i].row());
|
|
|
+ }
|
|
|
+ // for(const QModelIndex& index : selectedRows)
|
|
|
+ // {
|
|
|
+ // /* 获取对比项ID */
|
|
|
+ // int nID = index.data(m_userRole_CompareItemID).toInt();
|
|
|
+ // SPDLOG_LOGGER_WARN(m_logger, "删除对比项ID: {}", nID);
|
|
|
+
|
|
|
+ // /* 从表格模型中删除 */
|
|
|
+ // for(int i = 0; i < m_model->rowCount(); ++i)
|
|
|
+ // {
|
|
|
+ // if(m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt() == nID)
|
|
|
+ // {
|
|
|
+ // m_model->removeRow(i);
|
|
|
+ // break;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
}
|
|
|
|
|
|
/* 点击了编辑按钮 */
|
|
@@ -231,34 +255,37 @@ void CompareItemListDialog::do_pBtn_enable_Clicked()
|
|
|
TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
|
|
|
return;
|
|
|
}
|
|
|
- /* 只取出第一个 */
|
|
|
- QModelIndex index = selectedRows.first();
|
|
|
- /* 获取对比项ID */
|
|
|
- int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
- /* 查找对比项信息 */
|
|
|
- CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
|
|
|
- if(ciInfo.nID < 0)
|
|
|
- {
|
|
|
- TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法启用", GInfo.getTopWindow());
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法启用", nID);
|
|
|
- return;
|
|
|
- }
|
|
|
- /* 判断是否已经启用 */
|
|
|
- if(ciInfo.isEnable)
|
|
|
- {
|
|
|
- TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于启用状态", GInfo.getTopWindow());
|
|
|
- return; /* 如果已经启用,直接返回 */
|
|
|
- }
|
|
|
- /* 修改对比项状态为启用 */
|
|
|
- ciInfo.isEnable = true;
|
|
|
- if(!CIData.modifyCompareItem(ciInfo))
|
|
|
+ for(auto& index : selectedRows)
|
|
|
{
|
|
|
- TipWidget::display(TipWidget::OPERATOR_WARN, "对比项启用失败,请稍后重试", GInfo.getTopWindow());
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 启用失败", nID);
|
|
|
- return;
|
|
|
+ /* 获取对比项ID */
|
|
|
+ int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
+ /* 查找对比项信息 */
|
|
|
+ CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
|
|
|
+ if(ciInfo.nID < 0)
|
|
|
+ {
|
|
|
+ TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法启用", GInfo.getTopWindow());
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法启用", nID);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 判断是否已经启用 */
|
|
|
+ if(ciInfo.isEnable)
|
|
|
+ {
|
|
|
+ // TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于启用状态", GInfo.getTopWindow());
|
|
|
+ return; /* 如果已经启用,直接返回 */
|
|
|
+ }
|
|
|
+ /* 修改对比项状态为启用 */
|
|
|
+ ciInfo.isEnable = true;
|
|
|
+ if(!CIData.modifyCompareItem(ciInfo))
|
|
|
+ {
|
|
|
+ TipWidget::display(TipWidget::OPERATOR_WARN, "对比项启用失败,请稍后重试", GInfo.getTopWindow());
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 启用失败", nID);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 更新表格中的状态 */
|
|
|
+ m_model->setData(m_model->index(index.row(), 1), "启用");
|
|
|
}
|
|
|
- /* 更新表格中的状态 */
|
|
|
- m_model->setData(m_model->index(index.row(), 1), "启用");
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/* 禁用对比项 */
|
|
@@ -271,34 +298,35 @@ void CompareItemListDialog::do_pBtn_disable_Clicked()
|
|
|
TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
|
|
|
return;
|
|
|
}
|
|
|
- /* 只取出第一个 */
|
|
|
- QModelIndex index = selectedRows.first();
|
|
|
- /* 获取对比项ID */
|
|
|
- int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
- /* 查找对比项信息 */
|
|
|
- CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
|
|
|
- if(ciInfo.nID < 0)
|
|
|
- {
|
|
|
- TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法禁用", GInfo.getTopWindow());
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法禁用", nID);
|
|
|
- return;
|
|
|
- }
|
|
|
- /* 判断是否已经启用 */
|
|
|
- if(!ciInfo.isEnable)
|
|
|
+ for(auto& index : selectedRows)
|
|
|
{
|
|
|
- TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于禁用状态", GInfo.getTopWindow());
|
|
|
- return;
|
|
|
- }
|
|
|
- /* 修改对比项状态为启用 */
|
|
|
- ciInfo.isEnable = false;
|
|
|
- if(!CIData.modifyCompareItem(ciInfo))
|
|
|
- {
|
|
|
- TipWidget::display(TipWidget::OPERATOR_WARN, "对比项禁用失败,请稍后重试", GInfo.getTopWindow());
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 禁用失败", nID);
|
|
|
- return;
|
|
|
+ /* 获取对比项ID */
|
|
|
+ int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
|
|
|
+ /* 查找对比项信息 */
|
|
|
+ CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
|
|
|
+ if(ciInfo.nID < 0)
|
|
|
+ {
|
|
|
+ TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法禁用", GInfo.getTopWindow());
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法禁用", nID);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 判断是否已经启用 */
|
|
|
+ if(!ciInfo.isEnable)
|
|
|
+ {
|
|
|
+ // TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于禁用状态", GInfo.getTopWindow());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 修改对比项状态为启用 */
|
|
|
+ ciInfo.isEnable = false;
|
|
|
+ if(!CIData.modifyCompareItem(ciInfo))
|
|
|
+ {
|
|
|
+ TipWidget::display(TipWidget::OPERATOR_WARN, "对比项禁用失败,请稍后重试", GInfo.getTopWindow());
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 禁用失败", nID);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 更新表格中的状态 */
|
|
|
+ m_model->setData(m_model->index(index.row(), 1), "未启用");
|
|
|
}
|
|
|
- /* 更新表格中的状态 */
|
|
|
- m_model->setData(m_model->index(index.row(), 1), "未启用");
|
|
|
}
|
|
|
|
|
|
|
|
@@ -330,6 +358,99 @@ void CompareItemListDialog::do_tableView_doubleClicked(const QModelIndex &index)
|
|
|
}
|
|
|
|
|
|
|
|
|
+/* 表格点击了一行 */
|
|
|
+void CompareItemListDialog::do_tableView_clicked(const QModelIndex &index)
|
|
|
+{
|
|
|
+ if(index.column() == 4)
|
|
|
+ {
|
|
|
+ /* 打开对比项详情弹窗 */
|
|
|
+ do_tableView_doubleClicked(index);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // int row = index.row();
|
|
|
+ // /* 修改第一列状态 */
|
|
|
+ // bool currentState = m_model->data(m_model->index(row, 0), Qt::CheckStateRole).toBool();
|
|
|
+ // bool nextState = !currentState;
|
|
|
+ // m_model->setData(m_model->index(row, 0), nextState, Qt::CheckStateRole);
|
|
|
+}
|
|
|
+
|
|
|
+/* 修改了选择行的状态 */
|
|
|
+void CompareItemListDialog::do_selectChanged(const QItemSelection &selected, const QItemSelection &deselected)
|
|
|
+{
|
|
|
+ /* 这里获取的是选中的所有单元格数目 */
|
|
|
+ QModelIndexList selectedRows = selected.indexes();
|
|
|
+ QModelIndexList deselectedRows = deselected.indexes();
|
|
|
+ if(selectedRows.isEmpty() && deselectedRows.isEmpty())
|
|
|
+ {
|
|
|
+ /* 如果没有选中行,直接返回 */
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 更新第一列的状态 */
|
|
|
+ for(const QModelIndex& index : selectedRows)
|
|
|
+ {
|
|
|
+ // bool currentState = m_model->data(m_model->index(index.row(), 0), Qt::CheckStateRole).toBool();
|
|
|
+ m_model->setData(m_model->index(index.row(), 0), Qt::Checked, Qt::CheckStateRole);
|
|
|
+ }
|
|
|
+ /* 如果有取消选择的行,更新第一列状态 */
|
|
|
+ for(const QModelIndex& index : deselectedRows)
|
|
|
+ {
|
|
|
+ // bool currentState = m_model->data(m_model->index(index.row(), 0), Qt::CheckStateRole).toBool();
|
|
|
+ m_model->setData(m_model->index(index.row(), 0), Qt::Unchecked, Qt::CheckStateRole);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 更新标题栏选中的状态,下面获取的才是真正的选中的行 */
|
|
|
+ int selectedCount = ui->tableView->selectionModel()->selectedRows().size();
|
|
|
+ Qt::CheckState headerState = Qt::Unchecked;
|
|
|
+ if(selectedCount == m_model->rowCount())
|
|
|
+ {
|
|
|
+ headerState = Qt::CheckState::Checked;
|
|
|
+ }else if(selectedCount == 0)
|
|
|
+ {
|
|
|
+ headerState = Qt::CheckState::Unchecked;
|
|
|
+ }else {
|
|
|
+ headerState = Qt::CheckState::PartiallyChecked;
|
|
|
+ }
|
|
|
+
|
|
|
+ // SPDLOG_LOGGER_INFO(m_logger, "选中行数: {}, 总行数: {}, 标题状态: {}", selectedCount, m_model->rowCount(), static_cast<int>(headerState));
|
|
|
+ /* 如果选中的行数等于总行数,说明全部选中 */
|
|
|
+ auto header = qobject_cast<BaseHeader*>(ui->tableView->horizontalHeader());
|
|
|
+ if(header)
|
|
|
+ {
|
|
|
+ header->SetChecked(headerState);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/* 点击了标题栏选择框 */
|
|
|
+void CompareItemListDialog::do_headerSelect_clicked(bool state)
|
|
|
+{
|
|
|
+ auto header = qobject_cast<BaseHeader*>(ui->tableView->horizontalHeader());
|
|
|
+ if(header == nullptr)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(state)
|
|
|
+ {
|
|
|
+ for(int i = 0; i < m_model->rowCount(); ++i)
|
|
|
+ {
|
|
|
+ /* 设置第一列为选中状态 */
|
|
|
+ m_model->setData(m_model->index(i, 0), Qt::Checked, Qt::CheckStateRole);
|
|
|
+ ui->tableView->selectionModel()->select(m_model->index(i, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
|
|
+ }
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ for(int i = 0; i < m_model->rowCount(); ++i)
|
|
|
+ {
|
|
|
+ /* 设置第一列为未选中状态 */
|
|
|
+ m_model->setData(m_model->index(i, 0), Qt::Unchecked, Qt::CheckStateRole);
|
|
|
+ ui->tableView->selectionModel()->select(m_model->index(i, 0), QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/* 初始化表格 */
|
|
|
void CompareItemListDialog::initTable()
|
|
|
{
|
|
@@ -351,20 +472,27 @@ void CompareItemListDialog::initTable()
|
|
|
// m_sortModel->setSortRole(QtUserRole::UserRole_Time); /* 设置排序角色 */
|
|
|
ui->tableView->setModel(m_model);
|
|
|
|
|
|
- // 设置选择模式为整行选择
|
|
|
+ /* 设置标题头部代理 */
|
|
|
auto oneHeader = new BaseHeader(ui->tableView);
|
|
|
oneHeader->SetCheckable(true);
|
|
|
ui->tableView->setHorizontalHeader(oneHeader);
|
|
|
- ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
+
|
|
|
+ /* 设置选择属性 */
|
|
|
+ ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); /* 可多选 */
|
|
|
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
|
|
+ /* 设置第一列代理 */
|
|
|
+ auto checkBoxDelegate = new DelegateCheckBox(ui->tableView);
|
|
|
+ /* 设置多种选择状态 */
|
|
|
+ ui->tableView->setItemDelegateForColumn(0, checkBoxDelegate);
|
|
|
+
|
|
|
/*--------------------------- 设置横向标题 -------------------------------*/
|
|
|
/* 设置横向标题可见 */
|
|
|
ui->tableView->horizontalHeader()->setVisible(true);
|
|
|
/* 设置标题左对齐 */
|
|
|
ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
|
|
- /* 设置横向标题不可点击 */
|
|
|
- ui->tableView->horizontalHeader()->setSectionsClickable(false);
|
|
|
+ /* 设置横向标题可点击 */
|
|
|
+ ui->tableView->horizontalHeader()->setSectionsClickable(true);
|
|
|
|
|
|
/*--------------------------- 设置列 -------------------------------*/
|
|
|
/* 设置每列的高度 */
|
|
@@ -390,6 +518,13 @@ void CompareItemListDialog::initTable()
|
|
|
ui->tableView->setColumnWidth(3, 280); /* 第四列宽度 */
|
|
|
ui->tableView->setColumnWidth(4, 96); /* 第五列宽度 */
|
|
|
|
|
|
+ /* 连接点击信号 */
|
|
|
+ // connect(ui->tableView, &QTableView::doubleClicked, this, &CompareItemListDialog::do_tableView_doubleClicked);
|
|
|
+ connect(ui->tableView, &QTableView::clicked, this, &CompareItemListDialog::do_tableView_clicked);
|
|
|
+ connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
|
+ this, &CompareItemListDialog::do_selectChanged);
|
|
|
+ connect(oneHeader, &BaseHeader::sig_Checked, this, &CompareItemListDialog::do_headerSelect_clicked);
|
|
|
+
|
|
|
/* 测试用,加入两列数据 */
|
|
|
// for(int i = 0; i < 10; ++i)
|
|
|
// {
|
|
@@ -429,7 +564,6 @@ void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
|
|
|
/* 这个字体设置为蓝色 */
|
|
|
item4->setForeground(QBrush("#438EFF"));
|
|
|
items.append(item4);
|
|
|
-
|
|
|
|
|
|
m_model->appendRow(items);
|
|
|
}
|