1、 QComboBox 代理
#pragma once
#include <QStyledItemDelegate>
class MyDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
MyDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const override;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#include "delegate.h"
#include <QSpinBox>
#include <QComboBox>
MyDelegate::MyDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget *MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex & index ) const
{
if(index.column() == 6) //在第六列
{
QComboBox* box = new QComboBox(parent);
box->addItems(QStringList()<<"优"<<"良"<<"差");
return box;
}
return NULL;
}
void MyDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox* box = static_cast<QComboBox*>(editor);
box->setCurrentText(value);
}
void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox* box = static_cast<QComboBox*>(editor);
model->setData(index, box->currentText(), Qt::EditRole);
}
void MyDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
2、QCheckBox代理
#ifndef CHECKDELEGATE_H
#define CHECKDELEGATE_H
#include <QStyledItemDelegate>
class CheckDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
CheckDelegate(QObject *parent = 0);
const QStyleOptionViewItem &option, const QModelIndex &index) const override;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // CHECKDELEGATE_H
#include "checkdelegate.h"
#include <QSpinBox>
#include <QComboBox>
#include <QCheckBox>
#include <QApplication>
#include <QMouseEvent>
#include <QRadioButton>
CheckDelegate::CheckDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
bool CheckDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
QRect decorationRect = option.rect;
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos()))
{
if (index.column() == 7)
{
bool data = model->data(index, Qt::UserRole).toBool();
model->setData(index, !data, Qt::UserRole);
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
void CheckDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem viewOption(option);
initStyleOption(&viewOption, index);
if (option.state.testFlag(QStyle::State_HasFocus))
viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
QStyledItemDelegate::paint(painter, viewOption, index);
if (index.column() == 7)
{
bool data = index.model()->data(index, Qt::UserRole).toBool();
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = data ? QStyle::State_On : QStyle::State_Off;
checkBoxStyle.state |= QStyle::State_Enabled;
checkBoxStyle.iconSize = QSize(20, 20);
checkBoxStyle.rect = option.rect;
QCheckBox checkBox;
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox);
}
}
3、 使用代理
#include <QApplication>
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QThread>
#include "delegate.h"
#include "checkdelegate.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/* 创建表格视图 */
QTableView *tableView = new QTableView;
/* 设置表格视图大小 */
tableView->resize(850, 400);
/* 创建数据模型 */
QStandardItemModel* model = new QStandardItemModel();
/* 设置表格标题行(输入数据为QStringList类型) */
model->setHorizontalHeaderLabels({"ID", "User Name", "City", "Classify", "Score", "Text","Level","Check"});
/* 自适应所有列,让它布满空间 */
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
MyDelegate* delegate = new MyDelegate;
tableView->setItemDelegateForColumn(6,delegate);
CheckDelegate* c = new CheckDelegate;
tableView->setItemDelegateForColumn(7,c);
/* 加载共10行数据,并每行有6列数据 */
for (int i = 0; i < 10; i++) {
/* 加载第一列(ID)数据 */
model->setItem(i, 0, new QStandardItem(QString("100%1").arg(i)));
/* 加载第二列(User Name)数据 */
model->setItem(i, 1, new QStandardItem(QString("User%1").arg(i)));
/* 加载第三列(City)数据 */
model->setItem(i, 2, new QStandardItem("Shanghai"));
/* 加载第四列(Classify)数据 */
model->setItem(i, 3, new QStandardItem("Engineer"));
/* 加载第五列(Score)数据 */
model->setItem(i, 4, new QStandardItem("80"));
/* 加载第六列(Sign)数据 */
model->setItem(i, 5, new QStandardItem("Hello world!"));
model->setItem(i, 6, new QStandardItem(""));
QStandardItem *item = new QStandardItem;
item->setData(false,1);
model->setItem(i, 7,item );
}
/* 设置表格视图数据 */
tableView->setModel(model);
/* 显示 */
tableView->show();
return a.exec();
}
4、 效果
