补备注:把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;
}