QTreeView绑定Deleget,以及deleget样式修改

补备注:把delegate继承于QItemDelegate修改为继承QStyledItemDelegate,就能继承于父项的样式附上代码

class Delegate: public QStyledItemDelegate

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QStyleOptionViewItem viewOption(option);
	initStyleOption(&viewOption, index);
	QStyledItemDelegate::paint(painter, viewOption, index);
}

 

先上链接: 完整代码: https://download.csdn.net/download/qq_15821883/11042083

1、QTreeView 和Model和Deleget的关系,

如果吧QTreeView当做显示层,那么Model就是数据层,所有的数据全部存放在Model里面,那么Deleget里面的数据是如何设置并且显示的呢?

    原理:  当我们双击Deleget时候,QItemDelegate::createEditor(需要自己实现) 就会创建出你的对象,然后在QItemDelegate::updateEditorGeometry中去设置你想表现的大小,并且在QItemDelegate::setEditorData设置数据,当我们编辑完毕的时候QItemDelegate::setModelData,便会吧数据更新在Model中,QTreeView就会显示出来.(当我们编辑完的时候,创建出来的对象会自动的释放,我们不用担心内存问题)

2、重构QTreeView

#ifndef  CTREEVIEW_H
#define CTREEVIEW_H

#include <QTreeView>
#include <QStandardItemModel>

enum eTreeViewColumn
{
	eTeeView_Channel,			//通道号
	eTeeView_ChannelName,		//通道名称
	eTeeView_Variable,			//变量名称
	eTeeView_MinValue,			//最小值
	eTeeView_MaxValue,			//最大值
	eTeeView_MinDXM,			//DMX最小值
	eTeeView_MaxDXM,			//DMX最大值
	eTeeView_DefaultDXM,		//默认值
	eTeeView_Operate,			//操作
	_eTeeView_Count,			//总和
};

class CTreeView : public QTreeView
{
	Q_OBJECT
public:
	CTreeView(QWidget *parent = nullptr);
	~CTreeView();

	//抓取
	void startDrag(Qt::DropActions supportedActions);
	//鼠标移动判断--鼠标在当前第几行--用于Delegete设置颜色
	void mouseMoveEvent(QMouseEvent *event);
	//鼠标离开界面--用于Delegete设置颜色
	void leaveEvent(QEvent *event);
	//获取鼠标在第几行
	int getMouseIndex();

protected slots:
	//int类型Deleget编辑完成
	void onIntEditFinnished(int row, int column, int value);
	//double类型Deleget编辑完成
	void onDoubleEditFinnished(int row, int column, double value);
	//按钮类型Deleget编辑按下
	void onBtnClicked(int row, int column);

private:
	//初始化界面
	void initUI();
	//初始化数据
	void initModel(bool bEdit);
	//更新行设置
	void updateRowSetting(int nIndex, bool bEdit = false);
	//显示警告
	void showWarning(const QString &qsMsg);
	//初始化数据
	void initDate();


private:
	QStandardItemModel				*mModel;
	int								 mMouseIndex;
};


#endif // !
#include "CTreeView.h"
#include <QMouseEvent>
#include <QMessageBox>
#include "CTreeItemDeleget.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QMimeData>
#include <QDrag>

//没有这句话中文会乱码
#pragma execution_character_set("utf-8")

CTreeView::CTreeView(QWidget *parent /*= nullptr*/)
	: QTreeView(parent)
{
	setMouseTracking(true);
	this->setDragEnabled(true);
	initUI();
}

CTreeView::~CTreeView()
{

}

void CTreeView::startDrag(Qt::DropActions supportedActions)
{
	QModelIndex index = this->currentIndex();
	if (index.row() == -1)
	{
		return;
	}

	QJsonObject pValue;
	pValue.insert("eTeeView_Channel", mModel->item(index.row(), eTreeViewColumn::eTeeView_Channel)->text().toInt());
	pValue.insert("eTeeView_ChannelName", mModel->item(index.row(), eTreeViewColumn::eTeeView_ChannelName)->text());
	pValue.insert("eTeeView_Variable", mModel->item(index.row(), eTreeViewColumn::eTeeView_Channel)->text());
	pValue.insert("eTeeView_MinValue", mModel->item(index.row(), eTreeViewColumn::eTeeView_MinValue)->text().toDouble());
	pValue.insert("eTeeView_MaxValue", mModel->item(index.row(), eTreeViewColumn::eTeeView_MaxValue)->text().toDouble());
	pValue.insert("eTeeView_MinDXM", mModel->item(index.row(), eTreeViewColumn::eTeeView_MinDXM)->text().toInt());
	pValue.insert("eTeeView_MaxDXM", mModel->item(index.row(), eTreeViewColumn::eTeeView_MaxDXM)->text().toInt());
	pValue.insert("eTeeView_DefaultDXM", mModel->item(index.row(), eTreeViewColumn::eTeeView_DefaultDXM)->text().toInt());

	QByteArray itemData;
	itemData = QJsonDocument(pValue).toJson();

	QMimeData *mimeData = new QMimeData;
	mimeData->setData("CTreeView", itemData);

	QDrag *drag = new QDrag(this);
	drag->setMimeData(mimeData);

	drag->exec(Qt::CopyAction | Qt::MoveAction);
}

