自學QT之代理Delegate

createEditor函數

setEditorDatathis

setModelDataspa

這三個函數是要用到的函數。然而按F1竟然不能跳轉到幫助文檔,這算不算bug。code

下面這段代碼是要實如今一個表格中添加spin控件
文檔

spinDelegate頭文件:get

#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文件it

#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屬性中保存了條目的位置,這裏將控件設置在恰好佔住條目的位置
}


固然,別忘記了在窗口作一些設置io

#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);
}
相關文章
相關標籤/搜索