完成模型删除功能,支持窗口主菜单和模型节点右键菜单触发

This commit is contained in:
duanshengchao 2025-03-17 17:20:10 +08:00
parent 0aca9bd518
commit a39f8f2faf
8 changed files with 126 additions and 8 deletions

View File

@ -6,6 +6,7 @@
#include "dbStructureNode.h" #include "dbStructureNode.h"
#include "global.h" #include "global.h"
class MainWindow;
class DBStructureModel : public QAbstractItemModel class DBStructureModel : public QAbstractItemModel
{ {
Q_OBJECT Q_OBJECT
@ -14,6 +15,8 @@ public:
explicit DBStructureModel(QObject* parent = nullptr); explicit DBStructureModel(QObject* parent = nullptr);
~DBStructureModel(); ~DBStructureModel();
void setMainWindow(MainWindow*);
//QAbstractItemModel接口实现 //QAbstractItemModel接口实现
QModelIndex index(int row, int column, const QModelIndex& parent) const override; QModelIndex index(int row, int column, const QModelIndex& parent) const override;
QModelIndex parent(const QModelIndex& index) const override; QModelIndex parent(const QModelIndex& index) const override;
@ -26,6 +29,7 @@ public:
void addConnection(const QString& name, const QString& dbType); void addConnection(const QString& name, const QString& dbType);
QModelIndex getConnNodeIndex(const QString& name); QModelIndex getConnNodeIndex(const QString& name);
void addDataModel(const QString& connection, Model& model); void addDataModel(const QString& connection, Model& model);
void removeDataModel(DBStructureNode*);
signals: signals:
void errorOccurred(const QString& strConnectionName); void errorOccurred(const QString& strConnectionName);
@ -37,6 +41,7 @@ private:
DBStructureNode* getNode(const QModelIndex& index) const; DBStructureNode* getNode(const QModelIndex& index) const;
DBStructureNode* getConnectionNode(const QString& name) const; DBStructureNode* getConnectionNode(const QString& name) const;
MainWindow* m_pMainWindow;
DBStructureNode* m_rootNode; DBStructureNode* m_rootNode;
}; };

View File

@ -41,6 +41,7 @@ public:
//节点操作 //节点操作
void appendChild(DBStructureNode* child); void appendChild(DBStructureNode* child);
void removeChild(DBStructureNode* child);
DBStructureNode* child(int row); DBStructureNode* child(int row);
int childCount() const; int childCount() const;
int row() const; int row() const;

View File

