qt 在qtableview中添加checkbox
时间: 2023-08-31 11:02:17 浏览: 257
在Qt的QTableView中添加复选框可以通过自定义一个QItemDelegate来实现。下面是一个简单的示例:
首先,我们定义一个继承自QItemDelegate的自定义委托类,名称为CheckBoxDelegate:
```cpp
class CheckBoxDelegate : public QItemDelegate
{
public:
CheckBoxDelegate(QObject* parent = nullptr)
: QItemDelegate(parent)
{
}
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
if (index.column() == 0)
{
QStyleOptionButton checkBoxOption;
checkBoxOption.rect = option.rect;
checkBoxOption.state = index.data(Qt::CheckStateRole).toBool() ? QStyle::State_On : QStyle::State_Off;
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxOption, painter);
}
else
{
QItemDelegate::paint(painter, option, index);
}
}
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
if (index.column() == 0)
{
QCheckBox* checkBox = new QCheckBox(parent);
return checkBox;
}
else
{
return QItemDelegate::createEditor(parent, option, index);
}
}
void setEditorData(QWidget* editor, const QModelIndex& index) const override
{
if (index.column() == 0)
{
bool checked = index.data(Qt::CheckStateRole).toBool();
QCheckBox* checkBox = static_cast<QCheckBox*>(editor);
checkBox->setChecked(checked);
}
else
{
QItemDelegate::setEditorData(editor, index);
}
}
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override
{
if (index.column() == 0)
{
QCheckBox* checkBox = static_cast<QCheckBox*>(editor);
model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
}
else
{
QItemDelegate::setModelData(editor, model, index);
}
}
};
```
然后,在我们的QTableView中使用这个自定义委托类来实现复选框的功能:
```cpp
QTableView* tableView = new QTableView;
QStandardItemModel* model = new QStandardItemModel;
// 设置表格大小
model->setRowCount(3);
model->setColumnCount(2);
// 设置表头
model->setHeaderData(0, Qt::Horizontal, "复选框列");
model->setHeaderData(1, Qt::Horizontal, "其他列");
// 设置复选框数据
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);
model->setData(model->index(2, 0), Qt::Checked, Qt::CheckStateRole);
// 设置委托
CheckBoxDelegate* checkBoxDelegate = new CheckBoxDelegate(tableView);
tableView->setItemDelegateForColumn(0, checkBoxDelegate);
// 设置数据模型
tableView->setModel(model);
```
上述代码创建了一个QTableView和一个QStandardItemModel,并通过数据模型设置了3行2列的数据。使用自定义委托类CheckBoxDelegate将第一列的数据设置为复选框。然后将数据模型设置到QTableView中。
最后,我们通过`tableView->setModel(model)`将数据模型设置到QTableView中完成复选框的添加。
这样就可以在QTableView中添加复选框了。记得在使用前先将相应的头文件导入:`#include <QCheckBox>`、`#include <QPainter>`、`#include <QStandardItemModel>`、`#include <QTableView>`、`#include <QItemDelegate>`。
阅读全文