Qt的Model-Deletage委托代理机制

文章详细介绍了Qt中的委托机制如何在模型/视图架构中定制数据编辑和显示,涉及编辑器创建、数据绑定、事件处理和外观定制,以QTableView为例,展示了如何使用自定义委托类进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 委托是Qt中的一种机制,用于在Qt模型/视图架构中处理特定类型的数据。委托提供了一种方便的方法来定制特定类型的数据的显示和编辑。
  • 委托可以做以下事情:

编辑特定类型的数据: 通过创建编辑器来编辑特定类型的数据,例如日期,数值等。
渲染特定类型的数据: 通过定制单元格的外观来渲染特定类型的数据,例如颜色,字体等;
支持不同类型的编辑器: 支持不同类型的编辑器,例如文本编辑器,下拉列表编辑器等;
处理编辑器的事件: 通过实现eventFilter()方法来处理编辑器的事件,如键盘事件;
更新编辑器的尺寸: 通过实现sizeHint()方法来更新编辑器的尺寸;
数据验证: 通过实现editorEvent()来验证编辑器中的数据是否合法。

  • 委托的常见应用场景包括:

表格和列表视图: 在表格和列表视图中使用委托可以方便地编辑单元格中的数据,并定制单元格的外观
属性编辑器: 使用委托可以创建自定义属性编辑器来编辑特定类型的属性
文件对话框: 使用委托可以定制文件对话框中的文件列表的外观

以QTableView为例子:

  1. 需要为QTableView设置一个model
  • 也可以自定义model,继承QStandardItemModel;
  1. 为QTableView设置Delegate
  • 继承QStandardItemModel、QItemDelegate或者QStyledItemDelegate;
  • QItemDelegate是QAbstractItemDelegate的子类,它提供了一种通用的委托类;
  • QStyledItemDelegate是QItemDelegate的子类,它使用Qt Style Sheets来渲染单元格中的数据,这样可以更好地与应用程序的外观保持一致。它还提供了一些额外的功能,如支持自定义编辑器和支持编辑器工厂,这样可以更好地管理编辑器;
  1. 委托类需要重写对应的函数,比如:
  1. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
  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;
  5. void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex & index) const;
  6. QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const;
  7. bool eventFilter(QObject *object, QEvent *event) ;
  8. bool editorEvent(QEvent *event, QAbstractItemModel *model,
    const QStyleOptionViewItem &option, const QModelIndex &index) override;

具体以QTableView为例子,通过使用QAbstractTableModel、QStyledItemDelegate实现一个自定义的TableView,
代码如下:
代码中用到的关于表格头的枚举

namespace CustomTableData 
{
	enum class FormulateTimeTable 
	{
		check=0,name,modifyTime,mark
	};

	enum class FormulateDataType
	{
		check = 0, type, level, area
	};
};

代码中用到的数据结构

#include <QObject>
#include <QString>
class GSFormulateData;
class GSFormulateTableData  : public QObject
{
	Q_OBJECT
	
	Q_PROPERTY(QString name READ Name WRITE SetName)
	Q_PROPERTY(QString modify_time READ ModifyTime WRITE SetModifyTime)
	Q_PROPERTY(QString mark READ Mark WRITE SetMark)
public:
	explicit GSFormulateTableData(QObject *parent = nullptr);
	virtual ~GSFormulateTableData();
public:
	void SetName(QString name);
	void SetModifyTime(QString time);
	void SetMark(QString mark);
	void SetCheck(bool check);
	void SetFormulateDataList(QList<GSFormulateData*>);
	QString Name()const;
	QString ModifyTime()const;
	QString Mark()const;
	bool IsCheck()const;
	QList<GSFormulateData*> FormulateDataList()const;
private:
	bool m_check_status;
	QString m_table_name;
	QString m_table_modify_time;
	QString m_table_mark;
	QList<GSFormulateData*> m_formulate_data_list;
};

class GSFormulateData :public QObject 
{
	Q_OBJECT

