qt代理QItemDelegate使用
*-----------------------------------File.h-------------------------------------------------------*
#include <QTableView>
#include <QItemDelegate>
#include <QStandardItemModel>
#include <QComboBox>
#include <QCheckBox>
#include <QPainter>
#include <QEvent>
class ComboBoxDelegate : public QItemDelegate {
Q_OBJECT
public:
ComboBoxDelegate(QObject* parent = nullptr) : QItemDelegate(parent) {}
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems(QStringList() << "Option 1" << "Option 2" << "Option 3");
return comboBox;
}
void setEditorData(QWidget* editor, const QModelIndex& index) const override {
QComboBox* comboBox = qobject_cast<QComboBox*>(editor);
QString value = index.model()->data(index, Qt::EditRole).toString();
comboBox->setCurrentText(value);
}
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override {
QComboBox* comboBox = qobject_cast<QComboBox*>(editor);
model->setData(index, comboBox->currentText(), Qt::EditRole);
}
void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
editor->setGeometry(option.rect);
}
};
class CheckBoxDelegate : public QItemDelegate {
Q_OBJECT
public:
CheckBoxDelegate(QObject* parent = nullptr) : QItemDelegate(parent) {}
// 重写paint方法,用于绘制CheckBox
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
bool checked = index.model()->data(index, Qt::CheckStateRole).toBool();
QStyleOptionButton checkboxOption;
checkboxOption.state |= QStyle::State_Enabled;
checkboxOption.state |= checked ? QStyle::State_On : QStyle::State_Off;
checkboxOption.rect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxOption);
checkboxOption.rect.moveCenter(option.rect.center());
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkboxOption, painter);
}
// 重写editorEvent方法,处理鼠标点击事件
bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override {
if (event->type() == QEvent::MouseButtonRelease) {
bool checked = index.model()->data(index, Qt::CheckStateRole).toBool();
model->setData(index, !checked, Qt::CheckStateRole);
return true;
}
return QItemDelegate::editorEvent(event, model, option, index);
}
// 创建编辑器 (此方法可选,通常与自定义QCheckBox编辑器一起使用)
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
QCheckBox* checkBox = new QCheckBox(parent);
return checkBox;
}
// 将模型数据设置到编辑器
void setEditorData(QWidget* editor, const QModelIndex& index) const override {
QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor);
bool checked = index.model()->data(index, Qt::CheckStateRole).toBool();
checkBox->setChecked(checked);
}
// 将编辑器的数据存储到模型中
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override {
QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor);
model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
}
// 更新编辑器的几何布局
void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
editor->setGeometry(option.rect);
}
};
*-----------------------------------Main.h-------------------------------------------------------*
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
QStandardItemModel model(5, 2);
for (int row = 0; row < 5; ++row) {
QStandardItem* item1 = new QStandardItem();
item1->setEditable(false);
item1->setCheckable(true);
item1->setCheckState(Qt::Unchecked);
model.setItem(row, 0, item1);
QStandardItem* item2 = new QStandardItem(QString("Option 1"));
model.setItem(row, 1, item2);
}
QTableView view;
view.setModel(&model);
ComboBoxDelegate* comboBoxDelegate = new ComboBoxDelegate(&view);
view.setItemDelegateForColumn(1, comboBoxDelegate);
CheckBoxDelegate* checkBoxDelegate = new CheckBoxDelegate(&view);
view.setItemDelegateForColumn(0, checkBoxDelegate);
view.show();
return app.exec();
}