qt的model自定义和控件代理

控件代理

#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);// 移除所有的行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值