	Q_PROPERTY(QString defectType READ DefectType WRITE SetDefectType)
	Q_PROPERTY(QString confidenceLevel READ ConfidenceLevel WRITE SetConfidenceLevel)
	Q_PROPERTY(QString defectArea READ DefectArea WRITE SetDefectArea)

public:
	explicit GSFormulateData(QObject* parent = nullptr);
	virtual ~GSFormulateData();
public:
	void SetDefectType(QString);
	void SetConfidenceLevel(QString );
	void SetDefectArea(QString );
	void SetCheck(bool);
	QString DefectType()const;
	QString ConfidenceLevel()const;
	QString DefectArea()const;
	bool IsCheck()const;
private:
	bool m_check_status;
	QString m_defect_type;
	QString m_confidence_level;
	QString m_defect_area;
};

数据结构的实现

#include "GSFormulateTableData.h"

GSFormulateTableData::GSFormulateTableData(QObject *parent): QObject(parent)
{}

GSFormulateTableData::~GSFormulateTableData()
{}

void GSFormulateTableData::SetName(QString name)
{
	this->m_table_name = name;
}

void GSFormulateTableData::SetModifyTime(QString time)
{
	this->m_table_modify_time = time;
}

void GSFormulateTableData::SetMark(QString mark)
{
	this->m_table_mark = mark;
}

void GSFormulateTableData::SetCheck(bool check)
{
	this->m_check_status = check;
}

void GSFormulateTableData::SetFormulateDataList(QList<GSFormulateData*> list)
{
	this->m_formulate_data_list = list;
}

QString GSFormulateTableData::Name()const
{
	return this->m_table_name;
}

QString GSFormulateTableData::ModifyTime()const
{
	return this->m_table_modify_time;
}

QString GSFormulateTableData::Mark()const
{
	return this->m_table_mark;
}

bool GSFormulateTableData::IsCheck() const
{
	return this->m_check_status;
}

QList<GSFormulateData*> GSFormulateTableData::FormulateDataList() const
{
	return this->m_formulate_data_list;
}


GSFormulateData::GSFormulateData(QObject* parent):QObject(parent)
{

}

GSFormulateData::~GSFormulateData()
{
}

void GSFormulateData::SetDefectType(QString type)
{	
	this->m_defect_type = type;	
}

void GSFormulateData::SetConfidenceLevel(QString level)
{
	this->m_confidence_level = level;
}

void GSFormulateData::SetDefectArea(QString area)
{
	this->m_defect_area = area;
}

void GSFormulateData::SetCheck(bool check)
{
	this->m_check_status = check;
}

QString GSFormulateData::DefectType() const
{
	return this->m_defect_type;
}

QString GSFormulateData::ConfidenceLevel() const
{
	return this->m_confidence_level;
}

QString GSFormulateData::DefectArea() const
{
	return this->m_defect_area;
}

bool GSFormulateData::IsCheck() const
{
	return this->m_check_status;
}

下面是模型和代理的实现
GSFormulateTableModel.h

#include <QObject>
#include <QAbstractTableModel>
#include <QList>
#include <QVariant>
#include <QModelIndex>
#include "GSFormulateTableData.h"
class GSFormulateTableModel  : public QAbstractTableModel
{
	Q_OBJECT

public:
	explicit GSFormulateTableModel(QObject *parent = nullptr);
	virtual ~GSFormulateTableModel();
public:
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    int rowCount(const QModelIndex& parent = QModelIndex()) const override;
    int columnCount(const QModelIndex& parent = QModelIndex()) const override;
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
    //model需要设置 以下两个才可以实现编辑
    bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
    Qt::ItemFlags flags(const QModelIndex& index) const override;
    QModelIndex index(int row, int column, const QModelIndex& parent) const override;
public:    
    void OnAddTableData(GSFormulateTableData*, int row = -1);
    const QList<GSFormulateTableData*>& OnDelTableData(int row);
    void OnClearTableData();
    void SetHeaderData(QList<QString>&);
private:
    QList<QString> m_header_data;
    //List
    QList<GSFormulateTableData*> m_data_list;
};

