重写QSqlTableModel的flags函数实现tableview中某些列不可编辑,某些可以编辑
时间: 2024-02-11 22:04:03 浏览: 154
您可以在重写QSqlTableModel的flags函数时,根据列号来设置每列的编辑属性,实现某些列不可编辑,某些可以编辑的功能。
下面是一个示例:
```python
class MyTableModel(QSqlTableModel):
def flags(self, index):
flags = super(MyTableModel, self).flags(index)
if index.column() == 0:
flags &= ~Qt.ItemIsEditable # 第0列不可编辑
else:
flags |= Qt.ItemIsEditable # 其他列可编辑
return flags
```
在这个示例中,我们重写了QSqlTableModel的flags函数,并在该函数中判断列号。对于第0列,我们将其“不可编辑”属性从flags中删除;对于其他列,我们将其“可编辑”属性添加到flags中。
这样,我们就可以根据需要设置每列的编辑属性,实现某些列不可编辑,某些可以编辑的功能了。
相关问题
QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("Users"); model->select(); ui->tableView_1->setModel(model); 设置第二列为密码格式看不见显示的数据,不重写 QSqlTableModel 的 data() 函数也不重写类
如果不想重写 `QSqlTableModel` 的 `data()` 函数,同时又不想新建代理类,你可以在表格视图的 `setIndexWidget()` 函数中设置一个 QLineEdit,将密码数据赋值给 QLineEdit,然后设置 QLineEdit 的 echoMode 为 Password。例如:
```cpp
QSqlTableModel *model = new QSqlTableModel(this, db);
model->setTable("Users");
model->select();
ui->tableView_1->setModel(model);
for (int row = 0; row < model->rowCount(); row++) {
QModelIndex index = model->index(row, 1); // 第二列为密码列
QString password = index.data().toString();
QLineEdit *lineEdit = new QLineEdit(password);
lineEdit->setEchoMode(QLineEdit::Password);
ui->tableView_1->setIndexWidget(index, lineEdit);
}
```
这样设置后,第二列的密码将以星号或其他隐藏字符显示。需要注意的是,这种方式只是在视图层面上隐藏密码,密码仍然以明文形式存储在数据库中,需要采取其他措施保证数据安全性。
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); // 第二列为密码列
```
这样设置后,第二列的密码将以星号或其他隐藏字符显示。需要注意的是,这种方式只是在视图层面上隐藏密码,密码仍然以明文形式存储在数据库中,需要采取其他措施保证数据安全性。
阅读全文