.h 文件
class GComboxDelegate : public QItemDelegate
{
Q_OBJECT
public:
GComboxDelegate(QObject * parent = nullptr);
~GComboxDelegate();
//编辑单元格时调用函数
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
//取单元格里面的内容更新QComboBox的值
void setEditorData(QWidget *editor, const QModelIndex &index) const;
//QComboBox的值设置到单元格中,在这里面可以发送消息
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
signals:
void OnEmitCurrentIndexChangeSignal(int iRow, int iColumn , int iId ) const; //定义消息必须有const
private:
};
.cpp中
//编辑单元格时调用函数
QWidget *GComboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if ( index.isValid() && index.column() == 1 ) // 1 代表列
{
QComboBox *editor = new QComboBox(parent); //创建QComboBox
editor->setEditable(true);
editor->installEventFilter(const_cast<GComboxDelegate *>(this));
return editor;
}
else
{
return QItemDelegate::createEditor(parent, option, index);
}
}
//取单元格里面的内容更新QComboBox的值
void GComboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if ( index.isValid() && index.column() == 1) // 1 代表列
{
QString value = index.model()->data(index, Qt::DisplayRole).toString(); //取单元格内容更新QComBoBox
QComboBox *combox = static_cast<QComboBox *>(editor);
combox->addItem( "男" ); //QComboBox中增加可选项
combox->setItemData(0, 1,Qt::UserRole); //增加附加数据
combox->addItem( "女" ); //QComboBox中增加可选项
combox->setItemData(1, 1,Qt::UserRole); //增加附加数据
combox->setCurrentText(value); //设置选择项
}
else
{
QItemDelegate::setEditorData(editor, index);
}
}
//QComboBox的值设置到单元格中,在这里面可以发送消息
void GComboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
if ( index.isValid() && index.column() == 1 ) //1代表列
{
QComboBox *combox = static_cast<QComboBox *>(editor);
model->setData(index, combox->currentText(), Qt::DisplayRole); //设置单元格内容
int iType= combox->currentData(Qt::UserRole).toInt(); //取出当前选中的QComboBox的附加数据
model->setData(index, iType, Qt::UserRole); //设置单元格附加数据
emit OnEmitCurrentIndexChangeSignal(index.row(),index.column(), iType); //发送信号,实现其它联动更新
else
{
QItemDelegate::setModelData(editor, model, index);
}
}
//使用代理
GComboxDelegate IdentityType = new GComboxDelegate(this); //定义变量
ui->tableWidget->setItemDelegateForColumn(1, IdentityType ); //第一列设置代理
connect(IdentityType , SIGNAL(OnEmitCurrentIndexChangeSignal(int,int,int)), this, SLOT(OnIndexChangeSlot(int,int,int))); //绑定信号槽函数,在槽函数中处理联动信息。
//槽函数定义
public slots:
void OnIndexChangeSlot(int iRow,int iColumn,int iType); //可不加const