目录
一、前言
本例介绍在表格内添加控件的方法,建议结合我上一篇博客《QAbstractTableModel表格制作简单解析》一起看。
二、效果展示
三、源码解析
CButtonDelegate.h
#ifndef CBUTTONDELEGATE_H
#define CBUTTONDELEGATE_H
#include <QItemDelegate>
#include <QStringList>
/*管理table里的自定义控件*/
class CButtonDelegate : public QItemDelegate
{
Q_OBJECT
public:
CButtonDelegate(QObject * parent=0);
~CButtonDelegate();
//返回一个编辑控件, 用来编辑指定项的数据
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
//界面选中, 将Model中数据赋值到控件上
void setEditorData(QWidget *editor, const QModelIndex &index) const;
//设置model的值
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
private:
//虚拟值
QStringList m_list;
};
#endif // CBUTTONDELEGATE_H
CButtonDelegate.cpp
#include "CButtonDelegate.h"
#include <QComboBox>
#include <QDebug>
#include <QTextCodec>
CButtonDelegate::CButtonDelegate(QObject * parent):QItemDelegate(parent)
{
m_list << ("Martin")
<< ("Thomas")
<< ("Joy");
}
CButtonDelegate::~CButtonDelegate()
{
}
QWidget * CButtonDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)const
{
QComboBox* combox = new QComboBox(parent);
combox->addItems(m_list);
return combox;
}
void CButtonDelegate::setEditorData(QWidget *editor, const QModelIndex &index)const
{
QString sValue = index.model()->data(index, Qt::EditRole).toString();
int i = 0;
for(; i < m_list.count(); i++)
{
if(sValue.compare(m_list.at(i)) == 0)
{
break;
}
}
QComboBox *combox = static_cast<QComboBox*>(editor);
combox->setCurrentIndex(i);
}
void CButtonDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)const
{
QComboBox *combox = static_cast<QComboBox*>(editor);
QString sValue = combox->currentText();
model->setData(index, sValue, Qt::EditRole);
}
void CButtonDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)const
{
editor->setGeometry(option.rect);
}
四、Demo
另附Demo供大家参考(百度云盘):
链接: https://pan.baidu.com/s/1ymFpHvrO3U4UgtO4SWYHAA 提取码: mh7b