#include "dbBrowser.h" #include "ui_dbBrowser.h" #include "mainwindow.h" #include "attributeView.h" #include #include DatabaseBrowser::DatabaseBrowser(QWidget *parent) : QWidget(parent) , ui(new Ui::DatabaseBrowser) , m_pMainWindow(nullptr) { ui->setupUi(this); m_previousTabIndex = -1; //正则表达式,只能输入数字 QRegularExpression regExp("[0-9]+"); QRegularExpressionValidator* validator = new QRegularExpressionValidator(regExp, this); ui->lineEditPage->setValidator(validator); connect(ui->tabWidget, &QTabWidget::tabCloseRequested, this, &DatabaseBrowser::onTabCloseRequested); connect(ui->tabWidget, &QTabWidget::currentChanged, this, &DatabaseBrowser::onCurrentTabChanged); connect(ui->btnAdd, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_addRecord); connect(ui->btnRemove, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_removeRecord); connect(ui->btnSave, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_submitChanges); connect(ui->btnCancle, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_cancleChanges); connect(ui->btnRefresh, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_refreshData); connect(ui->btnFirstPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_firstPage); connect(ui->btnPreviousPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_previousPage); connect(ui->btnNextPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_nextPage); connect(ui->btnLastPage, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClicked_lastPage); connect(ui->lineEditPage, &QLineEdit::returnPressed, this, &DatabaseBrowser::onEditingFinished_page); } DatabaseBrowser::~DatabaseBrowser() { delete ui; } void DatabaseBrowser::setMainWindow(MainWindow* window) { m_pMainWindow = window; } int DatabaseBrowser::tabIndex(const QString& tabText) { for(int i = 0; i < ui->tabWidget->count(); i++) { if(ui->tabWidget->tabText(i) == tabText) return i; } return -1; } void DatabaseBrowser::addTab_attribute(const QString& connection, ModelAttributeGroup& attributeGroup) { QString tabText = attributeGroup.strModelName + "/" + attributeGroup.strGroupName; int index = tabIndex(tabText); if(index != -1) { ui->tabWidget->setCurrentIndex(index); return; } AttributeView* view = new AttributeView(attributeGroup, ui->tabWidget, connection); connect(view, &AttributeView::showMessage, this, &DatabaseBrowser::onShowMessage); connect(view->model(), &AttributeTableModel::showMessage, this, &DatabaseBrowser::onShowMessage); connect(view->model(), &AttributeTableModel::syncDataStatus, this, &DatabaseBrowser::onSyncDataStatus); connect(view->delegate(), &AttributeTableDelegate::showMessage, this, &DatabaseBrowser::onShowMessage); index = ui->tabWidget->addTab(view, QIcon(":/img/images/icon_hierarchy.png"), tabText); //添加自定义按钮 /*QPushButton* closeBtn = new QPushButton(""); closeBtn->setProperty("index", index); connect(closeBtn, &QPushButton::clicked, this, &DatabaseBrowser::onBtnClick_tabCloseBtn); closeBtn->setFixedSize(12, 12); closeBtn->setStyleSheet("QPushButton\n" "{\n" " border-image: url(:/img/images/btn_close_default.png);\n" "}\n" "QPushButton:hover\n" "{\n" " border-image: url(:/img/images/btn_close_hover.png);\n" "}\n" "QPushButton:pressed\n" "{\n" " border-image: url(:/img/images/btn_close_pressed.png);\n" "}"); QTabBar* tabBar = ui->tabWidget->tabBar(); tabBar->setTabButton(index, QTabBar::RightSide, closeBtn);*/ ui->tabWidget->setCurrentIndex(index); } void DatabaseBrowser::closeTab_attribute(ModelAttributeGroup& attributeGroup) { if(attributeGroup.groupID == -1) //关闭该模型下所有打开的tab { //int tabCount = ui->tabWidget->count(); for(int i = 0; i < ui->tabWidget->count(); i++) { if(ui->tabWidget->tabText(i).contains(attributeGroup.strModelName + "/")) { onTabCloseRequested(i); i--; } } } else //关闭具体的tab { QString tabText = attributeGroup.strModelName + "/" + attributeGroup.strGroupName; int index = tabIndex(tabText); if(index == -1) return; onTabCloseRequested(index); } } void DatabaseBrowser::closeAllTab_attribute() { int tabCount = ui->tabWidget->count(); for(int index = 0; index < tabCount; index++) onTabCloseRequested(0); } void DatabaseBrowser::onTabCloseRequested(int index) { /*QObject* sender = QObject::sender(); QPushButton* button = qobject_cast(sender); if(!button) return; int index = button->property("index").toInt();*/ QWidget* widget = ui->tabWidget->widget(index); ui->tabWidget->removeTab(index); delete widget; } void DatabaseBrowser::onCurrentTabChanged(int index) { if(m_previousTabIndex != -1) { ui->tabWidget->setTabIcon(m_previousTabIndex, QIcon(":/img/images/icon_hierarchy_unchecked.png")); } m_previousTabIndex = index; if(index == -1) //最后一个tab关闭时会触发 { ui->btnAdd->setEnabled(false); ui->btnRemove->setEnabled(false); ui->btnCancle->setEnabled(false); ui->btnRefresh->setEnabled(false); ui->btnSave->setEnabled(false); ui->btnCancle->setEnabled(false); ui->btnFirstPage->setEnabled(false); ui->btnPreviousPage->setEnabled(false); ui->btnNextPage->setEnabled(false); ui->btnLastPage->setEnabled(false); ui->recordInfo->clear(); ui->lineEditPage->setEnabled(false); ui->lineEditPage->setText("1"); return; } ui->tabWidget->setTabIcon(m_previousTabIndex, QIcon(":/img/images/icon_hierarchy.png")); QWidget* widget = ui->tabWidget->widget(index); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { ui->btnAdd->setEnabled(true); ui->btnRemove->setEnabled(true); ui->btnCancle->setEnabled(true); ui->btnRefresh->setEnabled(true); ui->btnFirstPage->setEnabled(true); ui->btnPreviousPage->setEnabled(true); ui->btnNextPage->setEnabled(true); ui->btnLastPage->setEnabled(true); ui->lineEditPage->setEnabled(true); attributeView->active(); } } void DatabaseBrowser::onBtnClicked_addRecord() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) { int row = model->rowCount(); //当前插入都是在最后一行 /*QModelIndex currentIndex = view->currentIndex(); if(currentIndex.row() != -1) row = currentIndex.row();*/ model->insertRecord(row); ui->btnSave->setEnabled(true); ui->btnCancle->setEnabled(true); } } } void DatabaseBrowser::onBtnClicked_removeRecord() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) { QModelIndex currentIndex = view->currentIndex(); int row = currentIndex.row(); if( row != -1) { model->removeRecord(row); ui->btnSave->setEnabled(true); ui->btnCancle->setEnabled(true); } } } } void DatabaseBrowser::onBtnClicked_submitChanges() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) { model->submitChanges(); attributeView->syncChangeRecord(); } } } void DatabaseBrowser::onBtnClicked_cancleChanges() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->cancleChanges(); } } void DatabaseBrowser::onBtnClicked_refreshData() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->refresh(); } } void DatabaseBrowser::onBtnClicked_firstPage() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->firstPage(); } } void DatabaseBrowser::onBtnClicked_previousPage() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->previousPage(); } } void DatabaseBrowser::onBtnClicked_nextPage() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->nextPage(); } } void DatabaseBrowser::onBtnClicked_lastPage() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) model->lastPage(); } } void DatabaseBrowser::onEditingFinished_page() { QWidget* widget = ui->tabWidget->currentWidget(); AttributeView* attributeView = qobject_cast(widget); if(attributeView) { QTableView* view = attributeView->view(); AttributeTableModel* model = attributeView->model(); if(view && model) { QString strPage = ui->lineEditPage->text(); bool result = model->setCurrentPage(strPage.toInt()); if(!result) ui->lineEditPage->setText(QString::number(model->currentPage())); } } } void DatabaseBrowser::onSyncDataStatus(bool hasModifiedData, const PaginationInfo& paginationInfo) { ui->btnSave->setEnabled(hasModifiedData); ui->btnCancle->setEnabled(hasModifiedData); QString recordInfo = QString::fromWCharArray(L"共 %1 条记录").arg(paginationInfo.totalEntries); ui->recordInfo->setText(recordInfo); ui->lineEditPage->setText(QString::number(paginationInfo.currentPage)); } void DatabaseBrowser::onShowMessage(MessageDialogType type,const QString& strTitle,const QString& strContent) { if(m_pMainWindow) m_pMainWindow->showMessageDialog(type, strTitle, strContent); }