GSFormulateTableModel.cpp

#include "GSFormulateTableModel.h"
#include "GSELTestCommon.h"
#include <QSize>
GSFormulateTableModel::GSFormulateTableModel(QObject *parent): QAbstractTableModel(parent)
{

}

GSFormulateTableModel::~GSFormulateTableModel()
{

}

QVariant GSFormulateTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	if (orientation == Qt::Horizontal && role == Qt::DisplayRole)	//角色为显示
	{  
		return m_header_data.at(section);  //返回指定位置表头	
	}
	return QAbstractTableModel::headerData(section, orientation, role);
}
//获取table的行
int GSFormulateTableModel::rowCount(const QModelIndex& parent) const
{
	if (parent.isValid())
		return 0;
	return m_data_list.count();
}
//获取table的列,这里与头文件定义的枚具体类型个数一致
int GSFormulateTableModel::columnCount(const QModelIndex& parent) const
{
	if (parent.isValid())
		return 0;
	
	return m_header_data.size();
}

// 返回模型索引
QModelIndex GSFormulateTableModel::index(int row, int column, const QModelIndex& parent) const
{
	// 行和列的合法性检查
	if (row < 0 || row >= this->m_data_list.size() || column < 0 || column >= m_header_data.size())
	{
		return QModelIndex();
	}
	switch (column)
	{
	case static_cast<int>(CustomTableData::FormulateTimeTable::check):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::name):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
		return createIndex(row, column);
	}
	return createIndex(row, column);
}

QVariant GSFormulateTableModel::data(const QModelIndex& index, int role) const
{
	if (!index.isValid() || index.row() > m_data_list.count())
	{
		return QVariant();
	}
	int nColumn = index.column();
	const int row = index.row();
	if (role == Qt::DisplayRole || role == Qt::EditRole)
	{		
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::name):
			return m_data_list.at(row)->Name();
		case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
			return m_data_list.at(row)->ModifyTime();
		case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
			return m_data_list.at(row)->Mark();
		}
	}
	if (role == Qt::CheckStateRole)
	{
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::check):
			return (m_data_list.at(row)->IsCheck() == 1) ? Qt::Checked : Qt::Unchecked;
			break;
		}
	}
	return QVariant();
}

bool GSFormulateTableModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
	if(!index.isValid())
		return false;
	const int row = index.row();
	if (role == Qt::EditRole) 
	{		
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::name):
			m_data_list.at(row)->SetName(value.toString());
			break;
		case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
			m_data_list.at(row)->SetModifyTime(value.toString());
			break;
		case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
			m_data_list.at(row)->SetMark(value.toString());
			break;
		}
		//发送信号触发刷新
		emit dataChanged(index, index, QVector<int>() << role);
		return true;
	}
	else if (role == Qt::CheckStateRole)
	{
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::check):				
			int val  = (value.toInt() == Qt::Checked ? Qt::Checked : Qt::Unchecked);
			m_data_list.at(row)->SetCheck((val == 0)?false:true);
			break;
		}
		//发送信号触发刷新
		emit dataChanged(index, index, QVector<int>() << role);
		return true;
	}
	return false;
}

Qt::ItemFlags GSFormulateTableModel::flags(const QModelIndex& index) const
{
	if (!index.isValid())
		return QAbstractItemModel::flags(index);

	Qt::ItemFlags flags_ = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
	const int row = index.row();			
	switch (index.column())
	{
	case static_cast<int>(CustomTableData::FormulateTimeTable::check):		
		flags_ |= Qt::ItemIsUserCheckable;
		break;
	case static_cast<int>(CustomTableData::FormulateTimeTable::name):			
	case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):			
	case static_cast<int>(CustomTableData::FormulateTimeTable::mark):			
		flags_ |= Qt::ItemIsEditable;
		break;
	}			
	
	return flags_;	
}

