QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("Users"); model->select(); ui->tableView_1->setModel(model); 设置第二列为密码格式看不见显示的数据,
时间: 2024-03-27 14:36:02 浏览: 87
你可以通过重写 `QSqlTableModel` 的 `data()` 函数来实现显示密码为星号或者其他隐藏字符。在 `data()` 函数中,可以判断当前列是否为密码列,如果是,则返回隐藏后的字符串。例如:
```cpp
QVariant QSqlTableModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole && index.column() == 1) { // 第二列为密码列
QString password = QSqlTableModel::data(index, role).toString();
QString hiddenPassword;
for (int i = 0; i < password.length(); i++) {
hiddenPassword.append("*"); // 显示为星号
}
return hiddenPassword;
}
return QSqlTableModel::data(index, role);
}
```
在设置模型后,调用 `ui->tableView_1->setModel(model)` 即可显示隐藏后的密码。注意,这种方式只是在视图层面上隐藏密码,密码仍然以明文形式存储在数据库中,需要采取其他措施保证数据安全性。
相关问题
QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("Users"); model->select(); ui->tableView_1->setModel(model); 设置第二列为密码格式看不见显示的数据,不重写 QSqlTableModel 的 data() 函数
如果不想重写 `QSqlTableModel` 的 `data()` 函数,你也可以通过设置代理来实现隐藏密码。在代理中,可以判断当前列是否为密码列,如果是,则将显示的数据替换为星号或其他隐藏字符。例如:
```cpp
class PasswordDelegate : public QStyledItemDelegate
{
public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
// 密码列不可编辑
if (index.column() == 1) {
return nullptr;
}
return QStyledItemDelegate::createEditor(parent, option, index);
}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 1) { // 第二列为密码列
QString password = index.data(Qt::DisplayRole).toString();
QString hiddenPassword;
for (int i = 0; i < password.length(); i++) {
hiddenPassword.append("*"); // 显示为星号
}
QStyleOptionViewItem opt = option;
opt.displayAlignment = Qt::AlignCenter;
opt.text = hiddenPassword;
QStyledItemDelegate::paint(painter, opt, index);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
};
```
然后,在设置模型后,将代理设置给表格视图即可:
```cpp
QSqlTableModel *model = new QSqlTableModel(this, db);
model->setTable("Users");
model->select();
ui->tableView_1->setModel(model);
PasswordDelegate *delegate = new PasswordDelegate(this);
ui->tableView_1->setItemDelegateForColumn(1, delegate); // 第二列为密码列
```
这样设置后,第二列的密码将以星号或其他隐藏字符显示。需要注意的是,这种方式只是在视图层面上隐藏密码,密码仍然以明文形式存储在数据库中,需要采取其他措施保证数据安全性。
Widget::~Widget() { } void Widget::initTableView() { ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView->verticalHeader()->setHidden(true); QSqlTableModel *pModel = new QSqlTableModel(this, DatabaseOperation::getInstance()->GetDb()); pModel->setTable("goods"); pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//手动提交 pModel->select(); pModel->setHeaderData(0, Qt::Horizontal, "id"); pModel->setHeaderData(1, Qt::Horizontal, "商品"); pModel->setHeaderData(2, Qt::Horizontal, "类别"); pModel->setHeaderData(3, Qt::Horizontal, "价格"); pModel->setHeaderData(4, Qt::Horizontal, "单位"); pModel->setHeaderData(5, Qt::Horizontal, "剩余"); // pModel->sort(0, Qt::DescendingOrder); // 第0列降序排序 ui->tableView->setModel(pModel);//界面设置数据 }
这是一个 C++ Qt 框架下的代码段,用于初始化一个 TableView 控件,显示数据库中的商品信息。该代码的作用如下:
1. 通过 `ui->tableView` 获取 TableView 控件,并设置选择模式为选择整行。
2. 隐藏 TableView 的垂直标头。
3. 创建一个 QSqlTableModel 对象,并设置其关联的表为 "goods",同时设置编辑策略为手动提交。
4. 通过 `select()` 方法执行查询,并使用 `setHeaderData()` 方法设置 TableView 的列名。
5. 将 QSqlTableModel 对象设置为 TableView 的数据模型,从而将查询结果显示在 TableView 控件上。
阅读全文