Qt Creator:QSqlTableModel的進階

進階的文件: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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章