void GSFormulateTableModel::OnAddTableData(GSFormulateTableData* data, int row)
{
	int r = row;
	if (r == -1)
		r = rowCount();
	beginInsertRows(QModelIndex(), r, r);
	m_data_list.insert(r, data);
	endResetModel();
}

const QList<GSFormulateTableData*>& GSFormulateTableModel::OnDelTableData(int row)
{
	if (row < 0 || row >= rowCount())
		return QList<GSFormulateTableData*>();

	beginRemoveRows(QModelIndex(), row, row);
	m_data_list.removeAt(row);
	endRemoveRows();
	return m_data_list;
}

void GSFormulateTableModel::OnClearTableData()
{
	beginResetModel();
	for (auto d : m_data_list)
		delete(d);
	m_data_list.clear();
	endResetModel();
}

void GSFormulateTableModel::SetHeaderData(QList<QString>& list)
{
	m_header_data = list;
}

GSFormulateTableModel.h

#include <QObject>
#include <QAbstractTableModel>
#include <QList>
#include <QVariant>
#include <QModelIndex>
#include "GSFormulateTableData.h"
class GSFormulateTableModel  : public QAbstractTableModel
{
	Q_OBJECT

public:
	explicit GSFormulateTableModel(QObject *parent = nullptr);
	virtual ~GSFormulateTableModel();
public:
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    int rowCount(const QModelIndex& parent = QModelIndex()) const override;
    int columnCount(const QModelIndex& parent = QModelIndex()) const override;
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
    //model需要设置 以下两个才可以实现编辑
    bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
    Qt::ItemFlags flags(const QModelIndex& index) const override;
    QModelIndex index(int row, int column, const QModelIndex& parent) const override;
public:    
    void OnAddTableData(GSFormulateTableData*, int row = -1);
    const QList<GSFormulateTableData*>& OnDelTableData(int row);
    void OnClearTableData();
    void SetHeaderData(QList<QString>&);
private:
    QList<QString> m_header_data;
    //List
    QList<GSFormulateTableData*> m_data_list;
};

GSFormulateTableModel.cpp

#include "GSFormulateTableModel.h"
#include "GSELTestCommon.h"
#include <QSize>
GSFormulateTableModel::GSFormulateTableModel(QObject *parent): QAbstractTableModel(parent)
{

}

GSFormulateTableModel::~GSFormulateTableModel()
{

}

QVariant GSFormulateTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	if (orientation == Qt::Horizontal && role == Qt::DisplayRole)	//角色为显示
	{  
		return m_header_data.at(section);  //返回指定位置表头	
	}
	return QAbstractTableModel::headerData(section, orientation, role);
}
//获取table的行
int GSFormulateTableModel::rowCount(const QModelIndex& parent) const
{
	if (parent.isValid())
		return 0;
	return m_data_list.count();
}
//获取table的列,这里与头文件定义的枚具体类型个数一致
int GSFormulateTableModel::columnCount(const QModelIndex& parent) const
{
	if (parent.isValid())
		return 0;
	
	return m_header_data.size();
}

// 返回模型索引
QModelIndex GSFormulateTableModel::index(int row, int column, const QModelIndex& parent) const
{
	// 行和列的合法性检查
	if (row < 0 || row >= this->m_data_list.size() || column < 0 || column >= m_header_data.size())
	{
		return QModelIndex();
	}
	switch (column)
	{
	case static_cast<int>(CustomTableData::FormulateTimeTable::check):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::name):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
		return createIndex(row, column);
	case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
		return createIndex(row, column);
	}
	return createIndex(row, column);
}

