控件代理
#ifndef ITEMDELETEGATE_H
#define ITEMDELETEGATE_H
#include <QStandardItem>
#include <QItemDelegate>
#include <QComboBox>
#include <QStandardItemModel>
#include <QString>
#include <QDoubleSpinBox>
#include <QMap>
#include <QDateTimeEdit>
/// 代理模型
class StandardItemModel : public QStandardItemModel
{
Q_OBJECT
public:
StandardItemModel(QObject *parent = NULL);
StandardItemModel(int row, int column, QObject *parent = NULL);
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
private:
};
/// 代理模型——QDoubleSpinBox
class DoubleSpinBoxItemModel : public QItemDelegate
{
Q_OBJECT
public:
DoubleSpinBoxItemModel(const double min_val, const double max_val, QObject *parent = NULL);
/// 创建代理
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 SetDecimals(int val);
/// @brief 设置最大/最小的值
/// @param min_val 可输入的双精度最小值
/// @param max_val 可输入的双精度最大值
void SetClampVal(const double min_val, const double max_val);
private:
double min_val_;
double max_val_;
int decimal_;
};
/// 代理模型——QComboBox
class ComboBoxItemModel : public QItemDelegate
{
Q_OBJECT
public:
ComboBoxItemModel(const QMap<int, QString> &list_item = {}, QObject *parent = nullptr);
/// 创建代理
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;
QMap<int, QString> list_item() const;
void setList_item(const QMap<int, QString> &list_item);
void ResetListValue(const QVector<QString>& new_val);
private:
/// 下拉值
QMap<int, QString> list_item_;
signals:
//选择combobox下发信号
void SignalSeleteCombobox(const QString &curr_name) const;
};
/// 代理模型——QComboBox有id
class ComboBoxItemModelTy : public QItemDelegate
{
Q_OBJECT
public:
ComboBoxItemModelTy(QObject *parent = NULL);
/// 创建代理
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;
QList<QPair<QString, QString> > list_com_item() const;
void setList_com_item(const QList<QPair<QString, QString> > &list_com_item);
private:
/// 下拉内容<设备id, 设备名>
QList<QPair<QString, QString> > list_com_item_;
signals:
//item发生改变
void SignalItemChangedId(const QString &ty_id) const;
};
/// 代理模型——QComboBox有id
class ComboBoxItemModelId : public QItemDelegate
{
Q_OBJECT
public:
ComboBoxItemModelId(QObject *parent = NULL);
/// 创建代理
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;
QList<QPair<QString, QString> > list_com_item() const;
void setList_com_item(const QList<QPair<QString, QString> > &list_com_item);
private:
/// 下拉内容<设备id, 设备名>
QList<QPair<QString, QString> > list_com_item_;
signals:
//item发生改变
void SignalItemChangedId(const QString &equip_id) const;
};
/// 代理模型——QComboBox
class ComboBoxItemJylModel : public QItemDelegate
{
Q_OBJECT
public:
ComboBoxItemJylModel(QObject *parent = NULL);
/// 创建代理
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;
};
/// 代理模型——QLineEdit
class LineEditItemModel : public QItemDelegate
{
Q_OBJECT
public:
LineEditItemModel(QObject *parent = NULL);
/// 创建代理
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 setRegValitor(bool b_rge);
void SetChar( bool b_char);
//设置字符长度
void SetLength(int val);
private:
bool b_rge_;
bool n_length_;
bool b_char;
};
/// 代理模型——QPushButton
class PushButtonItemModel : public QItemDelegate
{
Q_OBJECT
public:
PushButtonItemModel(QObject *parent = NULL);
/// 创建代理
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;
};
//代理模式-DateTimeEdit
class DateTimeEditItemModel : public QItemDelegate
{
Q_OBJECT
public:
DateTimeEditItemModel(QObject *parent = nullptr);
/// 创建代理
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;
};
class DateTimeLimitEditItemModel : public QItemDelegate
{
Q_OBJECT
public:
DateTimeLimitEditItemModel(QObject *parent = nullptr);
/// 创建代理
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 setRangeDateTime(const QDateTime& min_time, const QDateTime& max_time);
private:
QDateTime min_time_;
QDateTime max_time_;
};
#endif /// ITEMDELETEGATE_H
#include "Common/CompileConfig.h"
#include "ItemDeletegate.h"
#include <QComboBox>
#include <QDoubleSpinBox>
#include <QLineEdit>
#include <QPushButton>
#include <QRegExp>
#include <QValidator>
#include <QRegExpValidator>
#include <QListView>
/// 代理模型
StandardItemModel::StandardItemModel(QObject *parent)
{
}
StandardItemModel::StandardItemModel(int row, int column, QObject *parent)
{
}
QVariant StandardItemModel::data(const QModelIndex &index, int role) const
{
if(Qt::TextAlignmentRole == role)
{
return Qt::AlignCenter;
}
return QStandardItemModel::data(index, role);
}
/// 代理模型——QDoubleSpinBox
DoubleSpinBoxItemModel::DoubleSpinBoxItemModel(const double min_val, const double max_val, QObject *parent) :
min_val_(min_val),
max_val_(max_val)
{
decimal_ = 2;
}
QWidget *DoubleSpinBoxItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QDoubleSpinBox *double_box = new QDoubleSpinBox(parent);
double_box->setDecimals(decimal_);
double_box->setButtonSymbols(QDoubleSpinBox::NoButtons);
double_box->setMinimum(min_val_);
double_box->setMaximum(max_val_);
return double_box;
}
void DoubleSpinBoxItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
double n_value = index.model()->data(index, Qt::EditRole).toDouble();
QDoubleSpinBox *double_box = static_cast<QDoubleSpinBox*>(editor);
double_box->interpretText();
double_box->setValue(n_value);
}
void DoubleSpinBoxItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QDoubleSpinBox *double_box = static_cast<QDoubleSpinBox*>(editor);
double_box->interpretText();
double n_value = double_box->value();
model->setData(index, n_value, Qt::EditRole);
}
void DoubleSpinBoxItemModel::SetDecimals(int val)
{
decimal_ = val;//小数点个数
}
void DoubleSpinBoxItemModel::SetClampVal(const double min_val, const double max_val)
{
min_val_ = min_val;
max_val_ = max_val;
}
/// 代理模型——QComboBox
ComboBoxItemModel::ComboBoxItemModel(const QMap<int, QString> &list_item,QObject *parent)
{
list_item_ = list_item;
}
QWidget *ComboBoxItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *item_combox = new QComboBox(parent);
item_combox->setView(new QListView());
if(list_item_.size())
{
for (auto it=list_item_.begin(); it!=list_item_.end(); ++it)
{
item_combox->addItem(it.value());
}
}
return item_combox;
}
void ComboBoxItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QComboBox *com_box = static_cast<QComboBox*>(editor);
com_box->setCurrentText(str_text);
}
void ComboBoxItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *com_box = static_cast<QComboBox*>(editor);
QString str_text = com_box->currentText();
/// 如果已经没有值了,此时会为空,则不改变当前的值
if (!str_text.isEmpty())
{
model->setData(index, str_text, Qt::EditRole);
model->setData(index, com_box->currentIndex() + 1, Qt::UserRole + 1);
}
}
QMap<int, QString> ComboBoxItemModel::list_item() const
{
return list_item_;
}
void ComboBoxItemModel::setList_item(const QMap<int, QString> &list_item)
{
list_item_ = list_item;
}
void ComboBoxItemModel::ResetListValue(const QVector<QString>& new_val)
{
list_item_.clear();
int i = 0;
for (auto iter : new_val)
{
list_item_.insert(i,iter);
i++;
}
}
/// 代理模型——QLineEdit
LineEditItemModel::LineEditItemModel(QObject *parent)
{
b_rge_ = false;
n_length_ = 20;
b_char = false;
}
QWidget *LineEditItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QLineEdit *linedit = new QLineEdit(parent);
linedit->setMaxLength(20);
linedit->setMaxLength(20);
if(!b_char)
{
if(b_rge_)
{
QRegExp rx("((^[-]?[0-9])|(^[-]?[1-8]([0-9])?))(([.](([0-9])|([0-9][0-9])))?){1,1}$");
QValidator *validator = new QRegExpValidator(rx, parent);
linedit->setValidator(validator);
}
else
{
//QRegExp rx("((^[-]?[0-9])|(^[-]?[2-9]([0-9])?)|(^[-]?[1](([0-7])?)(([0-9])?)))(([.](([0-9])|([0-9][0-9])))?){1,1}$");
QRegExp rx("^[A-Za-z0-9`~!@#$%^&*()_-+=<>,.\\\/]+$");
QValidator *validator = new QRegExpValidator(rx, parent);
linedit->setValidator(validator);
}
}
return linedit;
}
void LineEditItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QLineEdit *linedit = static_cast<QLineEdit*>(editor);
linedit->setText(str_text);
}
void LineEditItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QLineEdit *linedit = static_cast<QLineEdit*>(editor);
QString str_text = linedit->text();
model->setData(index, str_text, Qt::EditRole);
}
void LineEditItemModel::setRegValitor(bool b_rge)
{
b_rge_ = b_rge;
}
void LineEditItemModel::SetChar( bool char_b)
{
b_char = char_b;
}
void LineEditItemModel::SetLength(int val)
{
n_length_ = val;
}
/// 代理模型——QPushButton
PushButtonItemModel::PushButtonItemModel(QObject *parent)
{
}
QWidget *PushButtonItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPushButton *push_btn = new QPushButton("查看", parent);
return push_btn;
}
void PushButtonItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QPushButton *push_btn = static_cast<QPushButton*>(editor);
push_btn->setText(str_text);
}
void PushButtonItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QPushButton *push_btn = static_cast<QPushButton*>(editor);
QString str_text = push_btn->text();
model->setData(index, str_text, Qt::EditRole);
}
ComboBoxItemJylModel::ComboBoxItemJylModel(QObject *parent)
{
}
QWidget *ComboBoxItemJylModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *item_combox = new QComboBox(parent);
QStringList list_level;
list_level << "无雨" << "小雨" << "中雨"<< "大雨";
item_combox->addItems(list_level);
return item_combox;
}
void ComboBoxItemJylModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QComboBox *com_box = static_cast<QComboBox*>(editor);
com_box->setCurrentText(str_text);
}
void ComboBoxItemJylModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *com_box = static_cast<QComboBox*>(editor);
QString str_text = com_box->currentText();
model->setData(index, str_text, Qt::EditRole);
}
ComboBoxItemModelTy::ComboBoxItemModelTy(QObject *parent)
{
list_com_item_.clear();
}
QWidget *ComboBoxItemModelTy::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *item_combox = new QComboBox(parent);
item_combox->setView(new QListView());
//设置下拉值
for(auto itt : list_com_item_)
{
item_combox->addItem(itt.second, itt.first);
}
return item_combox;
}
void ComboBoxItemModelTy::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QComboBox *com_box = static_cast<QComboBox*>(editor);
com_box->setCurrentText(str_text);
}
void ComboBoxItemModelTy::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *com_box = static_cast<QComboBox*>(editor);
QString str_text = com_box->currentText();
QString str_id = com_box->currentData().toString();
//装备数据发生改变
emit SignalItemChangedId(str_id);
//设置item内容
model->setData(index, str_text);
QStandardItemModel *current_model = dynamic_cast<QStandardItemModel*>(model);
if(current_model != nullptr)
{
//设置item的id
current_model->item(index.row(), index.column())->setData(str_id, Qt::UserRole + 1);
}
}
QList<QPair<QString, QString> > ComboBoxItemModelTy::list_com_item() const
{
return list_com_item_;
}
void ComboBoxItemModelTy::setList_com_item(const QList<QPair<QString, QString> > &list_com_item)
{
list_com_item_ = list_com_item;
}
ComboBoxItemModelId::ComboBoxItemModelId(QObject *parent)
{
list_com_item_.clear();
}
QWidget *ComboBoxItemModelId::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *item_combox = new QComboBox(parent);
item_combox->setView(new QListView());
//设置下拉值
for(auto itt : list_com_item_)
{
item_combox->addItem(itt.second, itt.first);
}
return item_combox;
}
void ComboBoxItemModelId::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QComboBox *com_box = static_cast<QComboBox*>(editor);
com_box->setCurrentText(str_text);
}
void ComboBoxItemModelId::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *com_box = static_cast<QComboBox*>(editor);
QString str_text = com_box->currentText();
QString str_id = com_box->currentData().toString();
//装备数据发生改变
emit SignalItemChangedId(str_id);
//设置item内容
model->setData(index, str_text);
QStandardItemModel *current_model = dynamic_cast<QStandardItemModel*>(model);
if(current_model != nullptr)
{
//设置item的id
current_model->item(index.row(), index.column())->setData(str_id, Qt::UserRole + 1);
}
}
QList<QPair<QString, QString> > ComboBoxItemModelId::list_com_item() const
{
return list_com_item_;
}
void ComboBoxItemModelId::setList_com_item(const QList<QPair<QString, QString> > &list_com_item)
{
list_com_item_ = list_com_item;
}
DateTimeEditItemModel::DateTimeEditItemModel(QObject *parent)
{
}
QWidget *DateTimeEditItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QDateTimeEdit *datetime_edit = new QDateTimeEdit(parent);
datetime_edit->setButtonSymbols(QAbstractSpinBox::NoButtons);
datetime_edit->setDisplayFormat("yyyy-MM-dd HH:mm:ss zzz");
return datetime_edit;
}
void DateTimeEditItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QDateTimeEdit *datetime_edit = static_cast<QDateTimeEdit*>(editor);
datetime_edit->setDateTime(QDateTime::fromString(str_text, "yyyy-MM-dd HH:mm:ss zzz"));
}
void DateTimeEditItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QDateTimeEdit *datetime_edit = static_cast<QDateTimeEdit*>(editor);
QString str_text = datetime_edit->dateTime().toString("yyyy-MM-dd HH:mm:ss zzz");
model->setData(index, str_text, Qt::EditRole);
}
DateTimeLimitEditItemModel::DateTimeLimitEditItemModel(QObject *parent)
{
min_time_ = QDateTime::currentDateTime();
max_time_ = QDateTime::currentDateTime();
}
QWidget *DateTimeLimitEditItemModel::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QDateTimeEdit *datetime_edit = new QDateTimeEdit(parent);
datetime_edit->setDateTimeRange(min_time_, max_time_);
datetime_edit->setButtonSymbols(QAbstractSpinBox::NoButtons);
datetime_edit->setDisplayFormat("yyyy-MM-dd HH:mm:ss zzz");
return datetime_edit;
}
void DateTimeLimitEditItemModel::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str_text = index.model()->data(index, Qt::EditRole).toString();
QDateTimeEdit *datetime_edit = static_cast<QDateTimeEdit*>(editor);
datetime_edit->setDateTime(QDateTime::fromString(str_text, "yyyy-MM-dd HH:mm:ss zzz"));
}
void DateTimeLimitEditItemModel::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QDateTimeEdit *datetime_edit = static_cast<QDateTimeEdit*>(editor);
QString str_text = datetime_edit->dateTime().toString("yyyy-MM-dd HH:mm:ss zzz");
model->setData(index, str_text, Qt::EditRole);
}
void DateTimeLimitEditItemModel::setRangeDateTime(const QDateTime &min_time, const QDateTime &max_time)
{
min_time_ = min_time;
max_time_ = max_time;
}
model自定义
#ifndef MODEL_H
#define MODEL_H
/*! \class ModelView
\brief 自定义model
*/
#include <QAbstractTableModel>
#include <QVector>
#include <QMap>
class ModelView :public QAbstractTableModel
{
Q_OBJECT
public:
explicit ModelView(QObject *parent = nullptr);
/*! \fn columnCount
\brief 列个数
\return void
*/
virtual int columnCount(const QModelIndex &parent) const;
/*! \fn rowCount
\brief 行数
\return void
*/
virtual int rowCount(const QModelIndex &parent) const;
/*! \fn data
\brief 显示数据
\return void
*/
virtual QVariant data(const QModelIndex &index, int role) const;
/*! \fn sort
\brief 排序
\return void
*/
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
/*! \fn setData
\brief 编辑表格数据
\return void
*/
bool setData(const QModelIndex &index, const QVariant &value, int role);
/*! \fn flags
\brief 表格编辑属性
\return void
*/
Qt::ItemFlags flags(const QModelIndex &index) const;
/*! \fn headerData
\brief 表头数据
\return void
*/
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
/*! \fn SetModelData
\brief 设置数据新增
\return void
*/
void SetModelData(const QVector<QVector<QVariant> > &data);
/*! \fn SetModelDataAppend
\brief 设置数据新增往后一行
\return void
*/
void SetModelDataAppend(const QVector<QVariant> &data);
/*! \fn SetModelDataFront
\brief 设置数据新增往前一行
\return void
*/
void SetModelDataFront(const QVector<QVariant> &data);
/*! \fn SetHeaderData
\brief 设置表头数据
\param[in] headr_data 表头数据
\return void
*/
void SetHeaderData(const QStringList headr_data);
/*! \fn ClearTableData
\brief 清空表格数据
\return void
*/
void ClearTableData();
/*! \fn ClearRowData
\brief 清空表格数据
\param[in] row 行
\return void
*/
void ClearRowData(const int row);
/*! \fn ClearRowsData
\brief 清空表格数据
\param[in] begin 开始行
\param[in] end 结束行
\return void
*/
void ClearRowsData(const int begin,const int end);
/*! \fn SetColumnForCheckBox
\brief 设置第几列可勾选
\param[in] column 列
\return void
*/
void SetColumnForCheckBox(const int column);
/*! \fn SetColorRow
\brief 设置表格行颜色
\param[in] t_row 行
\param[in] color 颜色
\return void
*/
void SetColorRow(const int row, const QColor &color);
/*! \fn GetData
\brief 得到表格数据
\param[in] data 所有数据
\return void
*/
void GetData(QVector<QVector<QVariant> > &data);
/*! \fn UpdateRows
\brief 更新表格
\param[in] t_row 行
\param[in] data 数据
\return void
*/
void UpdateRow( const int row,const QVector<QVariant> &data);
/*! \fn UpdateRows
\brief 更新表格
\param[in] t_start_row 开始行
\param[in] t_end_rowconst 结束行
\param[in] data 数据
\return void
*/
void UpdateRows(const int &t_start_row, const int &t_end_rowconst, QVector<QVector<QVariant>> &data);
/*! \fn GetItemData
\brief 获取item数据
\param[in] t_row 行
\param[in] t_column 列
\return QVariant item数据
*/
QVariant GetItemData(const int &t_row, const int &t_column);
/*! \fn UpdateItemData
\brief 更新item数据
\param[in] t_row 行
\param[in] t_column 列
\param[in] t_data 数据
\return void
*/
void UpdateItemData(const int &t_row, const int &t_column, const QString &t_data);
private:
/*! \fn MyCompare
\brief 排序
\param[in] data_a 数据1
\param[in] data_b 数据2
\return void
*/
static bool MyCompare(QVector<QVariant> data_a, QVector<QVariant> data_b);
private:
/*! var table_datas_
brief 表格数据*/
QVector<QVector<QVariant>> table_datas_;
/*! var for_column_
brief 第几列显示勾选框*/
int for_column_;
/*! var header_data_
brief 表头数据*/
QStringList header_data_;
/*! var map_row_color_
brief 行颜色*/
QMap<int,QColor> map_row_color_ ;
/*! var sort_column_
brief 排序列*/
static int sort_column_;
/*! var order_
brief 排序方式*/
static Qt::SortOrder order_;
};
#endif // MODEL_H
#include "model.h"
#include <QDebug>
#include <QColor>
#include <QBrush>
int ModelView::sort_column_ = 0;
Qt::SortOrder ModelView::order_ = Qt::AscendingOrder;
ModelView::ModelView(QObject *parent)
:QAbstractTableModel(parent)
{
setParent(parent);
}
int ModelView::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return header_data_.count();
}
int ModelView::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return table_datas_.count();
}
QVariant ModelView::data(const QModelIndex &index, int role) const
{
if(!index.isValid())
{
return QVariant();
}
//设置数据
if(Qt::DisplayRole == role && index.column() < header_data_.count())
{
return table_datas_.at(index.row()).at(index.column());
}
//设置居中
if(Qt::TextAlignmentRole == role)
{
return Qt::AlignCenter;
}
if (Qt::BackgroundRole == role && map_row_color_.contains(index.row()))
{
return QBrush(map_row_color_.value(index.row()));
}
return QVariant();
}
void ModelView::sort(int column, Qt::SortOrder order)
{
sort_column_ = column;
order_ = order;
beginResetModel();
qSort(table_datas_.begin(), table_datas_.end(), MyCompare);
endResetModel();
}
bool ModelView::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(!index.isValid()||value.isNull())
{
return false;
}
if(Qt::EditRole == role)
{
table_datas_[index.row()][index.column()] = value;
emit dataChanged(index,index);
return true;
}
return false;
}
Qt::ItemFlags ModelView::flags(const QModelIndex &index) const
{
if(!index.isValid())
{
return Qt::ItemIsEditable;
}
if(index.column()==for_column_)
{
return QAbstractTableModel::flags(index)|Qt::ItemIsSelectable|Qt::ItemIsUserCheckable;
}
else {
return QAbstractTableModel::flags(index)|Qt::ItemIsEditable|Qt::ItemIsSelectable;
}
}
QVariant ModelView::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole&&orientation==Qt::Horizontal)
{
return header_data_.at(section);
}
return QAbstractTableModel::headerData(section,orientation,role);
}
void ModelView::SetModelData(const QVector<QVector<QVariant>> &data)
{
if(data.isEmpty())
return;
beginInsertRows(QModelIndex(),table_datas_.size(),table_datas_.size()+data.size()-1);
table_datas_.append(data);
endInsertRows();
}
void ModelView::SetModelDataAppend(const QVector<QVariant> &data)
{
if(data.isEmpty())
return;
beginInsertRows(QModelIndex(),table_datas_.size(),table_datas_.size());
table_datas_.append(data);
endInsertRows();
}
void ModelView::SetModelDataFront(const QVector<QVariant> &data)
{
if(data.isEmpty())
return;
beginInsertRows(QModelIndex(),table_datas_.size(), table_datas_.size());
table_datas_.prepend(data);
endInsertRows();
}
void ModelView::SetHeaderData(const QStringList headr_data)
{
header_data_ = headr_data;
}
void ModelView::ClearTableData()
{
beginResetModel();
table_datas_.clear();
map_row_color_.clear();
endResetModel();
}
void ModelView::ClearRowData(const int row)
{
beginResetModel();
table_datas_.removeAt(row);
endResetModel();
}
void ModelView::ClearRowsData(const int begin, const int end)
{
int first = begin;
beginResetModel();
while (first!=end) {
table_datas_.removeAt(begin);
first++;
}
table_datas_.removeAt(begin);
endResetModel();
}
void ModelView::SetColumnForCheckBox(const int column)
{
for_column_ = column;
}
void ModelView::SetColorRow(const int row,const QColor &color)
{
map_row_color_[row] = color;
}
void ModelView::GetData(QVector<QVector<QVariant> > &data)
{
table_datas_ = data;
}
void ModelView::UpdateRow(const int row, const QVector<QVariant> &data)
{
table_datas_[row] = data;
}
void ModelView::UpdateRows(const int &t_start_row, const int &t_end_rowconst, QVector<QVector<QVariant> > &data)
{
if(rowCount(QModelIndex()) >= t_end_rowconst && t_start_row <= 0)
{
for(int row = t_start_row; row <= t_end_rowconst; row++)
{
table_datas_[row] = data[row];
}
}
}
QVariant ModelView::GetItemData(const int &t_row, const int &t_column)
{
if(table_datas_.count() > t_row && table_datas_.at(t_row).count() > t_column)
return table_datas_.at(t_row).at(t_column);
else
return "";
}
void ModelView::UpdateItemData(const int &t_row, const int &t_column, const QString &t_data)
{
if(table_datas_.count() > t_row && table_datas_.at(t_row).count() > t_column)
table_datas_[t_row][t_column] = t_data;
}
bool ModelView::MyCompare(QVector<QVariant> data_a, QVector<QVariant> data_b)
{
if(order_ == Qt::AscendingOrder)
return data_a[sort_column_] < data_b[sort_column_];
else
return data_a[sort_column_] > data_b[sort_column_];
}
QVector<QVariant> once_data
{
QString::number(++number_),
"name",
it.time.toString("yyyy-MM-dd HH:mm:ss")
};
ModelView *modle_;
int Row_ = modle_->rowCount(QModelIndex());
modle_->SetModelDataFront(once_data);//最前插一行
//model
model_->removeRows( 0, model_->rowCount());
//tabwidget
tableWidget->clearContents(); // 清空内容但保留表头
tableWidget->setRowCount(0);// 移除所有的行