#include "ModelTableView.h" #include "IWheelModel.h" #include "qobject.h" #include #include "qheaderview.h" #include #include #define MINIMGNUM 10 #pragma execution_character_set("utf-8") enum TEM_MODEL{ emTypeModelSuccess = 0, emTypeModelWarning, emTypeModelError }; ModelsModel::ModelsModel(QStringList lstHeader, QMap *pData) { QString strApp = QApplication::applicationDirPath(); QSettings setting(strApp + "\\user\\systemfile.ini", QSettings::IniFormat); nGlobalMinImgs = setting.value("/MinImgs/MinNum", 10).toInt(); m_lstHeader = lstHeader; m_pData = pData; m_list = pData->keys(); m_Enable = true; m_ChackEnable = true; } ModelsModel::~ModelsModel() { } QVariant ModelsModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const { if (Qt::DisplayRole == role && Qt::Horizontal == orientation) { if (section >= m_lstHeader.size()) { return QVariant(); } QString str = m_lstHeader.at(section); if ("modelID" == str) { return tr("型号"); } else if ("modelID_detect" == str) { return tr("型号"); } else if ("count" == str) { return tr("数量"); } } return QVariant(); } int ModelsModel::rowCount(const QModelIndex &parent /*= QModelIndex()*/) const { return m_list.size(); } QVariant ModelsModel::data(const QModelIndex &index, int role /*= Qt::DisplayRole*/) const { if (!index.isValid()) return QVariant(); int nCol = index.column(); int nRow = index.row(); if (nRow >= m_list.size()) { return QVariant(); } if (Qt::DisplayRole == role) { QString str = m_lstHeader.at(nCol); if ("modelID" == str || "modelID_detect" == str) { QString strModel = m_list.at(nRow); if (m_pData->contains(strModel)) return m_pData->value(strModel)->getModelID(); } else if ("count" == str) { QString strModel = m_list.at(nRow); if (m_pData->contains(strModel)) return m_pData->value(strModel)->getCount(); } } // if (Qt::CheckStateRole == role) { // QString str = m_lstHeader.at(nCol); // if ("modelID_detect" == str) { // if (m_ChackEnable == true) // return m_pData->value(m_list.at(nRow))->getDetectState() == true ? Qt::Checked : Qt::Unchecked; // else // return QVariant(); // } // } if (Qt::DecorationRole == role) { //根据训练模板的是否成功标志位 设置列表中型号字符串前面的颜色块 绿色表示成功 红色表示失败 黄色表示没有训练 /*The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)*/ QString str = m_lstHeader.at(nCol); if ("modelID" == str){ QString strModel = m_list.at(nRow); if (m_pData->contains(strModel)) { int nTypeModel = m_pData->value(strModel)->getImageModel(); if (nTypeModel == emTypeModelSuccess) return QColor(12, 158, 34); else if (nTypeModel == emTypeModelWarning) return QColor(207, 213, 77); else if (nTypeModel == emTypeModelError) return QColor(239, 32, 32); else return QColor(255, 255, 255); } } } if (Qt::TextColorRole == role){//根据训练模板的图片数量 判断数量是否低于指定的数值,如果低于设定的数值,修改字体颜色 提醒用户 QString str = m_lstHeader.at(nCol); if ("modelID" == str){ QString strModel = m_list.at(nRow); if (m_pData->contains(strModel)) { int nImgNum = m_pData->value(strModel)->getImgCount(); if (nImgNum > 0 && nImgNum < nGlobalMinImgs) return QColor(255, 0, 0); else return QColor(0, 0, 0); } } } if (Qt::BackgroundColorRole == role) {//根据是否加入训练标志位 设置列表对应元素的背景颜色为淡黄色 方便识别被修改的型号 QString str = m_lstHeader.at(nCol); if ("modelID" == str) { QString strModel = m_list.at(nRow); if (m_pData->contains(strModel)) { bool bAddTrain = m_pData->value(strModel)->getAddTrainFlag(); if (bAddTrain == false) return QColor(250, 250, 0,50); else return QVariant(); } } } return QVariant(); } void ModelsModel::setModelList(QStringList strList) { m_list = strList; beginResetModel();//强制刷新 endResetModel(); } void ModelsModel::updateModels() { //m_list = m_pData->keys(); QStringList newlist; for (int nIndex = 0; nIndex < m_list.size(); nIndex++){ QString str = m_list.at(nIndex); if (m_pData->contains(str)) newlist.append(str); } m_list = newlist; beginResetModel();//强制刷新 endResetModel(); } void ModelsModel::update2AllModels() { m_list = m_pData->keys(); // QStringList newlist; // for (int nIndex = 0; nIndex < m_list.size(); nIndex++){ // QString str = m_list.at(nIndex); // if (m_pData->contains(str)) // newlist.append(str); // } // m_list = newlist; beginResetModel();//强制刷新 endResetModel(); } void ModelsModel::update2AllModels(QString strExp) { m_list = m_pData->keys(); m_list.removeAll(strExp); beginResetModel();//强制刷新 endResetModel(); } void ModelsModel::update2CurrentModels() { // update(); beginResetModel();//强制刷新 endResetModel(); } int ModelsModel::columnCount(const QModelIndex &parent /*= QModelIndex()*/) const { return m_lstHeader.size(); } bool ModelsModel::setData(const QModelIndex &index, const QVariant &value, int role /* = Qt::EditRole */) { if (!index.isValid()) return false; int nColumn = index.column(); int nRow = index.row(); if (nRow >= m_list.size()) { return false; } switch (role) { case Qt::DisplayRole: { if (nColumn == 0) { m_pData->value(m_list.at(nRow))->setModelID(value.toString()); emit dataChanged(index, index); return true; } } case Qt::CheckStateRole: case Qt::UserRole: { if (nColumn == 0) { bool B = m_pData->value(m_list.at(nRow))->getDetectState(); m_pData->value(m_list.at(nRow))->setDetectState(1-B);// = value.toBool(); emit dataChanged(index, index); emit sgChangeState(m_list.at(nRow)); return true; } } default: return false; break; } return false; } void ModelsModel::onStateChanged() { } void ModelsModel::onStateChanged(int state) { QModelIndex index; for (int i = 0; i < rowCount(); ++i) { index = this->index(i, 0); setData(index, state == Qt::Checked, Qt::CheckStateRole); } } void ModelsModel::SetCheckShow(bool nEnable) { m_ChackEnable = nEnable; } void ModelsModel::SetItemEnable(bool nEnable) { m_Enable = nEnable; } Qt::ItemFlags ModelsModel::flags(const QModelIndex &index) const { if (!index.isValid()) return QAbstractItemModel::flags(index); Qt::ItemFlags nflags; if (m_Enable) nflags= Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;//| Qt::ItemIsSelectable else { nflags = QAbstractItemModel::flags(index); } return nflags; } Q_SLOT void ModelsModel::onValueChange(QString nStr) { int nRow = 0; if (m_pData->contains(nStr)) { if (m_list.contains(nStr)) nRow = m_list.indexOf(nStr); emit dataChanged(index(nRow, 0), index(nRow, m_lstHeader.size()-1)); } } QString ModelsModel::getModelByRow(int nRow) { if (nRow < m_list.size()) { return m_list.at(nRow); } return QString(); } void ModelsModel::removeModel(QString str) { m_list.removeOne(str); } ModelsView::ModelsView(QTableView *pView, QMap *p) :m_pModel(NULL) { m_pView = pView; QStringList lstHeader = m_pView->property("wheel_prop_tableview_header").toStringList(); m_pView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_pView->setAlternatingRowColors(true); m_pModel = new ModelsModel(lstHeader, p); m_pView->setModel(m_pModel); m_pView->horizontalHeader()->setStretchLastSection(true);//设置最后一列自动填满剩余的空间 m_pView->horizontalHeader()->sectionResizeMode(QHeaderView::ResizeToContents);//设置按内容调整列宽 m_pView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置单行选择 m_pView->setAlternatingRowColors(true);//设置表格交替填充背景色 //tableView->verticalHeader()->setDefaultSectionSize(20);设置默认行高 connect(m_pModel, SIGNAL(sgChangeState(QString)), this, SIGNAL(sgItemStateChange(QString))); connect(this, SIGNAL(sgValueChange(QString)), m_pModel, SLOT(onValueChange(QString))); connect(m_pView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(SlotListViewItem(const QModelIndex &))); } ModelsView::~ModelsView() { if (m_pModel){ delete m_pModel; m_pModel = NULL; } } Q_SLOT void ModelsView::SlotListViewItem(const QModelIndex &nIndex) { emit sgSelectModel(m_pModel->getModelByRow(nIndex.row())); } void ModelsView::update2CurrentModels() { m_pModel->update2CurrentModels(); } void ModelsView::update2AllModels() { m_pModel->update2AllModels(); //m_pModel->removeModel("NG"); } Q_SLOT void ModelsView::update2AllModels(QString strExp)// { m_pModel->update2AllModels(strExp); } void ModelsView::setModelList(QStringList strList) { for (int nIndex = 0; nIndex < strHidItem.size(); nIndex++) { QString str = strHidItem.at(nIndex); strList.removeAll(str); } m_pModel->setModelList(strList); } void ModelsView::setEnable(bool b) { m_pModel->SetItemEnable(b); } void ModelsView::setCheckShow(bool b) { m_pModel->SetCheckShow(b); } void ModelsView::removeModel(QString str) { m_pModel->removeModel(str); } Q_SLOT void ModelsView::updateModels() { m_pModel->updateModels(); }