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.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值