1.概要
2.代码
在Qt中,如果你想在QTableView的单元格中添加一个多选按钮(例如QCheckBox),并且能够响应点击事件,你需要进行以下几个步骤:
- 创建一个自定义的委托(Delegate):这个委托将负责在单元格中绘制和编辑
QCheckBox。 - 在你的模型(Model)中处理数据:确保你的模型能够存储和提供
QCheckBox的状态。 - 将委托设置到
QTableView中:使得QTableView知道在特定单元格中使用这个委托。
下面是一个简单的示例,演示如何实现这一点:
1. 创建一个自定义委托
首先,创建一个继承自QStyledItemDelegate的类,并重写其paint和createEditor、setEditorData、setModelData方法。
#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>
#include <QPainter>
class CheckBoxDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
CheckBoxDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent)
{}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = QStyle::State_Enabled | QStyle::State_NoChange;
if (index.data(Qt::CheckStateRole).toBool())
{
checkBoxStyle.state |= QStyle::State_On;
}
else
{
checkBoxStyle.state |= QStyle::State_Off;
}
checkBoxStyle.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
}
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
{
QCheckBox *editor = new QCheckBox(parent);
return editor;
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
}
};
#endif // CHECKBOXDELEGATE_H
2. 在你的模型中处理数据
确保你的模型(例如QStandardItemModel或自定义的QAbstractTableModel)能够存储和返回Qt::CheckStateRole的数据。
QStandardItemModel *model = new QStandardItemModel(4, 2);
for (int row = 0; row < 4; ++row)
for (int column = 0; column < 2; ++column)
model->setItem(row, column, new QStandardItem());
// Set some initial check states
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);
3. 将委托设置到QTableView中
QStandardItemModel *model = new QStandardItemModel(4, 2);
for (int row = 0; row < 4; ++row)
for (int column = 0; column < 2; ++column)
model->setItem(row, column, new QStandardItem());
// Set some initial check states
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);
完整示例
#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>
#include <QPainter>
class CheckBoxDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
CheckBoxDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent)
{}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = QStyle::State_Enabled | QStyle::State_NoChange;
if (index.data(Qt::CheckStateRole).toBool())
{
checkBoxStyle.state |= QStyle::State_On;
}
else
{
checkBoxStyle.state |= QStyle::State_Off;
}
checkBoxStyle.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
}
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
{
QCheckBox *editor = new QCheckBox(parent);
return editor;
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
}
};
#endif // CHECKBOXDELEGATE_H
#include "CheckBoxDelegate.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTableView *tableView = new QTableView;
QStandardItemModel *model = new QStandardItemModel(4, 2);
for (int row = 0; row < 4; ++row)
for (int column = 0; column < 2; ++column)
model->setItem(row, column, new QStandardItem());
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);
tableView->setModel(model);
CheckBoxDelegate *delegate = new CheckBoxDelegate(tableView);
tableView->setItemDelegateForColumn(0, delegate);
tableView->show();
return app.exec();
}
这个示例展示了如何在QTableView中添加一个可以点击的多选按钮,并通过自定义委托来处理绘制和编辑操作。
3.运行结果

5886

被折叠的 条评论
为什么被折叠?



