自定义委托QStyledItemDelegate-表格双击出现下拉框进行编辑

承接上一篇QTableView实现表格显示:https://blog.csdn.net/zsq1294110449/article/details/110198036

类似于EXECL的双击可以出现下拉框,以下代码是在表格中实现双击出现下拉框的功能,实现效果如下图:

自定义委托QStyledItemDelegate-表格双击出现下拉框进行编辑_第1张图片

在CStudioTableModel::data中添加以下代码:

   case Qt::UserRole:
        switch (nCol)
        {
        case 4:
            return m_lstData[nRow].bMan;
            break;
        }
        break;

CStudioTableModel添加函数flag,因为QtableView默认是无法编辑的,在函数flag中设置可以设置item是否可以编辑

Qt::ItemFlags CStudioTableModel::flags(const QModelIndex &index) const
{
    if(index.column() == 4)
    {
        return QAbstractTableModel::flags(index)|Qt::ItemIsEditable;
    }

    return QAbstractTableModel::flags(index);
}

以上代码添加完毕之后,开始写委托代码

#include 
#include 
class CComboBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
        CComboBoxDelegate(QObject *parent = 0);
    ~CComboBoxDelegate();

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
        const QModelIndex &index) const Q_DECL_OVERRIDE;
    void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
        const QModelIndex &index) const Q_DECL_OVERRIDE;
};

CComboBoxDelegate::CComboBoxDelegate(QObject *parent /*= 0*/) :QStyledItemDelegate(parent)
{

}

CComboBoxDelegate::~CComboBoxDelegate()
{

}

QWidget * CComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const
{
    QComboBox* pComboBox = new QComboBox(parent);
    pComboBox->addItems(QStringList()<<"Male"<<"female");
    return pComboBox;
}

void CComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QComboBox *pComboBox = qobject_cast(editor);
    bool bMan = index.model()->data(index, Qt::UserRole).toBool();
    if(bMan)
    {
        pComboBox->setCurrentIndex(0);
    }
    else
    {
        pComboBox->setCurrentIndex(1);
    }
}

void CComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const
{
    QComboBox *pComboBox = qobject_cast(editor);
    bool bMan = pComboBox->currentIndex() == 0;
    model->setData(index, bMan, Qt::EditRole);
}

以上的委托只能是在item可编辑的时候才能触发委托的createEditor函数,所以model中flag函数必须设置第四列是可以编辑的状态,否则无法实现双击出现下拉框的功能。

你可能感兴趣的:(Qt进阶开发)