void CTreeView::mouseMoveEvent(QMouseEvent *event)
{
	QModelIndex index = indexAt(event->pos());
	mMouseIndex = index.row();
	QTreeView::mouseMoveEvent(event);
}

void CTreeView::leaveEvent(QEvent *event)
{
	mMouseIndex = -1;
	QTreeView::leaveEvent(event);
}

int CTreeView::getMouseIndex()
{
	return mMouseIndex;
}

void CTreeView::onIntEditFinnished(int row, int column, int value)
{
	int oldValue = mModel->item(row, column)->text().toInt();
	if (value == oldValue)
	{
		return;
	}
	//通道这里允许编辑--可以
	if (column == eTreeViewColumn::eTeeView_Channel)
	{
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_Channel), value);
	}

	if (column == eTreeViewColumn::eTeeView_MinDXM)
	{
		int maxDxm = mModel->item(row, eTreeViewColumn::eTeeView_MaxValue)->text().toInt();
		if (maxDxm < value)
		{
			showWarning("最小值大于最大值");
			return;
		}
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_MinDXM), value);

		int default = mModel->item(row, eTreeViewColumn::eTeeView_DefaultDXM)->text().toInt();
		if (default < value)
		{
			mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_DefaultDXM), default);
		}
	}
	else if (column == eTreeViewColumn::eTeeView_MaxDXM)
	{
		int minDxm = mModel->item(row, eTreeViewColumn::eTeeView_MinDXM)->text().toInt();
		if (minDxm > value)
		{
			showWarning("最大值小于最小值");
			return;
		}
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_MaxDXM), value);

		int default = mModel->item(row, eTreeViewColumn::eTeeView_DefaultDXM)->text().toInt();
		if (default > value)
		{
			mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_DefaultDXM), default);
		}
	}
	else if (column == eTreeViewColumn::eTeeView_DefaultDXM)
	{
		int minDxm = mModel->item(row, eTreeViewColumn::eTeeView_MinDXM)->text().toInt();
		int maxDxm = mModel->item(row, eTreeViewColumn::eTeeView_MaxValue)->text().toInt();
		if (value < minDxm || value > maxDxm)
		{
			showWarning(tr("默认值不在范围中"));
			return;
		}
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_DefaultDXM), value);
	}
}

void CTreeView::onDoubleEditFinnished(int row, int column, double value)
{
	double oldValue = mModel->item(row, column)->text().toDouble();
	if (value == oldValue)
	{
		return;
	}

	if (column == eTreeViewColumn::eTeeView_MinValue)
	{
		double maxValue = mModel->item(row, eTreeViewColumn::eTeeView_MaxDXM)->text().toDouble();
		if (maxValue < value)
		{
			showWarning(tr("最小值大于最大值"));
			return;
		}
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_MinValue), value);
	}
	else if (column == eTreeViewColumn::eTeeView_MaxDXM)
	{
		int minValue = mModel->item(row, eTreeViewColumn::eTeeView_MinValue)->text().toDouble();
		if (minValue > value)
		{
			showWarning(tr("最大值小于最小值"));
			return;
		}
		mModel->setData(mModel->index(row, eTreeViewColumn::eTeeView_MaxDXM), value);
	}
}

void CTreeView::onBtnClicked(int row, int column)
{
	//这里没做处理,用户可以直接做处理
}