QVariant GSFormulateTableModel::data(const QModelIndex& index, int role) const
{
	if (!index.isValid() || index.row() > m_data_list.count())
	{
		return QVariant();
	}
	int nColumn = index.column();
	const int row = index.row();
	if (role == Qt::DisplayRole || role == Qt::EditRole)
	{		
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::name):
			return m_data_list.at(row)->Name();
		case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
			return m_data_list.at(row)->ModifyTime();
		case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
			return m_data_list.at(row)->Mark();
		}
	}
	if (role == Qt::CheckStateRole)
	{
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::check):
			return (m_data_list.at(row)->IsCheck() == 1) ? Qt::Checked : Qt::Unchecked;
			break;
		}
	}
	return QVariant();
}

bool GSFormulateTableModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
	if(!index.isValid())
		return false;
	const int row = index.row();
	if (role == Qt::EditRole) 
	{		
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::name):
			m_data_list.at(row)->SetName(value.toString());
			break;
		case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):
			m_data_list.at(row)->SetModifyTime(value.toString());
			break;
		case static_cast<int>(CustomTableData::FormulateTimeTable::mark):
			m_data_list.at(row)->SetMark(value.toString());
			break;
		}
		//发送信号触发刷新
		emit dataChanged(index, index, QVector<int>() << role);
		return true;
	}
	else if (role == Qt::CheckStateRole)
	{
		switch (index.column())
		{
		case static_cast<int>(CustomTableData::FormulateTimeTable::check):				
			int val  = (value.toInt() == Qt::Checked ? Qt::Checked : Qt::Unchecked);
			m_data_list.at(row)->SetCheck((val == 0)?false:true);
			break;
		}
		//发送信号触发刷新
		emit dataChanged(index, index, QVector<int>() << role);
		return true;
	}
	return false;
}

Qt::ItemFlags GSFormulateTableModel::flags(const QModelIndex& index) const
{
	if (!index.isValid())
		return QAbstractItemModel::flags(index);

	Qt::ItemFlags flags_ = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
	const int row = index.row();			
	switch (index.column())
	{
	case static_cast<int>(CustomTableData::FormulateTimeTable::check):		
		flags_ |= Qt::ItemIsUserCheckable;
		break;
	case static_cast<int>(CustomTableData::FormulateTimeTable::name):			
	case static_cast<int>(CustomTableData::FormulateTimeTable::modifyTime):			
	case static_cast<int>(CustomTableData::FormulateTimeTable::mark):			
		flags_ |= Qt::ItemIsEditable;
		break;
	}			
	
	return flags_;	
}

void GSFormulateTableModel::OnAddTableData(GSFormulateTableData* data, int row)
{
	int r = row;
	if (r == -1)
		r = rowCount();
	beginInsertRows(QModelIndex(), r, r);
	m_data_list.insert(r, data);
	endResetModel();
}

const QList<GSFormulateTableData*>& GSFormulateTableModel::OnDelTableData(int row)
{
	if (row < 0 || row >= rowCount())
		return QList<GSFormulateTableData*>();

	beginRemoveRows(QModelIndex(), row, row);
	m_data_list.removeAt(row);
	endRemoveRows();
	return m_data_list;
}

void GSFormulateTableModel::OnClearTableData()
{
	beginResetModel();
	for (auto d : m_data_list)
		delete(d);
	m_data_list.clear();
	endResetModel();
}

void GSFormulateTableModel::SetHeaderData(QList<QString>& list)
{
	m_header_data = list;
}

GSFormulateTableDeletage.h

