Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QSqlRelationalTableModel显示图标而不是数据_C++_Qt_Qt5_Qsqlrelationaltablemodel - Fatal编程技术网

C++ QSqlRelationalTableModel显示图标而不是数据

C++ QSqlRelationalTableModel显示图标而不是数据,c++,qt,qt5,qsqlrelationaltablemodel,C++,Qt,Qt5,Qsqlrelationaltablemodel,我正在显示一个表,其中包含一个带有blob(pdf文件)的列。我本来可以为用户隐藏该列,但是当它是文件中的文档时,我想在该列中显示一个图标。我将qsqlrealtationaltablemodel子类化,并重载数据函数。如下所示。我的问题是,现在图标与PDF中的乱码数据一起显示。我认为这个重载函数是在用图标代替数据 QVariant RelationalTableModelWithIcon::data(const QModelIndex &item, int role) const {

我正在显示一个表,其中包含一个带有blob(pdf文件)的列。我本来可以为用户隐藏该列,但是当它是文件中的文档时,我想在该列中显示一个图标。我将qsqlrealtationaltablemodel子类化,并重载数据函数。如下所示。我的问题是,现在图标与PDF中的乱码数据一起显示。我认为这个重载函数是在用图标代替数据

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);
}


为了不显示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);
}

您可以共享数据库以测试代码,我想您使用的是sqlite作为数据库。我添加了MySql workbench中的create语句。实际上这一点都没有帮助,我在几篇文章中看到您使用了该数据库,我建议您在需要时在sqlite中测试数据库。尝试我的解决方案
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);
}