Russian Qt Forum
Май 02, 2024, 18:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: опять по QAbstractItemModel  (Прочитано 9048 раз)
izoomer
Гость
« : Ноябрь 21, 2006, 22:50 »

QT-4.2 Linux
У меня такой вот код
Код:

ListDir.h

#ifndef LISTDIR_H
#define LISTDIR_H

#include <QAbstractListModel>
#include <QVariant>
#include <QStringList>

class ListDir : public QAbstractListModel
{
    Q_OBJECT
public:
    ListDir(QStringList &strings, QObject * parent = 0)
        : QAbstractListModel(parent),stringList(strings) {}
    int rowCount(const QModelIndex &index) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
private:
    QStringList stringList;
};
#endif

Код:

ListDir.cpp

#include <QtGui>
#include <QDir>

#include "ListDir.h"

int ListDir::rowCount(const QModelIndex &parent = QModelIndex()) const
{
    return stringList.count();
}
QVariant ListDir::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) return QVariant();
    if (!index.row() >= stringList.size()) return QVariant();
    if (role == Qt::DisplayRole) stringList.at(index.row());
        else return QVariant();
}


В основном коде пишу
Код:

    const char * path = "/";

    QDir dir(path);
    dir.setFilter(QDir::Dirs);
    QStringList fileList = dir.entryList();

    model = new ListDir(fileList,this);

    QListView *dirList = new QListView(this);
    dirList->setModel(model);


я понимаю что для полноты чего то не хватает, но не пойму чего. Документацию читаю, но логику модель/представления пока не до конца понимаю. Покажите на моем коде чего как надо изменить, что бы в списке был список папок из указанной директории. Буду очень признателен, на примере все таки легче будет понять. Спасибо.
Записан
bigirbis
Гость
« Ответ #1 : Ноябрь 22, 2006, 12:51 »

А чем стандартная QDirModel не подходит?
Установил rootIndex
Установил фильтр только на файлы
Скрыл ненужные столбцы...
Записан
izoomer
Гость
« Ответ #2 : Ноябрь 23, 2006, 01:27 »

А можно с примером кода пожалуйста. Недопонимаю я пока в моделях и представлениях.

добавлено спустя 4 часа 1 минуту:

 Не пойдет QDirModel - нельзя связать с двумя представлениями . Если я для одного буду выставлять setRootIndex(QModelIndex) то и на втором представлением отразится.
Записан
bigirbis
Гость
« Ответ #3 : Ноябрь 23, 2006, 19:47 »

По идее не должно - setRootIndex проводится для представления, а не для модели.
Если действительно такой косяк есть, посмотри справку по прокси-моделям
Записан
izoomer
Гость
« Ответ #4 : Ноябрь 23, 2006, 22:10 »

ну не пойму блин я єтих моделей. Откуда модель берет данныые для себя .... я от сделал так
прописал в реализации ListDir ( в дополнение к вышеуказаному в посте коду)
Код:

void ListDir::setupMyList()
{
    beginInsertRows(QModelIndex(), 0, 4);
    stringList.insert(0,"Test_1");
    stringList.insert(1,"Test_2");
    stringList.insert(2,"Test_3");
    stringList.insert(3,"Test_4");
    endInsertRows();
}

Затем вызываю
Код:

    model = new ListDir(this);
    model->setupMyList();
    QListView *mydir = new QListView(this);
    mydir->setModel(model);


а лист пустой !!!
Ну намекните кодом - чего я  не так понимаю ?![/code]
Записан
itan
Гость
« Ответ #5 : Ноябрь 24, 2006, 10:30 »

За отображение данных во вьюхе отвечает метод
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const = 0

Вот как это примерно делается:
Код:
class CAELogModel : public QAbstractTableModel
{
public:
    CAELogModel(QObject* parent);
    ~CAELogModel();    

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;

    QVariant data(const QModelIndex &index, int role) const;

private:
QVector<CLogEvent> m_events;
}

    ....

QVariant CAELogModel::data(const QModelIndex &index, int role) const
{
Q_ASSERT(index.row() < m_events.count());

if(!index.isValid())
return QVariant();

int row = index.row();

switch(role)
{
case Qt::DisplayRole:
{
const CLogEvent& logEvent = m_events.at(row);
switch(index.column())
{
case 0: return logEvent.hostName();
case 1: return logEvent.timestamp().toString("dd.MM.yyyy hh:mm:ss");
case 2: return logEvent.operation();
case 3: return logEvent.description();
case 4: return logEvent.object_uid().toString();
case 5: return logEvent.advanced_details();
}
}
break;

return QVariant();
}

int CAELogModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_events.count();
}

int CAELogModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 6;
}
Записан
izoomer
Гость
« Ответ #6 : Ноябрь 24, 2006, 18:48 »

ну а в моем случае как нужно data прописать ?

добавлено спустя 1 час 36 минут:

  у меня то реализовано data и возвращает строку из myList.
Что не так ?
Записан
izoomer
Гость
« Ответ #7 : Ноябрь 26, 2006, 21:47 »

Ну подскажите почему у меня data не работает ?
Записан
izoomer
Гость
« Ответ #8 : Ноябрь 29, 2006, 00:14 »

Ну подскажите , что нужно изменить в моем класе что бы в ListView элементарно строки отобразить ? Я в расстерянности.
Записан
itan
Гость
« Ответ #9 : Ноябрь 29, 2006, 09:42 »

Цитата: "izoomer"
Ну подскажите , что нужно изменить в моем класе что бы в ListView элементарно строки отобразить ? Я в расстерянности.


Пробуй так:
Код:
QVariant ListDir::data(const QModelIndex &index, int role) const 
{
if (!index.isValid())
return QVariant();

if (index.row() >= stringList.size())
return QVariant();

switch (role)
{
case Qt::DisplayRole:
return stringList.at(index.row());
break;

default:;
}

return QVariant();
}
Записан
izoomer
Гость
« Ответ #10 : Ноябрь 29, 2006, 11:07 »

У меня так и есть ....
Код:

if (role == Qt::DisplayRole) stringList.at(index.row());
        else return QVariant();

нифига ... не отображает список
Записан
itan
Гость
« Ответ #11 : Ноябрь 29, 2006, 11:34 »

Найдите 10 отличий:
Код:

if (role == Qt::DisplayRole) stringList.at(index.row());
        else return QVariant();

Код:
if (role == Qt::DisplayRole) return stringList.at(index.row()); 
        else return QVariant();
Записан
izoomer
Гость
« Ответ #12 : Декабрь 01, 2006, 21:46 »

да уж .... спасибо ... сам бы видать ещё не один день сидел бы ... надо меньше работать.
Спасибо всем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.