#include <QItemDelegate>
#include <QStyledItemDelegate>
#include <QStyleOptionViewItem>
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QPainter>
#include <QWidget>
class GSFormulateTableDeletage  : public QStyledItemDelegate
{
	Q_OBJECT

public:
	explicit GSFormulateTableDeletage(QObject *parent = nullptr);
	virtual ~GSFormulateTableDeletage();
public:
    // painting
    void paint(QPainter* painter,const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    QSize sizeHint(const QStyleOptionViewItem& option,const QModelIndex& index) const override;

    // editing
    QWidget* createEditor(QWidget* parent,const QStyleOptionViewItem& option,const QModelIndex& index) const override;
    void setEditorData(QWidget* editor, const QModelIndex& index) const override;
    void setModelData(QWidget* editor,QAbstractItemModel* model,const QModelIndex& index) const override;

    void updateEditorGeometry(QWidget* editor,const QStyleOptionViewItem& option,const QModelIndex& index) const override;
    void initStyleOption(QStyleOptionViewItem* option,const QModelIndex& index) const override;
private:
    void OnSetTableColumnDataStyle(QStyleOptionViewItem&,const int&)const;
    QSize OnSetTableColumnDataSize(const int&)const;
    bool OnSetTableColumnDataEvent(QEvent* event,const QPoint &, const QStyleOptionViewItem&, const QModelIndex& index) const;

};

GSFormulateTableDeletage.cpp

#include "GSFormulateTableDeletage.h"
#include "GSELTestCommon.h"
#include <QMouseEvent>
#include <QLineEdit>
#include <QCheckBox>
#include <QApplication>
GSFormulateTableDeletage::GSFormulateTableDeletage(QObject *parent)
	: QStyledItemDelegate(parent)
{
}

GSFormulateTableDeletage::~GSFormulateTableDeletage()
{
}

void GSFormulateTableDeletage::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
	QStyleOptionViewItem viewOption = option;
	initStyleOption(&viewOption, index);
	int column = index.column();
	OnSetTableColumnDataStyle(viewOption, column);//该函数必须为const修饰的,不然参数QStyleOptionViewItem失败
	QStyledItemDelegate::paint(painter, viewOption, index);
}

QSize GSFormulateTableDeletage::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
	int column = index.column();
	OnSetTableColumnDataSize(column);
	return QStyledItemDelegate::sizeHint(option, index);	
}

QWidget* GSFormulateTableDeletage::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
	QLineEdit* editor = new QLineEdit(parent);
	return editor;	
	return nullptr;
}

void GSFormulateTableDeletage::setEditorData(QWidget* editor, const QModelIndex& index) const
{
	auto value = index.model()->data(index, Qt::EditRole);
	QLineEdit* label = static_cast<QLineEdit*>(editor);
	label->setText(value.toString());	
}

void GSFormulateTableDeletage::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
	QLineEdit* label = static_cast<QLineEdit*>(editor);
	QVariant value = label->text();
	model->setData(index, value, Qt::EditRole);	
}

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

void GSFormulateTableDeletage::initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const
{
	QStyledItemDelegate::initStyleOption(option, index);
}

void GSFormulateTableDeletage::OnSetTableColumnDataStyle(QStyleOptionViewItem &viewOption,const int &column) const
{
	viewOption.displayAlignment = Qt::AlignCenter;
}

QSize GSFormulateTableDeletage::OnSetTableColumnDataSize(const int& column) const
{
	return QSize(60, 30);	
}

bool GSFormulateTableDeletage::OnSetTableColumnDataEvent(QEvent* event, const QPoint&, const QStyleOptionViewItem&, const QModelIndex& index) const
{
	switch (event->type())
	{
	case QEvent::MouseMove:break;
	case QEvent::MouseButtonPress:break;
	case QEvent::MouseButtonRelease:break;
	default:break;
	}
	return false;
}

在tableView中使用model、deletage

#include <QWidget>
#include "ui_GS_Formulation_Management.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Formulate_Manage_Form; };
QT_END_NAMESPACE
class GSFormulateTableModel;
class GSFormulateTableDeletage;
class GSCheckableDelegate;
class GSFormulateDataModel;
class GSFormulationManagementWidget : public QWidget
{
	Q_OBJECT

public:
	GSFormulationManagementWidget(QWidget *parent = nullptr);
	~GSFormulationManagementWidget();
protected:
	void OnCreateModelDeletage();
	void OnInitTableView();
	void OnSetBtnSignal();
	void OnInitFormultaeTableHeader(QStringList list = {});
	void OnInitFormulateDataHeader(QStringList list = {});
public slots:
	bool OnNewBtnSlot();
	bool OnSaveAsBtnSlot();
	bool OnRemoveBtnSlot();
	bool OnDeleteBtnSlot();
	bool OnSaveAndApplicateBtnSlot();
private:
	Ui::Formulate_Manage_Form ui;
	GSFormulateTableModel* m_formulate_model;
	GSFormulateTableDeletage* m_formulate_deletage;
	GSCheckableDelegate* m_check_deletage;	//unuse

