#include #include #include #include "showtablewidget.h" #include #include struct ShowTableObjects{ QMap,ShowTableWidget*> widgets; }; ShowTableObjects* ShowTableWidget::objs=0; ShowTableWidget* ShowTableWidget::createObject(const QString &table_name, const QString &constr, bool &isExist) { QPair pair; pair.first = table_name; pair.second = constr; if(objs->widgets.contains(pair)) { isExist = true; return objs->widgets[pair]; }else{ isExist = false; ShowTableWidget *widget = new ShowTableWidget; widget->init(table_name,constr); objs->widgets.insert(pair,widget); return widget; } } void ShowTableWidget::deleteObject(const QString &table_name, const QString &constr) { QPair pair; pair.first = table_name; pair.second = constr; objs->widgets.remove(pair); } void ShowTableWidget::initObjContainer() { objs = new ShowTableObjects; } void ShowTableWidget::delObjContainer() { objs->widgets.clear(); delete objs; } QList* ShowTableWidget::dbTables(const QString &constr) { QList > keys = objs->widgets.keys(); QPair pair; QStringList tables; foreach(pair,keys){ //keys.at(i); if(pair.second==constr){ tables.append(pair.first); } } QList *ret = new QList(); foreach(QString table,tables){ pair.first = table; pair.second = constr; ShowTableWidget *widget = objs->widgets.find(pair).value(); ret->append(widget); } return ret; //QMap,ShowTableWidget*>; } QList ShowTableWidget::allTables() { return objs->widgets.values(); } ShowTableWidget::ShowTableWidget() { } void ShowTableWidget::init(const QString &table_name,const QString &constr) { isDirty = false; table = table_name; con = constr; dbname = QSqlDatabase::database(con).databaseName(); init_model(); init_table(); init_menu(); init_toolbar(); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(toolbar); vbox->addWidget(view,1); vbox->setMargin(0); vbox->setSpacing(0); this->setLayout(vbox); setWindowTitle(QString("Êý¾Ý±í%1.%2").arg(dbname).arg(table)); } void ShowTableWidget::init_table(){ view = new QTableView(this); view->setModel(model); view->resizeRowsToContents(); view->setContextMenuPolicy(Qt::CustomContextMenu); connect(view,SIGNAL(customContextMenuRequested(QPoint)), this,SLOT(showContextMenu(QPoint))); } void ShowTableWidget::init_model(){ QSqlDatabase db = QSqlDatabase::database(con); model = new QSqlTableModel(this,db); model->setTable(table); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); QSqlRecord record = db.record(table); for(int i=0;isetHeaderData(i,Qt::Horizontal,record.fieldName(i)); } } void ShowTableWidget::init_menu(){ contextMenu = new QMenu(view); appendAct = contextMenu->addAction(QIcon(":/images/new.png"), QString("×·¼ÓÐÐ"),this,SLOT(appendRow())); insertAct = contextMenu->addAction(QIcon(":/images/insert.png"), QString("²åÈëÐÐ"),this,SLOT(insertRow())); removeAct = contextMenu->addAction(QIcon(":/images/remove.png"), QString("ɾ³ýËùÑ¡ÐÐ"),this,SLOT(removeSelectedRows())); contextMenu->addSeparator(); submitAct = contextMenu->addAction(QIcon(":/images/save.png"), QString("Ìá½»¸üÐÂ"),this,SLOT(submit())); cancelAct = contextMenu->addAction(QIcon(":/images/cancel.png"), QString("È¡Ïû¸üÐÂ"),model,SLOT(revertAll())); } void ShowTableWidget::init_toolbar() { toolbar = new QToolBar(this); toolbar->addAction(appendAct); toolbar->addAction(insertAct); toolbar->addAction(removeAct); toolbar->addAction(submitAct); toolbar->addAction(cancelAct); toolbar->setMaximumHeight(24); } void ShowTableWidget::appendRow() { model->insertRow(model->rowCount()); } void ShowTableWidget::submit() { bool ret = model->submitAll(); if(!ret){ QSqlError se = model->lastError(); QString err = QString("database:%1\ndriver:%2\nerror number:%3\nerror type:%4\nerror text:%5") .arg(se.databaseText()) .arg(se.driverText()) .arg(se.number()) .arg(se.type()).arg(se.text()); QMessageBox::warning(this,QString("Êý¾Ý±£´æ´íÎó"), err); } } void ShowTableWidget::insertRow() { QModelIndexList list = view->selectionModel()->selectedIndexes(); if(list.count()>0){ int i= list.at(0).row(); model->insertRow(i); }else{ model->insertRow(view->currentIndex().row()); } } void ShowTableWidget::removeSelectedRows() { QModelIndexList list = view->selectionModel()->selectedRows(); model->removeRows(list.at(0).row(),list.count()); // for(int i=0;iremoveRow(row); // } //QMessageBox::information(this,QString("debug"), // QString("ɾ³ýËùÑ¡ÐÐ")); } void ShowTableWidget::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { isDirty = true; } void ShowTableWidget::rowsInserted(const QModelIndex &parent, int start, int end) { isDirty = true; } void ShowTableWidget::rowsRemoved(const QModelIndex &parent, int start, int end) { isDirty = true; } void ShowTableWidget::showContextMenu(QPoint p) { contextMenu->exec(QCursor::pos()); } bool ShowTableWidget::maybeSave() { if(isDirty){ QMessageBox::StandardButton ret; QString db = QSqlDatabase::database(con).databaseName(); ret = QMessageBox::warning(this, QString("¾¯¸æ"), QString("'%1.%2' ÒѾ­¸ü¸Ä.ÊÇ·ñ±£´æ£¿").arg(db).arg(table), QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel); if (ret == QMessageBox::Save) return model->submitAll(); else if (ret == QMessageBox::Cancel) return false; } return true; } void ShowTableWidget::closeEvent(QCloseEvent *event) { if(maybeSave()){ event->accept(); deleteObject(table,con); }else{ event->ignore(); } }