進階的文件:MyWIdget2.h和MyWidget.cpp
工作:
只要是把數據庫中的數據的導到窗口中,然後在窗口中對數據的更改,刪除,添加。(其中對代理的處理和顯示的數據的要求的處理)
建立的文件:
MyWidget2.h
#ifndef MYWIDGET2_H
#define MYWIDGET2_H
#include <QObject>
#include <QSqlTableModel>
#include <QTableView>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlRecord>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QMessageBox>
//代理
#include <QItemDelegate>
#include <QComboBox>//將性別那列的格子改成複選框
class TAcount : public QItemDelegate
{
public:
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if(index.column() == 0)
return NULL;
if(index.column() ==3)
{
QComboBox *combox = new QComboBox(parent);
combox->addItem("男");
combox->addItem("女");
return combox;
}
return QItemDelegate::createEditor(parent,option,index);
}
};
#if 0
class GenderDelegate : public QItemDelegate
{
public:
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &,
const QModelIndex &) const
{
QComboBox *combox = new QComboBox(parent);
combox->addItem("男");
combox->addItem("女");
return combox;
}
};
class ReadOnlyDelegate : public QItemDelegate
{
public:
QWidget *createEditor(QWidget *,
const QStyleOptionViewItem &,
const QModelIndex &) const
{
return NULL;
}
};
#endif
//如果性別出現數據是0,將數據變成女,1,就變成男
class MyTableModel : public QSqlTableModel
{
public:
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const
{
if(idx.column() != 3)
return QSqlTableModel::data(idx,role);
QVariant var = QSqlTableModel::data(idx,role);//獲得數據所在的行和列
if(var == 0)
{
return "女";
}
return "男";
}
bool setData(const QModelIndex &index,
const QVariant &value, int role)
{
if(index.column()!=3)
return QSqlTableModel::setData(index,value,role);
if(value == "男")
return QSqlTableModel::setData(index,1,role);
return QSqlTableModel::setData(index,0,role);
}
};
class MyWidget2 : public QWidget
{
Q_OBJECT
public:
explicit MyWidget2(QWidget *parent = 0);
QSqlTableModel *_model;
QTableView *_view;
signals:
public slots:
void slotSubmitClicked();//更改
void slotDeleteClicked();//刪除
void slotAddClicked();//添加
};
#endif // MYWIDGET2_H
MyWidget2.cpp
#include "MyWidget2.h"
//在顯示的窗口中修改數據,刪除,關閉窗口後會自動提交到數據庫中
MyWidget2::MyWidget2(QWidget *parent) :
QWidget(parent)
{
_model = new QSqlTableModel;
_model->setTable("account");
_model->select();
_model->setEditStrategy(QSqlTableModel::OnManualSubmit);//編輯策略(現在這個是修改窗口中數據,不會向數據庫更新)
_model->setHeaderData(0,Qt::Horizontal,"編號");//改動表的列名(水平的,只是在model修改 顯示,數據庫中沒有改)
_model->setHeaderData(1,Qt::Horizontal,"賬號");
_model->setHeaderData(2,Qt::Horizontal,"密碼");
_model->setHeaderData(3,Qt::Horizontal,"性別");
_view = new QTableView;
_view->setModel(_model);
// _view->hideColumn(1);//隱藏第二列
//_view->setItemDelegateForColumn(3,new GenderDelegate);//代理(對列)
//_view->setItemDelegateForColumn(0,new ReadOnlyDelegate);//代理只能讀不能修改第一列
_view->setItemDelegate(new TAcount);//對整個表代理(可以代替GenderDelegate和ReadOnlyDelegate類)
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(_view);
QHBoxLayout *hBox = new QHBoxLayout;
layout->addLayout(hBox);
hBox->addStretch();//加個彈簧,把按鈕弄到右邊
QPushButton *del = new QPushButton("刪除");
connect(del,SIGNAL(clicked()),this,SLOT(slotDeleteClicked()));
hBox->addWidget(del);
QPushButton *submit = new QPushButton("提交");
connect(submit,SIGNAL(clicked()),this,SLOT(slotSubmitClicked()));
hBox->addWidget(submit);
QPushButton *add = new QPushButton("添加");
connect(add,SIGNAL(clicked()),this,SLOT(slotAddClicked()));
hBox->addWidget(add);
}
void MyWidget2::slotDeleteClicked()
{
//通過_view去獲取被選中的部分的數據model
QItemSelectionModel *selectModel = _view->selectionModel();
//通過選中的數據結構,獲取這些格子的model Index,用來知道這些格子在model數據結構中的位置
QModelIndexList selectList = selectModel->selectedIndexes();
QList<int> delRow;
//遍歷這些格子,獲取格子所在的行,因爲可能存在相同的行,所以去重
for(int i = 0;i < selectList.size(); ++i)
{
QModelIndex index = selectList.at(i);
// _model->removeRow(index.row());
delRow << index.row();//將遍歷的結果放在QList中
}
while(delRow.size() > 0)
{
int row = delRow.at(0);
delRow.removeAll(row);
_model->removeRow(row);
}
_model->submitAll();
}
void MyWidget2::slotAddClicked()//添加結束之後還要點擊一下提交
{
//_model->database().transaction();//事務的開始
//事務要做的就是添加三行數據,要麼全添加上 要麼 就一個也不添加
QSqlRecord record = _model->record();
_model->insertRecord(-1,record);
}
void MyWidget2::slotSubmitClicked()
{
if(!_model->submitAll())
{
QMessageBox::critical(this,"ERROR",QSqlDatabase::database().lastError().text());
// _model->database().rollback();//沒成功就恢復到添加之前
}
// else
// _model->database().commit();//將整個數據庫進行提交
}
main.cpp
#include <QApplication>
#include "MyWidget2.h"
#include <QDebug>
#include <QSqlError>
int main(int argc,char **argv)
{
QApplication app(argc,argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("123456");
db.setDatabaseName("food");//要鏈接的數據庫名
bool bRet = db.open();
if(bRet == false)
{
qDebug() << "error open database" << db.lastError().text();
exit(0);
}
qDebug() << "open database success";
MyWidget2 w;
w.show();
return app.exec();
}
有什麼問題請聯繫我:839505138.