Qt delgate的使用

1.自定義的delegate繼承自QItemDelegate

2.必須重載的一些函數:

             //返回一個編輯控件,用來編輯指定項的數據
       (1)  QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;

             //將Model中數據賦值到控件上  
       (2)  void setEditorData(QWidget *editor, const QModelIndex &index) const;

             //設定模型數據,根據指定項中對應編輯控件的數據
       (3)  void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;

             //更新編輯框幾何形狀
       (4)  void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;

 

下面展示了三種類型的代理使用

main.cpp

#include <QtWidgets/QApplication>
#include <QStandardItemModel>
#include <QTableView>

#include "ComboDelegate.h"
#include "DateDelegate.h"
#include "SpinDelegate.h"

#pragma execution_character_set("utf-8")

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //構建一個4行,4列的項模型 
	QStandardItemModel model(4, 4);
	QTableView tableView;
    //綁定模型  
	tableView.setModel(&model);

    //聲明一個委託
	DateDelegate dateDelegate;
	tableView.setItemDelegateForColumn(1, &dateDelegate);	//表格第一列安裝代理

	ComboDelegate comboDelegate;
	tableView.setItemDelegateForColumn(2, &comboDelegate);

	SpinDelegate spinDelegate;
	tableView.setItemDelegateForColumn(3, &spinDelegate);


	model.setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
	model.setHeaderData(1, Qt::Horizontal, QObject::tr("Birthday"));
	model.setHeaderData(2, Qt::Horizontal, QObject::tr("Job"));
	model.setHeaderData(3, Qt::Horizontal, QObject::tr("Income"));

	//賦值
	for (int row = 0; row < 2; row++)
	{
		model.setData(model.index(row, 0, QModelIndex()), "張三");
		model.setData(model.index(row, 1, QModelIndex()), "1992-10-15");
		model.setData(model.index(row, 2, QModelIndex()), "律師");
		model.setData(model.index(row, 3, QModelIndex()), "20W");
	}

	QString data = model.data(model.index(0, 1, QModelIndex())).toString();

	tableView.setWindowTitle(QObject::tr("Delegate"));
	tableView.show();

    return a.exec();
}

DateDelegate.h

#include <QItemDelegate>

class DateDelegate : public QItemDelegate
{
	Q_OBJECT

public:
	DateDelegate(QObject *parent = 0);
	~DateDelegate();

	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;
};

DateDelegate.cpp

#include "DateDelegate.h"
#include <QDateTimeEdit>

DateDelegate::DateDelegate(QObject *parent)
	: QItemDelegate(parent)
{
}

DateDelegate::~DateDelegate()
{
}

QWidget * DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QDateTimeEdit *editor = new QDateTimeEdit(parent);
	editor->setDisplayFormat("yyyy-mm-dd");
	editor->setCalendarPopup(true);
	editor->installEventFilter(const_cast<DateDelegate *>(this));

	return editor;
}

void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
	QString dataStr = index.model()->data(index).toString();
	QDate date = QDate::fromString(dataStr, Qt::ISODate);

	QDateTimeEdit *edit = static_cast<QDateTimeEdit *>(editor);
	edit->setDate(date);
}

void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	QDateTimeEdit *edit = static_cast<QDateTimeEdit *>(editor);
	QDate date = edit->date();
	model->setData(index, QVariant(date.toString(Qt::ISODate)));
}

void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	editor->setGeometry(option.rect);
}

ComboDelegate.h

#include <QItemDelegate>

class ComboDelegate : public QItemDelegate
{
	Q_OBJECT

public:
	ComboDelegate(QObject *parent = 0);
	~ComboDelegate();

	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;
};

ComboDelegate.cpp

#include "ComboDelegate.h"
#include <QComboBox>

ComboDelegate::ComboDelegate(QObject *parent)
	: QItemDelegate(parent)
{
}

ComboDelegate::~ComboDelegate()
{
}

QWidget * ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QComboBox *editor = new QComboBox(parent);
	editor->addItem(QString::fromLocal8Bit("工人"));
	editor->addItem(QString::fromLocal8Bit("農民"));
	editor->addItem(QString::fromLocal8Bit("醫生"));
	editor->addItem(QString::fromLocal8Bit("律師"));
	editor->addItem(QString::fromLocal8Bit("軍人"));
	editor->installEventFilter(const_cast<ComboDelegate *>(this));

	return editor;
}

void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
	QString str = index.model()->data(index).toString();

	QComboBox *box = static_cast<QComboBox*>(editor);
	int i = box->findText(str);
	box->setCurrentIndex(i);
}

void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	QComboBox *box = static_cast<QComboBox*>(editor);
	QString str = box->currentText();


	model->setData(index, str);
}

void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	editor->setGeometry(option.rect);
}

SpinDelegate.h

#include <QItemDelegate>

class SpinDelegate : public QItemDelegate
{
	Q_OBJECT

public:
	SpinDelegate(QObject *parent = 0);
	~SpinDelegate();

	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;
};

SpinDelegate.cpp

#include "SpinDelegate.h"
#include <QSpinBox>

SpinDelegate::SpinDelegate(QObject *parent)
	: QItemDelegate(parent)
{
}

SpinDelegate::~SpinDelegate()
{
}

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


	return editor;
}

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


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

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


	model->setData(index, value);
}

void SpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	editor->setGeometry(option.rect);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章