diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d3245e..42a88db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ set(H_HEADER_FILES include/messageBox.h include/settings.h include/tableWidgetHoverDelegate.h + include/textColorPreserveDelegate.h include/customMenu.h include/multiLineHeaderView.h include/modelInfoEditDialog.h @@ -41,6 +42,7 @@ set(H_HEADER_FILES include/attributeSelector.h include/maskManager.h include/customBorderContainer.h + include/groupSelectionDialog.h ) set(CPP_SOURCE_FILES @@ -58,6 +60,7 @@ set(CPP_SOURCE_FILES source/messageBox.cpp source/settings.cpp source/tableWidgetHoverDelegate.cpp + source/textColorPreserveDelegate.cpp source/customMenu.cpp source/multiLineHeaderView.cpp source/modelInfoEditDialog.cpp @@ -68,6 +71,7 @@ set(CPP_SOURCE_FILES source/attributeSelector.cpp source/maskManager.cpp source/customBorderContainer.cpp + source/groupSelectionDialog.cpp ) set(UI_FILES @@ -78,6 +82,7 @@ set(UI_FILES ui/modelInfoEditDialog.ui ui/textEditWidget.ui ui/attributeSelector.ui + ui/groupSelectionDialog.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/include/connectionDialog.h b/include/connectionDialog.h index 1b4eadf..c20f65a 100644 --- a/include/connectionDialog.h +++ b/include/connectionDialog.h @@ -4,7 +4,6 @@ #include "global.h" #include -class MainWindow; QT_BEGIN_NAMESPACE namespace Ui { @@ -12,7 +11,9 @@ class ConnectionDialog; } QT_END_NAMESPACE +class MainWindow; class CustomBorderContainer; + class ConnectionDialog : public QDialog { Q_OBJECT diff --git a/include/dbStructureModel.h b/include/dbStructureModel.h index 667e7bf..715b2b9 100644 --- a/include/dbStructureModel.h +++ b/include/dbStructureModel.h @@ -31,6 +31,7 @@ public: QModelIndex getConnNodeIndex(const QString& name); void addDataModel(const QString& connection, Model& model); void removeDataModel(DBStructureNode*); + void addDataGroup(const QString& connection, int modelID, QVector groups); void removeDataGroup(DBStructureNode*); signals: @@ -42,6 +43,7 @@ public slots: private: DBStructureNode* getNode(const QModelIndex& index) const; DBStructureNode* getConnectionNode(const QString& name) const; + DBStructureNode* getModelNode(DBStructureNode* connNode, int modelID) const; MainWindow* m_pMainWindow; DBStructureNode* m_rootNode; diff --git a/include/dbStructureView.h b/include/dbStructureView.h index f29726d..7cda25f 100644 --- a/include/dbStructureView.h +++ b/include/dbStructureView.h @@ -16,10 +16,9 @@ public: ~DBStructureView(); void setMainWindow(MainWindow*); - + DBStructureNode* currentNode(); void disconnectCurConnection(); const QString curConnection(); - void onActionTrigger_removeModel(); protected: @@ -40,6 +39,7 @@ private: signals: void actionTrigger_addModel(); + void actionTrigger_addGroup(int); void openAttributeInfo(const QString&, ModelAttributeGroup&); void closeAttributeInfo(ModelAttributeGroup&); diff --git a/include/groupSelectionDialog.h b/include/groupSelectionDialog.h new file mode 100644 index 0000000..7ef60bb --- /dev/null +++ b/include/groupSelectionDialog.h @@ -0,0 +1,46 @@ +#ifndef GROUPSELECTIONDIALOG_H +#define GROUPSELECTIONDIALOG_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class GroupSelectionDialog; +} +QT_END_NAMESPACE + +class MainWindow; +class QListWidgetItem; +class CustomBorderContainer; + +class GroupSelectionDialog : public QDialog +{ + Q_OBJECT + +public: + explicit GroupSelectionDialog(QWidget *parent = nullptr); + ~GroupSelectionDialog(); + + void setMainWindow(MainWindow*); + void setModel(int); + +private: + void initialize(); + + Ui::GroupSelectionDialog* ui; + MainWindow* m_pMainWindow; + int m_curModelID; + + CustomBorderContainer* m_customBorderContainer; + +signals: + void addGroups(int, QVector); + +public slots: + void onBtnClicked_save(); + void onBtnClicked_cancle(); + void onBtnClicked_removeSelected(); + void onItemDblCliked_sourceList(QListWidgetItem*); +}; + +#endif //GROUPSELECTIONDIALOG_H diff --git a/include/mainwindow.h b/include/mainwindow.h index 2a9af08..cf8ad9a 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -12,6 +12,7 @@ class ConnectionDialog; class DBStructureView; class DBStructureModel; class ModelInfoEditDialog; +class GroupSelectionDialog; QT_BEGIN_NAMESPACE namespace Ui { @@ -47,18 +48,21 @@ private: DBStructureView* m_pDBStrutureView; DBStructureModel* m_pDBStrutureModel; ModelInfoEditDialog* m_pModelInfoDialog; + GroupSelectionDialog* m_pGroupSelectionDialog; private slots: void onActionTrigger_connect(); void onActionTrigger_disconnect(); void onActionTrigger_addModel(); void onActionTrigger_removeModel(); + void onActionTrigger_addGroup(int); void onSIG_addConnection(DatabaseConfig&); void onSIG_errorFromDBManger(const QString& strConnectionName, const QString& error); void onSIG_errorFormSQLExecutor(const QString& error); void onSIG_connectionStatusChanged(const QString& strConnectionName, bool bConnected); void onSIG_addModel(Model&); + void onSIG_addGroups(int, QVector); void onSIG_openAttributeInfo(const QString&, ModelAttributeGroup&); void onSIG_closeAttributeInfo(ModelAttributeGroup&); }; diff --git a/include/modelInfoEditDialog.h b/include/modelInfoEditDialog.h index bc42ae8..b1e2133 100644 --- a/include/modelInfoEditDialog.h +++ b/include/modelInfoEditDialog.h @@ -4,15 +4,16 @@ #include #include "global.h" -class MainWindow; -class QListWidgetItem; - QT_BEGIN_NAMESPACE namespace Ui { class ModelInfoEditDialog; } QT_END_NAMESPACE +class MainWindow; +class QListWidgetItem; +class CustomBorderContainer; + class ModelInfoEditDialog : public QDialog { Q_OBJECT @@ -23,7 +24,7 @@ public: void setState(DialogState state) {m_state = state;} void setMainWindow(MainWindow*); - void setModel(int id) {m_curModelID = id;} + void setModel(int); protected: virtual void showEvent(QShowEvent*); @@ -39,6 +40,8 @@ private: MainWindow* m_pMainWindow; int m_curModelID; + CustomBorderContainer* m_customBorderContainer; + signals: void addModel(Model&); diff --git a/include/sqlQueryExecutor.h b/include/sqlQueryExecutor.h index dd6c954..2c50ccb 100644 --- a/include/sqlQueryExecutor.h +++ b/include/sqlQueryExecutor.h @@ -34,6 +34,8 @@ public: bool modelNameExistsInDB(const QString&, const QString&); bool modelTypeExistsInDB(const QString&, const QString&); bool removeModel(const QString&, int); + bool addModleGrpus(const QString&, int, QVector); + QVector getModelGroups(const QString&, int); //属性相关 int getAttributeCount(const QString&, int, int); int getAllAttributeCount(const QString&); @@ -52,9 +54,7 @@ private: ~SqlQueryExecutor(); // 禁止拷贝 SqlQueryExecutor(const SqlQueryExecutor&) = delete; //delete关键字表示该函数不可用,包括编译器自动生成的函数 - SqlQueryExecutor& operator=(const SqlQueryExecutor&) = delete; - //基于具体业务的查询接口-内部调用 - QVector getModelGroups(const QString&, int); + SqlQueryExecutor& operator=(const SqlQueryExecutor&) = delete; }; #endif //SQLQUERYEXECUTOR_H diff --git a/include/textColorPreserveDelegate.h b/include/textColorPreserveDelegate.h new file mode 100644 index 0000000..3387eea --- /dev/null +++ b/include/textColorPreserveDelegate.h @@ -0,0 +1,24 @@ +/** + *\brief 用来实现item选中时保持前景色(文字颜色)不变 + * + *\author dsc + */ + +#ifndef TEXTCOLORPRESERVEDELEGATE_H +#define TEXTCOLORPRESERVEDELEGATE_H + +#include + +class TextColorPreserveDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + explicit TextColorPreserveDelegate(QObject* parent = nullptr); + ~TextColorPreserveDelegate(); + +protected: + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; +}; + +#endif // TEXTCOLORPRESERVEDELEGATE_H diff --git a/source/dbStructureModel.cpp b/source/dbStructureModel.cpp index a3c9d0a..40d9c9c 100644 --- a/source/dbStructureModel.cpp +++ b/source/dbStructureModel.cpp @@ -42,6 +42,20 @@ DBStructureNode* DBStructureModel::getConnectionNode(const QString& name) const return nullptr; } +DBStructureNode* DBStructureModel::getModelNode(DBStructureNode* connNode, int modelID) const +{ + if(!connNode) + return nullptr; + + for(int i = 0; i < connNode->childCount(); ++i) + { + DBStructureNode* node = connNode->child(i); + if(node->type() == TableNode && node->data(Qt::UserRole + NodeDataRole::ID).toInt() == modelID) + return node; + } + return nullptr; +} + QModelIndex DBStructureModel::index(int row, int column, const QModelIndex& parent) const { if(!hasIndex(row, column, parent)) @@ -212,6 +226,41 @@ void DBStructureModel::removeDataModel(DBStructureNode* modelNode) } } +void DBStructureModel::addDataGroup(const QString& connection, int modelID, QVector groups) +{ + DBStructureNode* connNode = getConnectionNode(connection); + if(!connNode) + { + LOG_ERROR("DBStructureModel", QString::fromWCharArray(L"添加数组时获取ConnectionNode失败,节点名称:%1").arg(connection)); + return; + } + + DBStructureNode* modelNode = getModelNode(connNode, modelID); + if(!connNode) + { + LOG_ERROR("DBStructureModel", QString::fromWCharArray(L"添加数组时获取ModelNode失败,节点ID:%1").arg(modelID)); + return; + } + + QModelIndex connIndex = index(connNode->row(), 0, QModelIndex()); + QModelIndex modelIndex = index(modelNode->row(), 0, connIndex); + beginInsertRows(modelIndex, modelNode->childCount(), groups.count()); + + for(int groupID : groups) + { + //QString groupName = SqlQueryExecutor::instance().getAttributeGroupName(connection, groupID); + AttributeGroup group = SqlQueryExecutor::instance().getAttributeGroupData(connection, groupID); + if(group.name.isEmpty()) + continue; + DBStructureNode* groupNode = new DBStructureNode(GroupNode, group.name, modelNode); + groupNode->setData(Qt::UserRole + NodeDataRole::ID, groupID); + groupNode->setData(Qt::UserRole + NodeDataRole::Type, group.isPublic); + modelNode->appendChild(groupNode); + } + + endInsertRows(); +} + void DBStructureModel::removeDataGroup(DBStructureNode* groupNode) { int groupID = groupNode->data(Qt::UserRole + NodeDataRole::ID).toInt(); diff --git a/source/dbStructureView.cpp b/source/dbStructureView.cpp index 596c8ec..12bd081 100644 --- a/source/dbStructureView.cpp +++ b/source/dbStructureView.cpp @@ -164,10 +164,16 @@ const QString DBStructureView::curConnection() return m_curConnection; } -void DBStructureView::onActionTrigger_removeModel() +DBStructureNode* DBStructureView::currentNode() { QModelIndex currentInex = currentIndex(); DBStructureNode* node = static_cast(currentInex.internalPointer()); + return node; +} + +void DBStructureView::onActionTrigger_removeModel() +{ + DBStructureNode* node = currentNode(); if(!node || (node->type() != TableNode && node->type() != GroupNode)) { if(m_pMainWindow) @@ -280,8 +286,11 @@ void DBStructureView::showContextMenu(const QPoint& pos) } removeNode(node); }); - menu.addSeparator(); menu.addAction(QString::fromWCharArray(L"刷新"), []{}); + menu.addSeparator(); + menu.addAction(QString::fromWCharArray(L"添加属性组"), [this, node]{ + emit actionTrigger_addGroup(node->data(Qt::UserRole + NodeDataRole::ID).toInt()); + }); //menu.addAction(QString::fromWCharArray(L"打开"), []{}); /*menu.addSeparator(); menu.addAction(QString::fromWCharArray(L"清空数据"), []{}); diff --git a/source/groupSelectionDialog.cpp b/source/groupSelectionDialog.cpp new file mode 100644 index 0000000..426c1b5 --- /dev/null +++ b/source/groupSelectionDialog.cpp @@ -0,0 +1,156 @@ +#include "groupSelectionDialog.h" +#include "./ui_groupSelectionDialog.h" +#include "mainwindow.h" +#include "sqlQueryExecutor.h" +#include "textColorPreserveDelegate.h" +#include "customBorderContainer.h" + +#define itemRole_groupID 1 +#define itemRole_isPublic 2 +#define itemRole_isNewlyAdded 3 + +GroupSelectionDialog::GroupSelectionDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::GroupSelectionDialog) + , m_pMainWindow(nullptr) + , m_curModelID(-1) +{ + ui->setupUi(this); + if(QSysInfo::kernelType() == "linux") + { + //Linux下默认的Qt::Dialog即使有父窗口也无法按照子窗口的行为进行展示,并且最大、最小按钮不好关闭,因此需要去掉Dialog属性,随之而来的问题是,模态无法起作用 + setWindowFlags(windowFlags() & ~Qt::Dialog); + setStyleSheet("QDialog{border: 1px solid rgb(205,205,205);border-radius:5px;background-color:rgb(250,250,250);}"); + + m_customBorderContainer = new CustomBorderContainer(this); + m_customBorderContainer->setOperationOptions(CustomBorderContainer::Movable | CustomBorderContainer::Resizable); + } + + initialize(); +} + +GroupSelectionDialog::~GroupSelectionDialog() +{ + delete ui; +} + +void GroupSelectionDialog::initialize() +{ + TextColorPreserveDelegate* delegate = new TextColorPreserveDelegate(this); + ui->sourceList->setItemDelegate(delegate); + ui->selectedList->setItemDelegate(delegate); + + connect(ui->btnSave, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_save); + connect(ui->btnCancle, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_cancle); + connect(ui->btnRemoveSelected, &QPushButton::clicked, this, &GroupSelectionDialog::onBtnClicked_removeSelected); + connect(ui->sourceList, &QListWidget::itemDoubleClicked, this, &GroupSelectionDialog::onItemDblCliked_sourceList); +} + +void GroupSelectionDialog::setMainWindow(MainWindow* window) +{ + m_pMainWindow = window; + + ui->sourceList->clear(); + ui->selectedList->clear(); + if(m_pMainWindow) + { + QString connection = m_pMainWindow->getCurConnection(); + const QVector groups = SqlQueryExecutor::instance().getAttributeGroup(connection); + for(const AttributeGroup& group : groups) + { + QListWidgetItem* sourceItem = new QListWidgetItem(group.name); + sourceItem->setFlags(sourceItem->flags() & ~Qt::ItemIsEditable); + sourceItem->setData(Qt::UserRole + itemRole_groupID, group.id); + sourceItem->setData(Qt::UserRole + itemRole_isPublic, group.isPublic); + ui->sourceList->addItem(sourceItem); + } + } +} + +void GroupSelectionDialog::setModel(int id) +{ + ui->selectedList->clear(); + if(!m_pMainWindow || id <= 0) + return; + + m_curModelID = id; + QString connection = m_pMainWindow->getCurConnection(); + QVector groups = SqlQueryExecutor::instance().getModelGroups(connection, id); + for(int groupID : groups) + { + AttributeGroup group = SqlQueryExecutor::instance().getAttributeGroupData(connection, groupID); + if(group.name.isEmpty()) + continue; + + QListWidgetItem* item = new QListWidgetItem(group.name); + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + item->setData(Qt::UserRole + itemRole_groupID, group.id); + item->setData(Qt::UserRole + itemRole_isPublic, group.isPublic); + item->setData(Qt::UserRole + itemRole_isNewlyAdded, false); + item->setForeground(QBrush(QColor(128,128,128))); + ui->selectedList->addItem(item); + } +} + +void GroupSelectionDialog::onBtnClicked_save() +{ + if(!m_pMainWindow) + { + close(); + return; + } + + QVector groups; + for(int i = 0; i < ui->selectedList->count(); i++) + { + QListWidgetItem* item = ui->selectedList->item(i); + bool isNewlyAdded = item->data(Qt::UserRole + itemRole_isNewlyAdded).toBool(); + if(isNewlyAdded) + groups.append(item->data(Qt::UserRole + itemRole_groupID).toInt()); + } + + QString connection = m_pMainWindow->getCurConnection(); + bool result = SqlQueryExecutor::instance().addModleGrpus(connection, m_curModelID, groups); + if(!result) + { + m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),QString::fromWCharArray(L"信息存储失败,详情可见日志文件")); + return; + } + + emit addGroups(m_curModelID, groups); + close(); +} + +void GroupSelectionDialog::onBtnClicked_cancle() +{ + close(); +} + +void GroupSelectionDialog::onBtnClicked_removeSelected() +{ + QListWidgetItem* item = ui->selectedList->currentItem(); + if(item && !item->data(Qt::UserRole + itemRole_isNewlyAdded).toBool()) + { + m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),QString::fromWCharArray(L"该组别不是最新添加,不可移除")); + return; + } + + int row = ui->selectedList->currentRow(); + item = ui->selectedList->takeItem(row); + if(item) + delete item; +} + +void GroupSelectionDialog::onItemDblCliked_sourceList(QListWidgetItem* item) +{ + if(item->data(Qt::UserRole + itemRole_isPublic).toBool()) + return; + + QList foundItems = ui->selectedList->findItems(item->text(), Qt::MatchFixedString); + if(foundItems.isEmpty()) + { + QListWidgetItem* selectedItem = new QListWidgetItem(*item); + selectedItem->setData(Qt::UserRole + itemRole_isNewlyAdded, true); + ui->selectedList->addItem(selectedItem); + } +} diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 503e9f7..1a28f91 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -9,6 +9,7 @@ #include "logger.h" #include "sqlQueryExecutor.h" #include "modelInfoEditDialog.h" +#include "groupSelectionDialog.h" #include #include @@ -21,6 +22,7 @@ MainWindow::MainWindow(QWidget *parent) , m_pMessageDialog(nullptr) , m_pConnectionDialog(nullptr) , m_pModelInfoDialog(nullptr) + , m_pGroupSelectionDialog(nullptr) { ui->setupUi(this); @@ -78,6 +80,7 @@ void MainWindow::initialize() m_pDBStrutureView = new DBStructureView(m_dbManager, this); m_pDBStrutureView->setMainWindow(this); connect(m_pDBStrutureView, &DBStructureView::actionTrigger_addModel, this, &MainWindow::onActionTrigger_addModel); + connect(m_pDBStrutureView, &DBStructureView::actionTrigger_addGroup, this, &MainWindow::onActionTrigger_addGroup); connect(m_pDBStrutureView, &DBStructureView::openAttributeInfo, this, &MainWindow::onSIG_openAttributeInfo); connect(m_pDBStrutureView, &DBStructureView::closeAttributeInfo, this, &MainWindow::onSIG_closeAttributeInfo); ui->layoutDBStructure->addWidget(m_pDBStrutureView); @@ -181,6 +184,7 @@ void MainWindow::onActionTrigger_addModel() m_pModelInfoDialog->setMainWindow(this); m_pModelInfoDialog->installEventFilter(this); connect(m_pModelInfoDialog, &ModelInfoEditDialog::addModel, this, &MainWindow::onSIG_addModel); + connect(m_pModelInfoDialog, &ModelInfoEditDialog::finished, this, [=]{ MaskManager::instance()->hideMask(m_pModelInfoDialog);}); } int nX = this->geometry().x() + (this->width() - m_pModelInfoDialog->width()) * 0.5; @@ -189,8 +193,8 @@ void MainWindow::onActionTrigger_addModel() m_pModelInfoDialog->setState(DS_New); MaskManager::instance()->showMask(m_pModelInfoDialog); - m_pModelInfoDialog->exec(); - MaskManager::instance()->hideMask(m_pModelInfoDialog); + m_pModelInfoDialog->show(); + //MaskManager::instance()->hideMask(m_pModelInfoDialog); } void MainWindow::onActionTrigger_removeModel() { @@ -211,6 +215,29 @@ void MainWindow::onSIG_addConnection(DatabaseConfig& config) m_pDBStrutureModel->addConnection(config.strConnectionName, config.strDBType); } +void MainWindow::onActionTrigger_addGroup(int modelID) +{ + if(m_pGroupSelectionDialog && m_pGroupSelectionDialog->isVisible()) + return; + + if(m_pGroupSelectionDialog == nullptr) + { + m_pGroupSelectionDialog = new GroupSelectionDialog(this); + m_pGroupSelectionDialog->setMainWindow(this); + m_pGroupSelectionDialog->installEventFilter(this); + connect(m_pGroupSelectionDialog, &GroupSelectionDialog::addGroups, this, &MainWindow::onSIG_addGroups); + connect(m_pGroupSelectionDialog, &GroupSelectionDialog::finished, this, [=]{ MaskManager::instance()->hideMask(m_pGroupSelectionDialog);}); + } + + int nX = this->geometry().x() + (this->width() - m_pGroupSelectionDialog->width()) * 0.5; + int nY = this->geometry().y() + (this->height() - m_pGroupSelectionDialog->height()) * 0.5; + m_pGroupSelectionDialog->move(nX, nY); + m_pGroupSelectionDialog->setModel(modelID); + + MaskManager::instance()->showMask(m_pGroupSelectionDialog); + m_pGroupSelectionDialog->show(); +} + void MainWindow::onSIG_errorFromDBManger(const QString& strConnectionName, const QString& error) { //m_lastSqlError = error; @@ -238,6 +265,12 @@ void MainWindow::onSIG_addModel(Model& model) m_pDBStrutureModel->addDataModel(connection, model); } +void MainWindow::onSIG_addGroups(int modelID, QVector groups) +{ + QString connection = m_pDBStrutureView->curConnection(); + m_pDBStrutureModel->addDataGroup(connection, modelID, groups); +} + void MainWindow::onSIG_openAttributeInfo(const QString& connection, ModelAttributeGroup& attributeGroup) { if(m_dbBrowser) diff --git a/source/modelInfoEditDialog.cpp b/source/modelInfoEditDialog.cpp index e18153e..2e35d4e 100644 --- a/source/modelInfoEditDialog.cpp +++ b/source/modelInfoEditDialog.cpp @@ -2,6 +2,8 @@ #include "./ui_modelInfoEditDialog.h" #include "mainwindow.h" #include "sqlQueryExecutor.h" +#include "textColorPreserveDelegate.h" +#include "customBorderContainer.h" #include #include #include @@ -13,6 +15,7 @@ ModelInfoEditDialog::ModelInfoEditDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::ModelInfoEditDialog) , m_pMainWindow(nullptr) + , m_curModelID(-1) { ui->setupUi(this); if(QSysInfo::kernelType() == "linux") @@ -20,6 +23,9 @@ ModelInfoEditDialog::ModelInfoEditDialog(QWidget *parent) //Linux下默认的Qt::Dialog即使有父窗口也无法按照子窗口的行为进行展示,并且最大、最小按钮不好关闭,因此需要去掉Dialog属性,随之而来的问题是,模态无法起作用 setWindowFlags(windowFlags() & ~Qt::Dialog); setStyleSheet("QDialog{border: 1px solid rgb(205,205,205);border-radius:5px;background-color:rgb(250,250,250);}"); + + m_customBorderContainer = new CustomBorderContainer(this); + m_customBorderContainer->setOperationOptions(CustomBorderContainer::Movable | CustomBorderContainer::Resizable); } initialize(); } @@ -52,6 +58,10 @@ void ModelInfoEditDialog::initialize() QRegularExpressionValidator* validator = new QRegularExpressionValidator(regExp, this); ui->lineEdit_modelType->setValidator(validator); + TextColorPreserveDelegate* delegate = new TextColorPreserveDelegate(this); + ui->sourceList->setItemDelegate(delegate); + ui->selectedList->setItemDelegate(delegate); + connect(ui->btnSave, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_save); connect(ui->btnCancle, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_cancle); connect(ui->btnAddGroup, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_addGroup); @@ -76,10 +86,8 @@ void ModelInfoEditDialog::refreshGroupList() { ui->sourceList->clear(); ui->selectedList->clear(); - if(!m_pMainWindow) - return; + QString connection = m_pMainWindow->getCurConnection(); - //考虑写一个专门用来返回相关数据的类,可以减少多处调用同样SQL语句的状况,也可以避免SQL语句变更时需要更改同步多处 const QVector groups = SqlQueryExecutor::instance().getAttributeGroup(connection); for(const AttributeGroup& group : groups) { @@ -112,6 +120,11 @@ void ModelInfoEditDialog::setMainWindow(MainWindow* window) m_pMainWindow = window; } +void ModelInfoEditDialog::setModel(int id) +{ + m_curModelID = id; +} + void ModelInfoEditDialog::onItemDblCliked_sourceList(QListWidgetItem* item) { if(item->data(Qt::UserRole + itemRole_isPublic).toBool()) @@ -169,7 +182,8 @@ void ModelInfoEditDialog::onBtnClicked_save() return; } } - //插入数据 + + //向数据库中插入数据(因为提供了连续添加的功能,所以向数据库中插入数据放在这里执行) Model modle(-1, modelName, modeType, remark, groups); bool result = SqlQueryExecutor::instance().addModel(connection, modle); diff --git a/source/sqlQueryExecutor.cpp b/source/sqlQueryExecutor.cpp index 3b223dc..593f766 100644 --- a/source/sqlQueryExecutor.cpp +++ b/source/sqlQueryExecutor.cpp @@ -274,7 +274,7 @@ bool SqlQueryExecutor::addModel(const QString& connectionName, Model& model) } //然后向model_group中插入记录,采用批量接口 - QStringList sqlStatements; + /*QStringList sqlStatements; QList paramsList; for(int groupID : model.groups) { @@ -290,6 +290,35 @@ bool SqlQueryExecutor::addModel(const QString& connectionName, Model& model) executeBatchSQL(connectionName, sqlStatements, paramsList); } catch (const DatabaseException& e) + { + LOG_INFO("DB", QString("DB Rollback")); + if(!db.rollback()) // 回滚失败时记录警告 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + }*/ + + QSqlQuery query(db); + strSQL = "INSERT INTO basic.model_group (model_type_id, attribute_group_id) VALUES (?, ?)"; + if(!query.prepare(strSQL)) + { + LOG_ERROR("SQL", QString("SQL '%1' prepare fialed. error: %2").arg(strSQL, query.lastError().databaseText())); + if(!db.rollback()) // 回滚 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + } + QVariantList modelIds, groupIds; + for(int groupID : model.groups) + { + modelIds << modelID; + groupIds << groupID; + } + query.addBindValue(modelIds); + query.addBindValue(groupIds); + if( !query.execBatch() ) { LOG_INFO("DB", QString("DB Rollback")); if(!db.rollback()) // 回滚失败时记录警告 @@ -359,6 +388,61 @@ bool SqlQueryExecutor::removeModel(const QString& connectionName, int modelID) return true; } +bool SqlQueryExecutor::addModleGrpus(const QString& connectionName, int modelID, QVector groups) +{ + //属于批量操作,需要开启事务 + QSqlDatabase db = QSqlDatabase::database(connectionName); + if(!db.isOpen()) + { + LOG_ERROR("DB", QString("Database not open. connectionName: %1").arg(connectionName)); + return false; + } + + if(!db.transaction()) + { + LOG_ERROR("DB", QString("Start transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + return false; + } + + QSqlQuery query(db); + QString strSQL = "INSERT INTO basic.model_group (model_type_id, attribute_group_id) VALUES (?, ?)"; + if(!query.prepare(strSQL)) + { + LOG_ERROR("SQL", QString("SQL '%1' prepare fialed. error: %2").arg(strSQL, query.lastError().databaseText())); + if(!db.rollback()) // 回滚 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + } + QVariantList modelIds, groupIds; + for(int groupID : groups) + { + modelIds << modelID; + groupIds << groupID; + } + query.addBindValue(modelIds); + query.addBindValue(groupIds); + if( !query.execBatch() ) + { + LOG_ERROR("SQL", QString("SQL '%1' execBatch error: %2").arg(strSQL, query.lastError().databaseText())); + LOG_INFO("DB", QString("DB Rollback")); + if(!db.rollback()) // 回滚 + { + LOG_ERROR("DB", QString("Rollback failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + } + return false; + } + + if(!db.commit()) // 提交 + { + LOG_ERROR("DB", QString("Commit transaction failed. connectionName: %1. error: %2").arg(connectionName, db.lastError().databaseText())); + return false; + } + + return true; +} + const QVector SqlQueryExecutor::getAttributeGroup(const QString& connectionName) { QVector groupList; diff --git a/source/textColorPreserveDelegate.cpp b/source/textColorPreserveDelegate.cpp new file mode 100644 index 0000000..e75a811 --- /dev/null +++ b/source/textColorPreserveDelegate.cpp @@ -0,0 +1,21 @@ +#include "textColorPreserveDelegate.h" + +TextColorPreserveDelegate::TextColorPreserveDelegate(QObject *parent) + : QStyledItemDelegate{parent} +{} + +TextColorPreserveDelegate::~TextColorPreserveDelegate() +{} + +void TextColorPreserveDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + QColor textColor = index.data(Qt::ForegroundRole).value(); + + QStyleOptionViewItem opt = option; + initStyleOption(&opt, index); + + opt.palette.setColor(QPalette::Text, textColor); + opt.palette.setColor(QPalette::HighlightedText, textColor); // 关键:覆盖高亮文本色 + + QStyledItemDelegate::paint(painter, opt, index); +} diff --git a/ui/groupSelectionDialog.ui b/ui/groupSelectionDialog.ui new file mode 100644 index 0000000..1ad04fb --- /dev/null +++ b/ui/groupSelectionDialog.ui @@ -0,0 +1,252 @@ + + + GroupSelectionDialog + + + + 0 + 0 + 372 + 305 + + + + 属性组编辑 + + + + :/img/images/icon_hierarchy.png:/img/images/icon_hierarchy.png + + + QListView +{ +outline:0px; +border-left:1px solid rgb(235,235,235); +border-right:1px solid rgb(235,235,235); +border-top:1px solid rgb(0,0,0); +border-bottom:1px solid rgb(0,0,0); +} +QListView::item +{ +border:0px; +padding-left:5px; +padding-top:1px; +padding-bottom:1px; +} +QListView::item:hover +{ +background-color: rgb(240, 248, 255); +} +QListView::item:selected +{ +background-color:rgb(211, 241, 250); +} + + + + + + 12 + + + + + 3 + + + + + 1 + + + 0 + + + + + + 61 + 21 + + + + + 61 + 21 + + + + 所有组别 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 3 + + + + + 1 + + + 0 + + + + + + 61 + 21 + + + + + 61 + 21 + + + + 所选组别 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 21 + 21 + + + + + 21 + 21 + + + + QPushButton +{ + border:0px; + image: url(:/img/images/icon_remove2.png); +} +QPushButton:hover +{ + image: url(:/img/images/icon_remove2_hover.png); +} +QPushButton:pressed +{ + image: url(:/img/images/icon_remove2.png); +} + + + + + + + + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 86 + 31 + + + + + 86 + 31 + + + + 完成 + + + + + + + + 86 + 31 + + + + + 86 + 31 + + + + 取消 + + + + + + + + + + + + diff --git a/ui/modelInfoEditDialog.ui b/ui/modelInfoEditDialog.ui index 8c90178..4b4fe76 100644 --- a/ui/modelInfoEditDialog.ui +++ b/ui/modelInfoEditDialog.ui @@ -39,7 +39,6 @@ background-color: rgb(240, 248, 255); } QListView::item:selected { -color:rgb(0,0,0); background-color:rgb(211, 241, 250); } @@ -261,7 +260,7 @@ background-color:rgb(211, 241, 250); - 所有类别 + 所有组别 @@ -347,7 +346,7 @@ QPushButton:pressed - 所选类别 + 所选组别