重写QSqlTableModel的flags函数实现tableview中某些列不可编辑,某些可以编辑
时间: 2024-02-11 14:04:37 浏览: 45
您可以重写 `QSqlTableModel` 的 `flags()` 函数,以实现在 `QTableView` 中某些列不可编辑,某些可以编辑的功能。
下面是一个示例代码,它将第一列设置为只读,其他列可编辑:
```python
class CustomTableModel(QSqlTableModel):
def flags(self, index):
if index.column() == 0:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
else:
return super().flags(index) | Qt.ItemIsEditable
```
在这个示例中,我们首先检查 `index` 的列数是否为 0,也就是第一列。如果是,则返回 `Qt.ItemIsEnabled` 和 `Qt.ItemIsSelectable`,表示该单元格只读。否则,我们调用基类的 `flags()` 函数,再加上 `Qt.ItemIsEditable` 标志,表示该单元格可编辑。
您可以根据自己的需求修改此函数来实现不同的编辑行为。
相关问题
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); // 第二列为密码列
```
这样设置后,第二列的密码将以星号或其他隐藏字符显示。需要注意的是,这种方式只是在视图层面上隐藏密码,密码仍然以明文形式存储在数据库中,需要采取其他措施保证数据安全性。
阅读全文