	GSFormulateDataModel* m_formulate_data_model;
};
#include "GSFormulationManagementWidget.h"
#include "GSFormulateTableDeletage.h"
#include "GSFormulateTableModel.h"
#include "GSFormulateDataModel.h"
#include "GSELTestCommon.h"
#include <QDateTime>
#include <QDir>
#include <QFileDialog>
#include <QFile>
#include <QString>
GSFormulationManagementWidget::GSFormulationManagementWidget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	OnInitTableView();
	OnSetBtnSignal();
}

GSFormulationManagementWidget::~GSFormulationManagementWidget()
{
}

void GSFormulationManagementWidget::OnCreateModelDeletage()
{
	m_formulate_model = new GSFormulateTableModel;
	m_formulate_deletage = new GSFormulateTableDeletage;

	m_formulate_data_model = new GSFormulateDataModel;
	OnInitFormultaeTableHeader();
	OnInitFormulateDataHeader();
}

void GSFormulationManagementWidget::OnInitTableView()
{

	ui.tableView->verticalHeader()->setVisible(false);
	ui.tableView->horizontalHeader()->setStretchLastSection(true);
	ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);	
	ui.tableView->setSelectionMode(QAbstractItemView::SingleSelection);
	ui.tableView->setAlternatingRowColors(true);
	ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

	ui.tableView_2->verticalHeader()->setVisible(false);
	ui.tableView_2->horizontalHeader()->setStretchLastSection(true);
	ui.tableView_2->setSelectionBehavior(QAbstractItemView::SelectRows);	
	ui.tableView_2->setSelectionMode(QAbstractItemView::SingleSelection);
	ui.tableView_2->setAlternatingRowColors(true);	
	ui.tableView_2->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

	OnCreateModelDeletage();
	ui.tableView->setModel(m_formulate_model);
	ui.tableView->setItemDelegateForColumn(1, m_formulate_deletage);
	ui.tableView->setItemDelegateForColumn(2, m_formulate_deletage);
	ui.tableView->setItemDelegateForColumn(3, m_formulate_deletage);

	ui.tableView_2->setModel(m_formulate_data_model);
	ui.tableView_2->setItemDelegateForColumn(1, m_formulate_deletage);
	ui.tableView_2->setItemDelegateForColumn(2, m_formulate_deletage);
	ui.tableView_2->setItemDelegateForColumn(3, m_formulate_deletage);
}

void GSFormulationManagementWidget::OnSetBtnSignal()
{
	connect(ui.New_pbtn,&QPushButton::clicked,this,&GSFormulationManagementWidget::OnNewBtnSlot);
	connect(ui.SaveAs_pbtn, &QPushButton::clicked, this, &GSFormulationManagementWidget::OnSaveAsBtnSlot);
	connect(ui.Remove_pbtn, &QPushButton::clicked, this, &GSFormulationManagementWidget::OnRemoveBtnSlot);
	connect(ui.Delete_pbtn, &QPushButton::clicked, this, &GSFormulationManagementWidget::OnDeleteBtnSlot);
	connect(ui.SaveAndApplicate_pbtn, &QPushButton::clicked, this, &GSFormulationManagementWidget::OnSaveAndApplicateBtnSlot);
}
void GSFormulationManagementWidget::OnInitFormultaeTableHeader(QStringList list)
{
	QList<QString> tableHorTitle;
	tableHorTitle.push_back(QString::fromLocal8Bit(""));
	tableHorTitle.push_back(QString::fromLocal8Bit("name"));
	tableHorTitle.push_back(QString::fromLocal8Bit("modifytime"));
	tableHorTitle.push_back(QString::fromLocal8Bit("mark"));
	m_formulate_model->SetHeaderData(tableHorTitle);
}

