Qt之QTableView添加复选框(QAbstractItemDelegate)
时间: 2024-03-30 21:15:41 浏览: 73
要在QTableView中添加复选框,可以使用QAbstractItemDelegate。下面是一个简单的示例:
首先,我们需要创建一个自定义的委托类,继承自QItemDelegate:
```cpp
class CheckBoxDelegate : public QItemDelegate
{
public:
CheckBoxDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {}
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QCheckBox *editor = new QCheckBox(parent);
editor->setStyleSheet("margin-left:50%;margin-right:50%;");
return editor;
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
bool value = index.model()->data(index, Qt::EditRole).toBool();
QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
checkBox->setChecked(value);
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
QCheckBox *checkBox = static_cast<QCheckBox*>(editor);
model->setData(index, checkBox->isChecked(), Qt::EditRole);
}
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
editor->setGeometry(option.rect);
}
};
```
这个类中主要实现了四个函数:
- createEditor:创建一个QCheckBox作为编辑器,并将其居中显示
- setEditorData:将模型中的数据设置到编辑器中
- setModelData:将编辑器中的数据设置回模型中
- updateEditorGeometry:更新编辑器的位置和大小
接下来,在使用QTableView的地方,创建一个QStandardItemModel,并为需要添加复选框的列设置该自定义委托类即可:
```cpp
QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(2);
model->setRowCount(3);
for (int row = 0; row < model->rowCount(); ++row)
{
for (int col = 0; col < model->columnCount(); ++col)
{
QModelIndex index = model->index(row, col, QModelIndex());
model->setData(index, QVariant(QString("row %1, column %2").arg(row).arg(col)));
}
}
ui->tableView->setModel(model);
ui->tableView->setItemDelegateForColumn(1, new CheckBoxDelegate(ui->tableView));
```
在这个示例中,我们将第二列设置为复选框列,所以我们使用setItemDelegateForColumn函数将该自定义委托类设置给第二列。然后,我们将该模型设置到QTableView中。完成以上步骤后,运行程序,即可看到复选框列已经添加到了QTableView中。
阅读全文