void CTreeView::initUI()
{
	mModel = new QStandardItemModel(this);
	this->setModel(mModel);

	mModel->setColumnCount(eTreeViewColumn::_eTeeView_Count);
	mModel->setHeaderData(eTreeViewColumn::eTeeView_Channel, Qt::Horizontal, tr("通道"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_ChannelName, Qt::Horizontal, tr("功能名称"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_Variable, Qt::Horizontal, tr("变量名称"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_MinValue, Qt::Horizontal, tr("最小值"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_MaxValue, Qt::Horizontal, tr("最大值"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_MinDXM, Qt::Horizontal, tr("DMX最小值"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_MaxDXM, Qt::Horizontal, tr("DMX最大值"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_DefaultDXM, Qt::Horizontal, tr("DMX默认值"));
	mModel->setHeaderData(eTreeViewColumn::eTeeView_Operate, Qt::Horizontal, tr("操作"));

	this->setColumnWidth(eTreeViewColumn::eTeeView_Channel, 75);
	this->setColumnWidth(eTreeViewColumn::eTeeView_ChannelName, 80);
	this->setColumnWidth(eTreeViewColumn::eTeeView_Variable, 80);
	this->setColumnWidth(eTreeViewColumn::eTeeView_MinValue, 80);
	this->setColumnWidth(eTreeViewColumn::eTeeView_MaxValue, 80);
	this->setColumnWidth(eTreeViewColumn::eTeeView_MinDXM, 85);
	this->setColumnWidth(eTreeViewColumn::eTeeView_MaxDXM, 85);
	this->setColumnWidth(eTreeViewColumn::eTeeView_DefaultDXM, 85);
	this->setColumnWidth(eTreeViewColumn::eTeeView_Operate, 50);

	//通道号范围为0-512
	CTreeItemDeleget *deleget1 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_Channel, ItemDelegateType::ItemDelegate_Int, this);
	deleget1->setRange(0, 512);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_Channel, deleget1);
	connect(deleget1, &CTreeItemDeleget::intEditingFinished, this, &CTreeView::onIntEditFinnished);

	//最小值范围为-9999-9999 且不能大于最大值
	CTreeItemDeleget *deleget2 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_MinValue, ItemDelegateType::ItemDelegate_Double, this);
	deleget2->setRange(-9999, 9999);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_MinValue, deleget2);
	connect(deleget2, &CTreeItemDeleget::doubleEditingFinished, this, &CTreeView::onDoubleEditFinnished);

	//最大值范围为-9999-9999 且不能小于最小值
	CTreeItemDeleget *deleget3 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_MaxValue, ItemDelegateType::ItemDelegate_Double, this);
	deleget3->setRange(-9999, 9999);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_MaxValue, deleget3);
	connect(deleget3, &CTreeItemDeleget::doubleEditingFinished, this, &CTreeView::onDoubleEditFinnished);

	//DMX最小值范围0-255 且不能大于最大值,当最小值小于默认值,应该吧默认值修改为最小值
	CTreeItemDeleget *deleget4 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_MinDXM, ItemDelegateType::ItemDelegate_Int, this);
	deleget4->setRange(0, 255);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_MinDXM, deleget4);
	connect(deleget4, &CTreeItemDeleget::intEditingFinished, this, &CTreeView::onIntEditFinnished);

	//DMX最大值范围0-255 且不能小于最小值,当最大值小于默认值,应该吧默认值修改为最大值
	CTreeItemDeleget *deleget5 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_MaxDXM, ItemDelegateType::ItemDelegate_Int, this);
	deleget5->setRange(0, 255);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_MaxDXM, deleget5);
	connect(deleget5, &CTreeItemDeleget::intEditingFinished, this, &CTreeView::onIntEditFinnished);

	//DMX默认值范围0-255 且不能大于于最大值,小于最小值
	CTreeItemDeleget *deleget6 = new CTreeItemDeleget(eTreeViewColumn::eTeeView_DefaultDXM, ItemDelegateType::ItemDelegate_Int, this);
	deleget6->setRange(0, 255);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_DefaultDXM, deleget6);
	connect(deleget6, &CTreeItemDeleget::intEditingFinished, this, &CTreeView::onIntEditFinnished);

	//按钮类型
	CTreeItemButtonDeleget *deleget7 = new CTreeItemButtonDeleget(eTreeViewColumn::eTeeView_Operate, this);
	setItemDelegateForColumn(eTreeViewColumn::eTeeView_Operate, deleget7);
	connect(deleget7, &CTreeItemButtonDeleget::btnClicked, this, &CTreeView::onBtnClicked);

	//初始化数据
	initDate();
}


void CTreeView::initModel(bool bEdit)
{
	mModel = new QStandardItemModel(this);
	this->setModel(mModel);
}

void CTreeView::updateRowSetting(int nIndex, bool bEdit /*= false*/)
{
	if (nIndex >= 0 && nIndex < mModel->rowCount())
	{
		mModel->item(nIndex, eTreeViewColumn::eTeeView_Channel)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_Channel)->setEditable(false);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_ChannelName)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_ChannelName)->setEditable(false);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_Variable)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_Variable)->setEditable(false);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MinValue)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MinValue)->setEditable(bEdit);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MaxValue)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MaxValue)->setEditable(bEdit);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MinDXM)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MinDXM)->setEditable(bEdit);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MaxDXM)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_MaxDXM)->setEditable(bEdit);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_DefaultDXM)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
		mModel->item(nIndex, eTreeViewColumn::eTeeView_DefaultDXM)->setEditable(bEdit);
	}
}

