您的位置:首页 > 编程语言 > Qt开发

自学QT之代理Delegate

2015-12-20 00:00 405 查看
摘要: 自学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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: