QTableWidget实现QComboBox的代理且发送信号实现联动

.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

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值