2017-08-29 11 views
0

ブロブ(pdfファイル)を含む1つの列を含むテーブルを表示しています。私はユーザーのための列を隠すことができたかもしれませんが、代わりに私はそれがファイル上のドキュメントだったときに列にアイコンを表示したかったのです。 QsqlRealtionalTableModelをサブクラス化し、データ関数をオーバーロードしました。下に示された。私の問題は、アイコンがPDFの文字化けしたデータと共に表示されていることです。私は、このオーバーロード機能がアイコンの代わりにデータを使用していると考えました。データの代わりにアイコンを表示するQSqlRelationalTableModel

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) 
+0

あなたのデータベースを共有することができますあなたのコードをテストしてください、あなたはデータベースとしてsqliteを使用していると思います。 – eyllanesc

+0

MySqlワークベンチからcreate文を追加しました。 – Dan3460

+0

実際、それはまったく役に立ちませんが、私はあなたがそのデータベースを使用するいくつかのポストでは、質問するときにsqliteでテストデータベースを実行することをお勧めします。 – eyllanesc

答えて

1

あなたはPDFの読めないテキストを表示しないように、彼らはQt::DisplayRole役割を求めるときには、空の文字列を返す必要があり、彼らはQt::DecorationRole役割を頼むときのアイコンを返します。また、私は以下を示しており、それが一意である場合にのみ、アイコンを一度読んでお勧めします。

* .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); 
} 
+0

それは、完璧に動作します。どうもありがとう – Dan3460

関連する問題