void CTreeView::showWarning(const QString &qsMsg)
{
	QMessageBox::warning(this, tr("错误"), qsMsg);
}

void CTreeView::initDate()
{
	int index = mModel->rowCount();
	mModel->insertRow(index);

	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Channel), 1);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_ChannelName), "光照");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Variable), "light");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinValue), QString::number(0, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxValue), QString::number(100, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinDXM), 0);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxDXM), 255);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_DefaultDXM), 0);
	updateRowSetting(index, true);

	index = mModel->rowCount();
	mModel->insertRow(index);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Channel), 2);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_ChannelName), "红色");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Variable), "red");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinValue), QString::number(0, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxValue), QString::number(100, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinDXM), 25);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxDXM), 255);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_DefaultDXM), 50);
	updateRowSetting(index, true);

	index = mModel->rowCount();
	mModel->insertRow(index);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Channel), 3);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_ChannelName), "绿色");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_Variable), "green");
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinValue), QString::number(0, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxValue), QString::number(100, 'f', 2));
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MinDXM), 25);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_MaxDXM), 255);
	mModel->setData(mModel->index(index, eTreeViewColumn::eTeeView_DefaultDXM), 90);
	updateRowSetting(index, true);


	this->setCurrentIndex(mModel->index(0, 0));
}

3、Delegete

#ifndef CTREEITEMDELEGET_H
#define CTREEITEMDELEGET_H
#include <QItemDelegate>

enum ItemDelegateType
{
	ItemDelegate_Int,			//int 类型
	ItemDelegate_Double,		//double 类型
};

class CTreeItemDeleget : public QItemDelegate
{
	Q_OBJECT
public:
	CTreeItemDeleget(int column, ItemDelegateType type = ItemDelegateType::ItemDelegate_Int, QObject *parent = nullptr);
	~CTreeItemDeleget();

	//设置控件范围
	void setRange(int min, int max);
	//获取控件
	QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
	//设置控件数据
	void setEditorData(QWidget *editor, const QModelIndex &index) const;
	//编辑完成给Model设置数据
	void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
	//更新控件范围
	void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
	//绘制界面样式
	void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

signals:
	void intEditingFinished(int row, int column, int value) const;
	void doubleEditingFinished(int row, int column, double value) const;

private:
	int												mMin;
	int												mMax;
	int												mColumn;
	mutable double									mValue;
	ItemDelegateType								mType;
};


class CTreeItemButtonDeleget : public QItemDelegate
{
	Q_OBJECT
public:
	CTreeItemButtonDeleget(int column, QWidget * parent = 0);
	~CTreeItemButtonDeleget();

	//绘制界面样式
	void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
	//处理点击事件
	bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);

signals:
	void btnClicked(int row, int column);

private:
	QMap<QModelIndex, QStyleOptionButton*>			mBtns;
	int												mColumn;
	bool											mClicked;
};


#endif
#include "CTreeItemDeleget.h"
#include <QSpinBox>
#include "CTreeView.h"
#include <QPainter>
#include <QApplication>
#include <QMouseEvent>

CTreeItemDeleget::CTreeItemDeleget(int column, ItemDelegateType type, QObject *parent)
	: QItemDelegate(parent)
	, mType(type)
	, mMin(0)
	, mMax(100)
	, mValue(0)
	, mColumn(column)
{

}

CTreeItemDeleget::~CTreeItemDeleget()
{

}

void CTreeItemDeleget::setRange(int min, int max)
{
	mMin = min;
	mMax = max;
}

QWidget * CTreeItemDeleget::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	switch (mType)
	{
	case ItemDelegate_Int:
	{
		QSpinBox *editor = new QSpinBox(parent);
		editor->setMinimum(mMin);
		editor->setMaximum(mMax);
		editor->show();

		connect(editor, SIGNAL(commitData(QWidget *)), this, SIGNAL(commitData(QWidget *)));
		connect(editor, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)),
			this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)));

		return editor;
	}
	case ItemDelegate_Double:
	{
		QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
		editor->setMinimum(mMin);
		editor->setMaximum(mMax);
		editor->show();

		connect(editor, SIGNAL(commitData(QWidget *)), this, SIGNAL(commitData(QWidget *)));
		connect(editor, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)),
			this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)));

		return editor;
	}
	default:
		break;
	}
}