@ -3,7 +3,9 @@
#include <QTreeView> #include <QTreeView>
class MainWindow;
class DatabaseManager; class DatabaseManager;
class DBStructureNode;
class DBStructureView : public QTreeView class DBStructureView : public QTreeView
{ {
Q_OBJECT Q_OBJECT
@ -12,19 +14,25 @@ public:
explicit DBStructureView(DatabaseManager* dbManager, QWidget* parent = nullptr); explicit DBStructureView(DatabaseManager* dbManager, QWidget* parent = nullptr);
~DBStructureView(); ~DBStructureView();
void setMainWindow(MainWindow*);
void disconnectCurConnection(); void disconnectCurConnection();
const QString curConnection(); const QString curConnection();
void onActionTrigger_removeModel();
protected: protected:
void mouseDoubleClickEvent(QMouseEvent* event) override; void mouseDoubleClickEvent(QMouseEvent* event) override;
private: private:
MainWindow* m_pMainWindow;
DatabaseManager* m_dbManager; DatabaseManager* m_dbManager;
QString m_curConnection; //用来记录当前链接,只能存在一个链接 QString m_curConnection; //用来记录当前链接,只能存在一个链接
void initView(); void initView();
void connectToDB(const QString&); void connectToDB(const QString&);
void disconnectToDB(const QString&); void disconnectToDB(const QString&);
void removeNode(DBStructureNode*);
signals: signals:
void actionTrigger_addModel(); void actionTrigger_addModel();

View File

@ -1,11 +1,14 @@
#include "dbStructureModel.h" #include "dbStructureModel.h"
#include "mainwindow.h"
#include "sqlQueryExecutor.h" #include "sqlQueryExecutor.h"
#include "logger.h" #include "logger.h"
// #include <QSqlDatabase> // #include <QSqlDatabase>
// #include <QSqlQuery> // #include <QSqlQuery>
DBStructureModel::DBStructureModel(QObject* parent) DBStructureModel::DBStructureModel(QObject* parent)
: QAbstractItemModel(parent), m_rootNode(new DBStructureNode(RootNode, "Root")) : QAbstractItemModel(parent)
, m_rootNode(new DBStructureNode(RootNode, "Root"))
, m_pMainWindow(nullptr)
{ {
} }
@ -15,6 +18,11 @@ DBStructureModel::~DBStructureModel()
delete m_rootNode; delete m_rootNode;
} }
void DBStructureModel::setMainWindow(MainWindow* window)
{
m_pMainWindow = window;
}
DBStructureNode* DBStructureModel::getNode(const QModelIndex& index) const DBStructureNode* DBStructureModel::getNode(const QModelIndex& index) const
{ {
if(index.isValid()) if(index.isValid())
@ -156,6 +164,39 @@ void DBStructureModel::addDataModel(const QString& connection, Model& model)
endInsertRows(); endInsertRows();
} }
void DBStructureModel::removeDataModel(DBStructureNode* modelNode)
{
//可以不对node在进行一系列的检查因为该函数调取之前已有相关逻辑
int modelID = modelNode->data(Qt::UserRole + NodeDataRole::ID).toInt();
//先从数据库中删除
DBStructureNode* connNode = modelNode->parentNode();
if(!(connNode && connNode->type() == ConnectionNode))
{
if(m_pMainWindow)
{
QString error = QString::fromWCharArray(L"删除失败,未找到所在链接节点信息");
m_pMainWindow->showMessageDialog(type_information, QString::fromWCharArray(L"失败"), error);
}
return;
}
bool result = SqlQueryExecutor::instance().removeMode(connNode->name(), modelID);
if(!result)
{
if(m_pMainWindow)
{
QString error = QString::fromWCharArray(L"删除失败,详情可见日志文件");
m_pMainWindow->showMessageDialog(type_information, QString::fromWCharArray(L"失败"), error);
}
return;
}
else //从列表中删除
{
beginRemoveRows(index(connNode->row(), 0, QModelIndex()), modelNode->row(), modelNode->row());
connNode->removeChild(modelNode);
endRemoveRows();
}
}
void DBStructureModel::refreshStructure_Connection(const QString& connection) void DBStructureModel::refreshStructure_Connection(const QString& connection)
{ {
DBStructureNode* connNode = getConnectionNode(connection); DBStructureNode* connNode = getConnectionNode(connection);
@ -202,6 +243,7 @@ void DBStructureModel::refreshStructure_Connection(const QString& connection)
for(const Model& model : models) for(const Model& model : models)
{ {
DBStructureNode* modelNode = new DBStructureNode(TableNode, model.name, connNode); DBStructureNode* modelNode = new DBStructureNode(TableNode, model.name, connNode);
modelNode->setData(Qt::UserRole + NodeDataRole::ID, model.id);
for(int groupID : model.groups) for(int groupID : model.groups)
{ {
QString groupName = SqlQueryExecutor::instance().getArributeGropuName(connection, groupID); QString groupName = SqlQueryExecutor::instance().getArributeGropuName(connection, groupID);

View File

@ -57,6 +57,15 @@ void DBStructureNode::appendChild(DBStructureNode* child)
} }
} }
void DBStructureNode::removeChild(DBStructureNode* child)
{
if(m_children.removeOne(child))
{
delete child;
child = nullptr;
}
}
DBStructureNode* DBStructureNode::child(int row) DBStructureNode* DBStructureNode::child(int row)
{ {
if(row < 0 || row >= m_children.count()) if(row < 0 || row >= m_children.count())

View File

@ -1,6 +1,7 @@
#include "dbStructureView.h" #include "dbStructureView.h"
#include "dbStructureNode.h" #include "dbStructureNode.h"
#include "dbStructureModel.h" #include "dbStructureModel.h"
#include "mainwindow.h"
#include "dbManager.h" #include "dbManager.h"
#include "customMenu.h" #include "customMenu.h"
#include <QMenu> #include <QMenu>
@ -8,7 +9,7 @@
#include <QMouseEvent> #include <QMouseEvent>
DBStructureView::DBStructureView(DatabaseManager* dbManager, QWidget* parent) DBStructureView::DBStructureView(DatabaseManager* dbManager, QWidget* parent)
: QTreeView(parent), m_dbManager(dbManager) : QTreeView(parent), m_dbManager(dbManager), m_pMainWindow(nullptr)
{ {
// connect(m_dbManager, &DatabaseManager::connectionStatusChanged, // connect(m_dbManager, &DatabaseManager::connectionStatusChanged,
// [this](const QString& connName, bool connected) // [this](const QString& connName, bool connected)
@ -25,6 +26,11 @@ DBStructureView::~DBStructureView()
} }
void DBStructureView::setMainWindow(MainWindow* window)
{
m_pMainWindow = window;
}
void DBStructureView::mouseDoubleClickEvent(QMouseEvent* event) void DBStructureView::mouseDoubleClickEvent(QMouseEvent* event)
{ {
//只对鼠标左键的双击事件进行响应 //只对鼠标左键的双击事件进行响应
@ -77,6 +83,24 @@ void DBStructureView::disconnectToDB(const QString& connName)
} }
} }
void DBStructureView::removeNode(DBStructureNode* node)
{
if(m_pMainWindow)
{
m_pMainWindow->showMessageDialog(type_question, QString::fromWCharArray(L"提示"),
QString::fromWCharArray(L"确认删除当前节点吗"));
if(g_msgDlgBtn == btn_No)
return;
}
if(node && node->type() == TableNode)
{
DBStructureModel* model = dynamic_cast<DBStructureModel*>(this->model());
if(model)
model->removeDataModel(node);
}
}
void DBStructureView::disconnectCurConnection() void DBStructureView::disconnectCurConnection()
{ {
if(!m_curConnection.isEmpty()) if(!m_curConnection.isEmpty())
@ -91,6 +115,26 @@ const QString DBStructureView::curConnection()
return m_curConnection; return m_curConnection;
} }
void DBStructureView::onActionTrigger_removeModel()
{
QModelIndex currentInex = currentIndex();
DBStructureNode* node = static_cast<DBStructureNode*>(currentInex.internalPointer());
if(node && node->type() == TableNode)
{
removeNode(node);
}
else if(node && node->type() == GroupNode)
{
DBStructureNode* parent = node->parentNode();
removeNode(parent);
}
else if(m_pMainWindow)
{
m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),
QString::fromWCharArray(L"请先选择一个模型节点"));
}
}
void DBStructureView::itemDoubleClick(const QModelIndex& index) void DBStructureView::itemDoubleClick(const QModelIndex& index)
{ {
DBStructureNode* node = static_cast<DBStructureNode*>(index.internalPointer()); DBStructureNode* node = static_cast<DBStructureNode*>(index.internalPointer());
@ -117,7 +161,7 @@ void DBStructureView::showContextMenu(const QPoint& pos)
return; return;
DBStructureNode* node = static_cast<DBStructureNode*>(index.internalPointer()); DBStructureNode* node = static_cast<DBStructureNode*>(index.internalPointer());
if(node->type() == ConnectionNode) if(node && node->type() == ConnectionNode)
{ {
bool isConnected = true; bool isConnected = true;
if(node->status() == Disconnect) if(node->status() == Disconnect)
@ -144,9 +188,13 @@ void DBStructureView::showContextMenu(const QPoint& pos)
QPoint originPoint = this->mapToGlobal(QPoint(0,0)); QPoint originPoint = this->mapToGlobal(QPoint(0,0));
menu.exec(originPoint + pos); menu.exec(originPoint + pos);
} }
else if(node->type() == TableNode) else if(node && node->type() == TableNode)
{ {
CustomMenu menu; CustomMenu menu;
menu.addAction(QString::fromWCharArray(L"删除"), [this]{}); menu.addAction(QString::fromWCharArray(L"删除"), [this,node]{
removeNode(node);
});
QPoint originPoint = this->mapToGlobal(QPoint(0,0));
menu.exec(originPoint + pos);
} }
} }

