使用背景:一个用户数据库含有账号和密码,其数据库内容要可视化,且密码要显示成密文。如图:
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);//设置数据