- 委托是Qt中的一种机制,用于在Qt模型/视图架构中处理特定类型的数据。委托提供了一种方便的方法来定制特定类型的数据的显示和编辑。
- 委托可以做以下事情:
编辑特定类型的数据: 通过创建编辑器来编辑特定类型的数据,例如日期,数值等。
渲染特定类型的数据: 通过定制单元格的外观来渲染特定类型的数据,例如颜色,字体等;
支持不同类型的编辑器: 支持不同类型的编辑器,例如文本编辑器,下拉列表编辑器等;
处理编辑器的事件: 通过实现eventFilter()方法来处理编辑器的事件,如键盘事件;
更新编辑器的尺寸: 通过实现sizeHint()方法来更新编辑器的尺寸;
数据验证: 通过实现editorEvent()来验证编辑器中的数据是否合法。
- 委托的常见应用场景包括:
表格和列表视图: 在表格和列表视图中使用委托可以方便地编辑单元格中的数据,并定制单元格的外观
属性编辑器: 使用委托可以创建自定义属性编辑器来编辑特定类型的属性
文件对话框: 使用委托可以定制文件对话框中的文件列表的外观
以QTableView为例子:
- 需要为QTableView设置一个model
- 也可以自定义model,继承QStandardItemModel;
- 为QTableView设置Delegate
- 继承QStandardItemModel、QItemDelegate或者QStyledItemDelegate;
- QItemDelegate是QAbstractItemDelegate的子类,它提供了一种通用的委托类;
- QStyledItemDelegate是QItemDelegate的子类,它使用Qt Style Sheets来渲染单元格中的数据,这样可以更好地与应用程序的外观保持一致。它还提供了一些额外的功能,如支持自定义编辑器和支持编辑器工厂,这样可以更好地管理编辑器;
- 委托类需要重写对应的函数,比如:
- 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;
- void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex & index) const;
- QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const;
- bool eventFilter(QObject *object, QEvent *event) ;
- 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实现,所以没有使用代理。如果有代理实现的更好的方案,评论区留言,我也学习下。