void GSFormulationManagementWidget::OnInitFormulateDataHeader(QStringList list)
{
	QList<QString> tableHorTitle;
	tableHorTitle.push_back(QString::fromLocal8Bit("ISCheck"));
	tableHorTitle.push_back(QString::fromLocal8Bit("DefectType"));
	tableHorTitle.push_back(QString::fromLocal8Bit("ConfidenceLevel"));
	tableHorTitle.push_back(QString::fromLocal8Bit("Area"));
	m_formulate_data_model->SetHeaderData(tableHorTitle);
}
bool GSFormulationManagementWidget::OnNewBtnSlot()
{
	GSFormulateTableData* data = new GSFormulateTableData();
	data->SetCheck(true);
	data->SetName("DefectConfig");
	QDateTime datetime = QDateTime::currentDateTime();	
	QString current_tiem = datetime.toString("yyyy-MM-dd HH:mm:ss");
	data->SetModifyTime(current_tiem);
	data->SetMark("");

	QList<GSFormulateData*> list;
	for (size_t i = 0; i < 11; i++)
	{		
		GSFormulateData* _data = new GSFormulateData();
		_data->SetCheck(true);
		//_data->SetDefectType("liehen_"+QString::number(i));
		_data->SetDefectType(QString::fromLocal8Bit("中文输出内容") + QString::number(i));
		_data->SetConfidenceLevel(QString::number(0.5231, 'f', 3));
		_data->SetDefectArea(QString::number(220.45, 'f', 2));
		list.push_back(_data);
	}
	data->SetFormulateDataList(list);
	m_formulate_model->OnAddTableData(data);
	m_formulate_data_model->OnUpdateTableData(data->FormulateDataList());

	return true;
}

bool GSFormulationManagementWidget::OnSaveAsBtnSlot()
{
	QTableView* tabview = ui.tableView;
	QModelIndex index = tabview->currentIndex();	
	if (index.row() < 0 || index.column() < 0)
		return false;

	auto value = tabview->model()->data(tabview->model()->index(index.row(), 1));
	QString path;
	path = QDir::currentPath() + value.toString() + ".DB3";
	QString filename = QFileDialog::getSaveFileName(this, tr("Save As"), path, tr("Files (*.DB3)"));
	if (!filename.isNull())
	{
		////һЩ       
		//QFile::copy(path + filename);
	}
	return true;
}

bool GSFormulationManagementWidget::OnRemoveBtnSlot()
{
	QTableView* tabview = ui.tableView;
	QModelIndex index = tabview->currentIndex();
	int curRow = index.row();
	const QList<GSFormulateTableData*> data_list = m_formulate_model->OnDelTableData(curRow);
	if (data_list.size() <= 0) 
	{
		m_formulate_data_model->OnClearTableData();
	}
	else
	{
		m_formulate_data_model->OnUpdateTableData(data_list.back()->FormulateDataList());
	}
	
	return true;
}

bool GSFormulationManagementWidget::OnDeleteBtnSlot()
{
	QTableView* tabview = ui.tableView;
	QModelIndex index = tabview->currentIndex();
	int curRow = index.row();
	const QList<GSFormulateTableData*> data_list = m_formulate_model->OnDelTableData(curRow);
	if (data_list.size() <= 0)
	{
		m_formulate_data_model->OnClearTableData();
	}
	else
	{
		m_formulate_data_model->OnUpdateTableData(data_list.back()->FormulateDataList());
	}
	//ɾ   ļ     

	return true;
}

bool GSFormulationManagementWidget::OnSaveAndApplicateBtnSlot()
{
	return false;
}

在这里插入图片描述
图片中的CheckBox在网上查的是推荐使用model实现,所以没有使用代理。如果有代理实现的更好的方案,评论区留言,我也学习下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值