自学QT之代理Delegate

createEditor

setEditorData

setModelData

这三个函数是要用到的函数。然而按F1居然不能跳转到帮助文档,这算不算bug。

下面这段代码是要实现在一个表格中添加spin控件

spinDelegate头文件:

#ifndef SPINBOXDELEGATE_H#define SPINBOXDELEGATE_H
#include <QItemDelegate>
#include <QObject>
#include <QSpinBox>


class SpinBoxDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    SpinBoxDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;

    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // SPINBOXDELEGATE_H

cpp文件

#include "spinboxdelegate.h"#include <QSpinBox>
#include <QItemDelegate>

SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
    : QItemDelegate(parent)
{

}
QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QSpinBox *editor = new QSpinBox(parent);
    editor->setRange(0,10000);
    editor->installEventFilter(const_cast<SpinBoxDelegate*>(this));
    return editor;
}

void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value = index.model()->data(index, Qt::EditRole).toInt();

    QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
    spinBox->setValue(value);
}

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QSpinBox *box = static_cast<QSpinBox*>(editor);
    int value = box->value();

    model->setData(index,value);
}

void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect); // option.rect属性中保存了条目的位置,这里将控件设置在刚好占住条目的位置
}


当然,别忘记了在窗口做一些设置

#include "widget.h"#include <QItemDelegate>
#include <QDir>
#include <QFileInfo>
#include <QFile>
#include <QFileDialog>
#include "spinboxdelegate.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QStandardItemModel *tableModel=new QStandardItemModel(4,4,this);

    SpinBoxDelegate *spinDelegate=new SpinBoxDelegate;

    tableModel->setHeaderData(0,Qt::Horizontal,tr("部门"));
    tableModel->setHeaderData(1,Qt::Horizontal,"姓名");
    tableModel->setHeaderData(2,Qt::Horizontal,"女");
    tableModel->setHeaderData(4,Qt::Horizontal,"退休");
    QTableView *tabletView=new QTableView;
    tabletView->setModel(tableModel);
    tabletView->setItemDelegateForColumn(3,spinDelegate);
    QHBoxLayout *mainLayout=new QHBoxLayout(this);
    mainLayout->addWidget(tabletView);
}


转载于:https://my.oschina.net/u/2505464/blog/548056

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值