void CTreeItemDeleget::setEditorData(QWidget *editor, const QModelIndex &index) const
{
	switch (mType)
	{
	case ItemDelegate_Int:
	{
		int value = index.model()->data(index, Qt::EditRole).toInt();
		QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
		mValue = index.model()->data(index).toInt();
		spinBox->setValue(value);
		break;
	}
	case ItemDelegate_Double:
	{
		double value = index.model()->data(index, Qt::EditRole).toDouble();
		QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
		mValue = index.model()->data(index).toDouble();
		spinBox->setValue(value);
		break;
	}
	default:
		break;
	}
}

void CTreeItemDeleget::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
	switch (mType)
	{
	case ItemDelegate_Int:
	{
		QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
		spinBox->interpretText();
		int value = spinBox->value();
		mValue = spinBox->value();
		emit intEditingFinished(index.row(), mColumn, mValue);
		//需要判断值的合法性,因此model的值交给外部去修改
		//model->setData(index, value, Qt::EditRole);
		break;
	}
	case ItemDelegate_Double:
	{
		QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
		spinBox->interpretText();
		double value = spinBox->value();
		mValue = spinBox->value();
		emit doubleEditingFinished(index.row(), mColumn, mValue);
		//需要判断值的合法性,因此model的值交给外部去修改
		//model->setData(index, QString::number(value, 'f', 2), Qt::EditRole);
		break;
	}
	default:
		break;
	}
}

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

void CTreeItemDeleget::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QString qsText = index.model()->data(index, Qt::EditRole).toString();
	int row = index.row();
	CTreeView *widget = static_cast<CTreeView*>(this->parent());
	if (widget)
	{
		int treeRow = widget->currentIndex().row();
		if (widget->getMouseIndex() != -1 && widget->getMouseIndex() == row)
		{
			painter->fillRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height() - 1, QColor(102, 102, 102));
			painter->setPen(Qt::white);
			painter->drawText(option.rect.x() + 3, option.rect.y(), option.rect.width(), option.rect.height() - 1, Qt::AlignVCenter | Qt::AlignLeft, qsText);
			return;
		}
		else if (treeRow == row)
		{
			painter->fillRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height() - 1, QColor(0, 114, 157));
			painter->setPen(Qt::white);
			painter->drawText(option.rect.x() + 3, option.rect.y(), option.rect.width(), option.rect.height() - 1, Qt::AlignVCenter | Qt::AlignLeft, qsText);
			return;
		}
	}
	QItemDelegate::paint(painter, option, index);
}

CTreeItemButtonDeleget::CTreeItemButtonDeleget(int column, QWidget * parent)
	: QItemDelegate(parent)
	, mColumn(column)
	, mClicked(false)
{

}

CTreeItemButtonDeleget::~CTreeItemButtonDeleget()
{

}

void CTreeItemButtonDeleget::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
	QStyleOptionButton *btn = mBtns.value(index);
	if (nullptr == btn)
	{
		btn = new QStyleOptionButton();
		btn->text = "+";

		btn->state |= QStyle::State_Enabled;
		(const_cast<CTreeItemButtonDeleget *>(this))->mBtns.insert(index, btn);
	}
	btn->rect = option.rect;
	painter->save();
	if (option.state & QStyle::State_Selected)
	{
		painter->fillRect(option.rect, option.palette.highlight());

	}
	painter->restore();
	QApplication::style()->drawControl(QStyle::CE_PushButton, btn, painter);
}

bool CTreeItemButtonDeleget::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
	if (event->type() == QEvent::MouseButtonPress)
	{
		QMouseEvent* e = (QMouseEvent*)event;
		if (e && e->button() == Qt::LeftButton)
		{
			if (option.rect.contains(e->x(), e->y()) && mBtns.contains(index))
			{
				mBtns.value(index)->state |= QStyle::State_Sunken;
				mClicked = true;
			}
		}
	}
	if (event->type() == QEvent::MouseButtonRelease)
	{
		QMouseEvent* e = (QMouseEvent*)event;
		if (e && e->button() == Qt::LeftButton)
		{
			if (option.rect.contains(e->x(), e->y()) && mBtns.contains(index) && mClicked)
			{
				mBtns.value(index)->state &= (~QStyle::State_Sunken);
				{
					emit btnClicked(index.row(), mColumn);
				}
			}
		}
	}
	if (event->type() == QEvent::MouseButtonDblClick)   //双击需要屏蔽掉--应为没有delege-createEditor 没实现
	{
		return true;
	}
	return false;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值