QStandardItemModel结合TableView使用

使用背景:一个用户数据库含有账号和密码,其数据库内容要可视化,且密码要显示成密文。如图:
在这里插入图片描述

1先建立表,并初始化8个用户

 QSqlQuery querys(m_db);
   QString tmpStrs;
   tmpStrs = " CREATE TABLE if not exists venderInfo(ID INTEGER PRIMARY KEY,Name varchar(30) NULL,Password varchar(30) NULL);";
   querys.exec(tmpStrs);
   //初始化表 8个用户
   for(int i=0;i<8;i++)
   {
    QString sql;
    sql=QString("insert into venderInfo (ID,Name,Password) ");
    sql = sql + QString("values (");
    sql = sql + QString("'") +QString::number(i+1)+ QString("'");
    sql = sql + QString(",'")  + QString("'");
    sql = sql + QString(",'")+QString("'");
    sql = sql + QString(")");
    QSqlQuery queryi(m_db);
    queryi.exec(sql);
   }

2.使用QSqlRelationalTableModel获取数据库内表数据将其绑定tableView

  qryModel = new QSqlRelationalTableModel();
    qryModel->setTable("venderInfo");//获取该表
    qryModel->select();//查询该表所有数据
    this->ui->tableView->setModel(qryModel);//绑定tableview

3.使用QItemDelegate 对单元格的输入和显示做限制(Name列,只能输入20个字符,//密码列,只能输入6个数字(密文))
下面展示密码列:

class  UserIDDelegate :  public  QItemDelegate
{
    Q_OBJECT
public :
    UserIDDelegate(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent,  const QStyleOptionViewItem &option, const  QModelIndex &index)  const;
     void  setEditorData(QWidget *editor,  const  QModelIndex &index)  const;
     //设置数据
     void  setModelData(QWidget *editor, QAbstractItemModel *model,  const  QModelIndex &index)  const;
     //输入的位置
     void  updateEditorGeometry(QWidget *editor,const  QStyleOptionViewItem &option,  const  QModelIndex &index) const;
     //paint重绘 将其输入设置显示为“ * ”
     void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const Q_DECL_OVERRIDE;
}
UserIDDelegate::UserIDDelegate(QObject *parent): QItemDelegate(parent)
{

}
QWidget *UserIDDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

        QLineEdit *editor =  new  QLineEdit(parent);
        editor->setEchoMode(QLineEdit::Password);//设置密文显示
        QRegExp regExp( "[0-9]{0,6}" );
        editor->setValidator( new  QRegExpValidator(regExp, parent));
         return  editor;
}

void UserIDDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{

        QString text = index.model()->data(index, Qt::EditRole).toString();
        QLineEdit *lineEdit =  static_cast <QLineEdit*>(editor);
        lineEdit->setEchoMode(QLineEdit::Password);//设置密文显示
        lineEdit->setText(text);
}
void UserIDDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{

        QLineEdit *lineEdit =  static_cast <QLineEdit*>(editor);
        emit setpwddata(index.row(),lineEdit->text());
        qDebug()<<index.row()<<lineEdit->text();
        model->setData(index,lineEdit->text(),Qt::EditRole);
}
void UserIDDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

        editor->setGeometry(option.rect);
}
void UserIDDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

          QStyleOptionViewItem itemStyle = option;

          QRect bgRect = itemStyle.rect.adjusted(2, 2, -2, -2);

          QString str = index.model()->data(index,Qt::DisplayRole).toString();

          if(str.isEmpty())
          {
              painter->drawText(bgRect, Qt::AlignLeft | Qt::AlignBottom, "");
          }

          //repeated 重复赋值 将for循环简化  !!!
          // QString tmp;
        //  for(int i=0;i<str.size();i++)
        //     {
         //            tmp +="*";
         //    }
             //
          QString tmp="*";
          tmp = tmp.repeated(str.size());
            painter->drawText(bgRect, Qt::AlignLeft | Qt::AlignBottom, tmp);
}

之前都没有好好掌握传入paint里的index有何用处 ,走了弯路
,他可以获取当前文本值,这下设置思路就清晰了 将当前文本值全部转换为“*” 就实现了 密文显示

QString str = index.model()->data(index,Qt::DisplayRole).toString();

最后tableView 添加代理 delegate

    ui->tableView->setItemDelegateForColumn(1, new UserDelegate());//Name列
    ui->tableView->setItemDelegateForColumn(2,new UserIDDelegate());//pwd列
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置表格自适应大小

就实现了 如图1所示
密码列显示的是“**”,实际存入数据库的是密码,实现tableview 某列密文显示的效果。
删除与增加
删除。

int curRow = ui->tableView->currentIndex().row();获取选中的行
 qryModel->removeRow(curRow);//删除该行
 qryModel->submitAll();//提交,在数据库中删除该行

增加

   int rowNum = qryModel->rowCount();//获得表的行数
   int id = 10;
   qryModel->insertRow(rowNum); //添加一行
   qryModel->setData(qryModel->index(rowNum,0),id);//设置数据
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值