View File

@ -63,9 +63,11 @@ void MainWindow::initialize()
connect(m_dbManager, &DatabaseManager::connectionStatusChanged, this, &MainWindow::onSIG_connectionStatusChanged); connect(m_dbManager, &DatabaseManager::connectionStatusChanged, this, &MainWindow::onSIG_connectionStatusChanged);
m_pDBStrutureView = new DBStructureView(m_dbManager, this); 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_addModel, this, &MainWindow::onActionTrigger_addModel);
ui->layoutDBStructure->addWidget(m_pDBStrutureView); ui->layoutDBStructure->addWidget(m_pDBStrutureView);
m_pDBStrutureModel = new DBStructureModel(this); m_pDBStrutureModel = new DBStructureModel(this);
m_pDBStrutureModel->setMainWindow(this);
m_pDBStrutureView->setModel(m_pDBStrutureModel); m_pDBStrutureView->setModel(m_pDBStrutureModel);
QScreen* screen = this->screen(); QScreen* screen = this->screen();
@ -160,7 +162,8 @@ void MainWindow::onActionTrigger_addModel()
} }
void MainWindow::onActionTrigger_removeModel() void MainWindow::onActionTrigger_removeModel()
{ {
if(m_pDBStrutureView)
m_pDBStrutureView->onActionTrigger_removeModel();
} }
void MainWindow::onSIG_addConnection(DatabaseConfig& config) void MainWindow::onSIG_addConnection(DatabaseConfig& config)

View File

@ -250,10 +250,12 @@ const QVector<AttributeGroup> SqlQueryExecutor::getAttributeGroup(const QString&
const QString SqlQueryExecutor::getArributeGropuName(const QString& strConnectionName, int groupID) const QString SqlQueryExecutor::getArributeGropuName(const QString& strConnectionName, int groupID)
{ {
QString name; QString name;
QString strSQL = "SELECT group_name FROM basic.attribute_group WHERE id = " + QString::number(groupID); QString strSQL = "SELECT group_name FROM basic.attribute_group WHERE id = :id";
QVariantHash params;
params.insert(":id", groupID);
try try
{ {
QSqlQuery query = executeSQL(strConnectionName, strSQL); QSqlQuery query = executeSQL(strConnectionName, strSQL, params);
if(query.next()) if(query.next())
name = query.value(0).toString(); name = query.value(0).toString();
} }