crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  « < 2 3 4  
Тема закрытаНачать новую тему
> [Решено] Cоздание собственной модели для отображения таблицы., наследник QAbstractTableModel
AD
  опции профиля:
сообщение 19.3.2009, 14:51
Сообщение #31


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Виноват. Когда заполнил названия столбцов, все отобразилось!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.3.2009, 16:36
Сообщение #32


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вот окончательный вариант решения! :)
Model
/// Класс модели для отображения статистики созданных лицензий
class StatisticModel: public QAbstractTableModel
{
    Q_OBJECT

private:
    QList<LicenceData*> listView;        ///< список указателей на данные о лицензии
    QStringList listClmNames;            ///< список названий столбцов

private:
    void addDataTable(LicenceData* view, const QString& lic_name, const QString& path, const QDateTime& date,
                const QString& serialNumber, const uint& id);
    void createHeaderList();
    void createList();

public:
    StatisticModel(QObject *parent = 0);
    ~StatisticModel();
    virtual Qt::ItemFlags flags(const QModelIndex &index) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
    virtual int rowCount(const QModelIndex& parent = QModelIndex()) const { return listView.size(); }
    virtual int columnCount(const QModelIndex& parent = QModelIndex()) const { return listClmNames.size(); }
    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
};

StatisticModel::StatisticModel(QObject *parent): QAbstractTableModel(parent)
{
    createHeaderList();
    createList();
}

StatisticModel::~StatisticModel()
{}

/// Добавление в элемент строки таблицы представления view данных
void StatisticModel::addDataTable(LicenceData* view, const QString& lic_name, const QString& path,
            const QDateTime& date, const QString& serialNumber, const uint& id)
{
    view -> licenceName(lic_name);
    view -> licencePath(path);
    view -> createDate(date);
    view -> addID(id);
    view -> addNum(serialNumber);
}

/// Создание списка данных о лицензиях
void StatisticModel::createList()
{
    QSqlTableModel model(this, db);
    model.setTable("LogLicence");
    model.select();

    for(register int row=0; row<model.rowCount(); ++row)
    {
        QSqlRecord record(model.record(row));
        if(record.isEmpty())
            break;
        QDateTime date(record.value(QString("create_date")).toDateTime());
        QString fullNameLic(record.value(QString("licence_name")).toString());
        QString serialNumber(record.value(QString("serialnumber")).toString());
        if(fullNameLic.isEmpty() || serialNumber.isEmpty() || !date.isValid())
            break;
        if(row > 0)
        {
            QSqlRecord prev_rec(model.record(row - 1));
            if(date.toTime_t() == prev_rec.value(QString("create_date")).toDateTime().toTime_t() &&
                fullNameLic == prev_rec.value("licence_name").toString() &&
                serialNumber != prev_rec.value("serialnumber").toString())
            {
                listView.last() -> addNum(serialNumber);
                listView.last() -> addID(record.value(0).toUInt());
            }
            else
            {
                QString lic_name(QFileInfo(fullNameLic).fileName()), path(QFileInfo(fullNameLic).path()
                            + QDir::separator());
                LicenceData* view(new LicenceData());
                addDataTable(view, lic_name, path, date, serialNumber, record.value(0).toUInt());
                listView.append(view);
            }
        }
        else
        {
            QString lic_name(QFileInfo(fullNameLic).fileName()), path(QFileInfo(fullNameLic).path()
                            + QDir::separator());
            LicenceData* view(new LicenceData());
            addDataTable(view, lic_name, path, date, serialNumber, record.value(0).toUInt());
            listView.append(view);
        }
    }
}

/// Возвращает данные о лицензии в зависимости от индекса и роли
QVariant StatisticModel::data(const QModelIndex& index, int role) const
{
    if(!index.isValid() || role != Qt::DisplayRole)
        return QVariant();

    QVariant result;
    LicenceData* view(listView.at(index.row()));
    switch(index.column())
    {
    case 0:
        result.setValue(view -> licenceName());
    break;
    case 1:
        result.setValue(view -> licencePath());
    break;
    case 2:
        result.setValue(view -> createDate());
    break;
    case 3:
    {
        QString numbers("");
        foreach(QString nums, view -> listNumbers())
        {
            numbers += nums;
            numbers += "\n";
        }
        result.setValue(numbers);
    break;
    }
    }
    return result;
}

/// Создание заголовочного списка
void StatisticModel::createHeaderList()
{
    listClmNames.append(QString("Название\nлицензии"));
    listClmNames.append(QString("Локальный путь\nк лицензии"));
    listClmNames.append(QString("Дата создания"));
    listClmNames.append(QString("Серийные\nномера"));
}

/// Возвращает данные о заголовках таблицы
QVariant StatisticModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role != Qt::DisplayRole)
         return QVariant();

    QString result("");
    if(orientation == Qt::Horizontal && !listClmNames.isEmpty())
    {
        result = listClmNames.at(section);
        return QVariant(result);
    }
    else
        return QAbstractTableModel::headerData(section, orientation, role);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 19.3.2009, 16:58
Сообщение #33


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 19.3.2009, 16:36) *
class StatisticModel: public QAbstractTableModel
{
    Q_OBJECT

private:
    QList<LicenceData*> listView;        ///< список указателей на данные о лицензии

...

}

Вот объясни мне, для чего используются указатели на LicenceData, а не сами объекты? ;)
Где они удаляются, после разрушения объекта StatisticModel.
Сейчас у тебя память будет утекать.

А описал бы список так QList<LicenceData> listView и проблем бы не было.
В чем тайный смысл? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.3.2009, 17:40
Сообщение #34


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Уговорил :) Напишу деструктор! :)

А вообще вот почему указатель, а не объект:
1) Данные могут со временем измениться, чтобы если что создать потомка.
2) Описан класс в другом файле - меньшее количество компиляции.

StatisticModel::~StatisticModel()
{
    foreach(LicenceData* view, listView)
    {
        delete view;
        view = 0;
    }
    listView.clear();
}

Вот так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 19.3.2009, 17:43
Сообщение #35


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 19.3.2009, 17:37) *
А вообще вот почему указатель, а не объект:
1) Данные могут со временем измениться, чтобы если что создать потомка.
2) Описан класс в другом файле - меньшее количество компиляции.

Аргумент 2 - можно обойти.
Аргумент 1 - если есть такая необходимость, то конечно. (Я к этой структуре относился как к вспомогательно/внутренней).

Ухожу, ухожу.... :D ;)

Ан нет, еще про одну штучку напомню: ;)
Цитата из assistant

Цитата
void qDeleteAll ( ForwardIterator begin, ForwardIterator end )
Deletes all the items in the range [begin, end) using the C++ delete operator. The item type must be a pointer type (for example, QWidget *).
Example:
QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));

qDeleteAll(list.begin(), list.end());
list.clear();
Notice that qDeleteAll() doesn't remove the items from the container; it merely calls delete on them. In the example above, we call clear() on the container to remove the items.
See also forward iterators.
void qDeleteAll ( const Container & c )
This is an overloaded member function, provided for convenience.
This is the same as qDeleteAll(c.begin(), c.end()).



Сообщение отредактировал BRE - 19.3.2009, 17:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.4.2009, 13:51
Сообщение #36


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


так тему почистил, отделил тему kuler'а, теперь она здесь: QSqlQueryModel + QTableView, Данные не отображаются
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  « < 2 3 4
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 8.7.2025, 1:41