Как показать значки, используйте QSqlRelationalTableModel и QTableView в каждой строке

Теперь я пытаюсь использовать QSqlRelationalTableModel и QTableView для отображения моих данных в базе данных в соответствии со свойством «fileType», например «doc, txt, exe, sln», для отображения значка в первом столбце.

    dirModel=new QSqlRelationalTableModel(this);
    dirModel->setTable("ecm_doc");
    dirModel->setFilter(QString("creatoruserid='%1' and parentid='%2'").arg(userid).arg(parentid));
    dirModel->select();
    dirView=new QTableView(this);
    dirView->setItemDelegate(new DirDelegate(this));

    dirView->setModel(dirModel);
    dirView->setSelectionMode(QAbstractItemView::SingleSelection);

     showIcon();

void DirTree::showIcon()
{
    int rowCount = dirModel->rowCount();
    for(int row = 0; row < rowCount; row++)
    {
//here is a test.
        QModelIndex index = dirModel->index(row, 1);
        QIcon folderIcon(style()->standardPixmap(QStyle::SP_DirClosedIcon));
        dirModel->setData(index, folderIcon, Qt::DecorationRole);
    }
}

Помогите, онлайн ждите :)


person Aliceljm    schedule 21.03.2013    source источник


Ответы (1)


Вы должны создать подкласс QSqlRelationalTableModel и повторно реализовать функцию data(), чтобы указать значок:

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    // I assume that 1 is the db table column with the filetype property 
    if (index.column() == 1 && role == Qt::DecorationRole)
    {
       QSqlRecord r = modelRecord(index.row());
       QString fileType = r.field(1).value().toString();

       QIcon icon; 
       if (fileType == "exe")
          icon = QIcon(":/PathToIcon/exe.png");
       else if (fileType == "sln")
          icon = QIcon(":/PathToIcon/sln.png"); 
       ...
       return QVariant(icon);
    }

    return QSqlRelationalTableModel::data(index, role);
}
person pnezis    schedule 21.03.2013
comment
Ну, вы мне очень помогаете, но как я могу получить объект modelRecord? Должен ли я получить его из базового класса QSqlRelationalTableModel? Я перезаписываю только данные. вернуть getIconFromType(r.field(9).value().toString()); } вернуть QSqlRelationalTableModel::data(item,role); } - person Aliceljm; 22.03.2013
comment
Большое спасибо, я прочитал мою книгу и получил ее.QVariant SqlTableModel::data(const QModelIndex &item, int role) const { if(role==Qt::DecorationRole&&item.column()==Doc_DocType) { QSqlRecord r=this->record(item.row()); return QVariant(getIconFromType(r.field(Doc_DocType).value().toString())); } return QSqlRelationalTableModel::data(item,role); } - person Aliceljm; 22.03.2013