c++qtqt5qsqlrelationaltablemodel

QSqlRelationalTableModel displaying an icon instead of data


I'm displaying a table that contains one column with a blob (pdf file). I could have hide the column for the user, but instead i wanted to show a icon in the column when it was a document on file. I subclassed QsqlRealtionalTableModel and overload the data function. Shown below. My problem is that now the icon is showing along with the garbled data from the PDF. I thought that this overload function was substituting the icon for the data.

QVariant RelationalTableModelWithIcon::data(const QModelIndex &item, int role) const
{
  if(item.column() == 3 && role == Qt::DecorationRole)
    {
      QSqlRecord r= record(item.row());
      QByteArray a= r.field(3).value().toByteArray();
      QIcon icon = QIcon(":/icons/Art/Icons/Iynque-Flat-Ios7-Style-Documents-Pdf.ico");
      if(a.isNull() == false)
        {
          return QVariant(icon);
        }
    }
  return QSqlRelationalTableModel::data(item,role);
}

DROP TABLE IF EXISTS `ComOper`.`documentsqueue` ;

CREATE TABLE IF NOT EXISTS `ComOper`.`documentsqueue` (
  `iddocumentsqueue` INT NOT NULL AUTO_INCREMENT,
  `iddocument` INT NULL DEFAULT 1,
  `name` VARCHAR(45) NOT NULL,
  `image` MEDIUMBLOB NULL,
  `dateEntered` DATE NULL,
  `dateExpired` DATE NULL,
  `dateApproved` DATE NULL,
  `notes` MEDIUMTEXT NULL,
  `archived` TINYINT NULL DEFAULT 0,
  `iddocType` INT NOT NULL DEFAULT 1,
  `idsupplier` INT NOT NULL,
  `idfacilities` INT NOT NULL DEFAULT 1,
  `idproducts` INT NOT NULL DEFAULT 1,
  `iduser` INT NOT NULL DEFAULT 1,
  PRIMARY KEY (`iddocumentsqueue`),
  CONSTRAINT `fk_documentsqueue_docType1`
    FOREIGN KEY (`iddocType`)
    REFERENCES `ComOper`.`docType` (`iddocType`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_documentsqueue_documents1`
    FOREIGN KEY (`iddocument`)
    REFERENCES `ComOper`.`documents` (`iddocument`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_documentsqueue_user1`
    FOREIGN KEY (`iduser`)
    REFERENCES `ComOper`.`user` (`iduser`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_documentsqueue_products1`
    FOREIGN KEY (`idproducts`)
    REFERENCES `ComOper`.`products` (`idproducts`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_documentsqueue_facilities1`
    FOREIGN KEY (`idfacilities`)
    REFERENCES `ComOper`.`facilities` (`idfacilities`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_documentsqueue_supplier1`
    FOREIGN KEY (`idsupplier`)
    REFERENCES `ComOper`.`supplier` (`idsupplier`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

Solution

  • So that you do not show the unreadable text of the PDF you must return an empty string when they ask for the Qt::DisplayRole role and return the icon when they ask for the Qt::DecorationRole role. I also recommend reading the icon once only if it is unique, which I show below:

    *.h

    private:
        QIcon icon;
    

    *.cpp

    RelationalTableModelWithIcon::RelationalTableModelWithIcon(QObject *parent, QSqlDatabase db):
        QSqlRelationalTableModel(parent, db)
    {
        icon =  QIcon(":/icons/Art/Icons/Iynque-Flat-Ios7-Style-Documents-Pdf.ico");
    }
    QVariant RelationalTableModelWithIcon::data(const QModelIndex &index, int role) const
    {
        if(index.column() == 3){
            if(role == Qt::DisplayRole)
                return "";
            else if ( role == Qt::DecorationRole)
                return icon;
        }
        return QSqlRelationalTableModel::data(index, role);
    }