crossplatform.ru

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

> [Решено] Cоздание собственной модели для отображения таблицы., наследник QAbstractTableModel
AD
  опции профиля:
сообщение 17.3.2009, 15:33
Сообщение #1


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

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

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




Репутация:   17  


Имеется QTableView* tblLicences. Это представление зависит от модели QSqlTableModel* modelLicView. Но есть желание, чтобы отображение таблички было немного другим, чем в базе данных. Для этого создал след. класс:
/// Класс для представления вида одной записи таблицы
class ViewLicence
{
private:
    QString licence_name;            ///< название лицензии
    QString path;                    ///< путь, по которому лежит данная лицензия
    QDateTime date;                    ///< дата создания лицензии
    QStringList list_numbers;        ///< список серийных номеров лицензии
    QList<uint> list_id;            ///< список id-шников данных серийных номеров

public:
    ViewLicence();
    ViewLicence(const QString name, const QString pth, const QDateTime& d, const QStringList& lst,
        const QList<uint>& lId) { licence_name = name; path = pth; date = d; list_numbers = lst; list_id = lId; }
    ViewLicence(const ViewLicence& view) { licence_name = view.licence_name; path = view.path; date = view.date;
        list_numbers = view.list_numbers; list_id = view.list_id; }
    virtual ~ViewLicence();
    uint size() const { return list_numbers.size(); }
    uint elementIndex(QString num) const { return list_numbers.indexOf(num, 0); }
    uint ID(uint index) const { return (index > -1 && index < size()) ? list_id[index] : -1; }
    QString licenceName() const { return licence_name; }
    QString licencePath() const { return path; }
    QString serialNumber(uint index) const { return (index > -1 && index < size()) ? list_numbers[index] : ""; }
    QDateTime createDate() const { return date; }
    void licenceName(const QString name) { licence_name = name; }
    void licencePath(const QString pth) { path = pth; }
    void addNum(const QString number) { if(!number.isEmpty()) list_numbers.append(number); }
    void createDate(const QDateTime& d) { date = d; }
    void ID(const uint id) { list_id.append(id); }
    bool operator==(const ViewLicence& lv) { return licence_name == lv.licence_name && path == lv.path &&
        date == lv.date && list_numbers == lv.list_numbers && list_id == lv.list_id; }
    const ViewLicence& operator=(const ViewLicence& lv) { licence_name = lv.licence_name; path = lv.path;
        date = lv.date; list_numbers = lv.list_numbers; list_id = lv.list_id; return *this; }
};

Смысл такой, что таблица должна отображаться так:
Имя лицензии | Локальный путь доступа к лицензии | Дата создания | Список серийных номеров.
У меня есть список QList<ViewLicence*> listView, который я уже заполнил из модели.

А в БД это отображается следующим образом
[attachment=497:table.JPG]

Как мне отобразить список QList<ViewLicences*> listView в представлении? Поможете, а то не сообразить что-то?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2009, 16:56
Сообщение #2


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

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

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




Репутация:   94  


для случая таблицы, а не дерева можно сделать так:
  QSqlDataBase        db;
  QString            qstr;
  QSqlQueryModel    *m;
  QTableView        *view;
  
    db = QSqlDatabase::database("myDb");
    qstr = "SELECT a.licence_name, a.create_date, a.serialnumber FROM MyTable a ORDER BY a.licence_name";
    
    m = new QSqlQueryModel;
    m->setQuery(qstr, db);
    m->setHeaderData(0, Qt::Horizontal, tr("Лицензия"));
    m->setHeaderData(1, Qt::Horizontal, tr("Дата"));
    m->setHeaderData(2, Qt::Horizontal, tr("Серийный\nномер"));
    
    view = new  QTableView(this);
    view->setModel(m);
но это без имени файла лицензии.
Для создания имени у меня есть два варианта, оба я непробовал:
1) Использовать возможности БД, если таковые есть, по формированию запроса так, чтобы можно было выкинуть из строки все что до последнего слэша.
2) Использовать между представлением и моделью еще одну - промежуточную модель.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 9:03
Сообщение #3


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 17.3.2009, 16:56) *
но это без имени файла лицензии.
Для создания имени у меня есть два варианта, оба я непробовал:
1) Использовать возможности БД, если таковые есть, по формированию запроса так, чтобы можно было выкинуть из строки все что до последнего слэша.
2) Использовать между представлением и моделью еще одну - промежуточную модель.

Спасибо, попробую.
Смысл в том, что хочу именно с путем и файлом лицензии. А как через промежуточную модель или через SQL? Но в любом случае, спасибо. Данный вариант уже кое-что! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 9:48
Сообщение #4


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

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

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




Репутация:   17  


Блин, получилось не так, как я хотел. Есть желание, чтобы это выглядело так, две записи, в которых в последнем столбце перечислены серийные номера, принадлежащие данным лицензиям. А исходя из приведенного кода получилось то же, что если сделать обычную выборку без первого столбца.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 11:52
Сообщение #5


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

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

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




Репутация:   17  


Кое-что из ассистента почитал и сделал так:
/// Отображение таблицы статистики
/// modelView - QSqlTableModel*
/// listView - QList<ViewLicence*>
void StatisticView::viewTable()
{
    int count = listView.size();
    for(register int row=0; row<listView.size(); ++row)
    {
        ViewLicence* view = listView[row];
        QSqlRecord record;
        record.setValue(QString("licence_name"), view -> licenceName());
        record.setValue(QString("create_date"), view -> createDate());
        record.setValue(QString("serialnumber"), view -> listNumbers());
        bool flag = modelView -> insertRecord(row, record);
        int sss2 = 0;
    }
    tblLicences -> setModel(modelView);
}

Но на экране вижу только квадрати и цифру 1. В чем ошибка? Где и что я не так делаю? :(

Кто-нибудь может помочь? Очень и очень нужно. Буду благодарен за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.3.2009, 11:57
Сообщение #6


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

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

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




Репутация:   44  


Почему не сделать свою модель и не обрабатывать нужный столбец "Серийный номер"?
Все данные есть, запросил view серийные номера для нужной строки - открыл нужный файл, прочитал их в строку через ";" (закешировать можно), вернул из data().
Или в конструкторе модели сделал запрос, загнал все в список структуры (попутно читая серийные номера из файлов), а дальше в data() возвращай?
Или я чего не понял? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 14:08
Сообщение #7


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

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

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




Репутация:   17  


еще несколько уточнений:
1) Правильно понял, что заполненный QListView<ViewLicence*> listView передать этому наследнику и заполнить значениями модель?
2) Каким образом можно заполнять, с помощью какой функции: setData?

Сообщение отредактировал AD - 18.3.2009, 14:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.3.2009, 14:21
Сообщение #8


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

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

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




Репутация:   44  


LicenceModel

struct LicenceData
{
    QString licence_name;    ///< название лицензии
    QString path;        ///< путь, по которому лежит данная лицензия
    QDateTime date;        ///< дата создания лицензии
    QStringList list_numbers;    ///< список серийных номеров лицензии
    QList<uint> list_id;    ///< список id-шников данных серийных номеров
};

typedef QList<LicenceData> LicenceList;

class LicenceModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    ActionModel( const LicenceList &actions, QObject *parent = 0 );

    // В зависимости от указанного индекса и роли возвращает данные о лицензии (берет все из m_licences)
    virtual    QVariant        data( const QModelIndex &index, int role ) const;

    // Возвращает флаги ячейки (return Qt::ItemIsEnabled | Qt::ItemIsSelectable;)
        virtual    Qt::ItemFlags        flags( const QModelIndex &index ) const;

    // Возвращает имена секций (берет из списка m_columnNames, который формируется в конструкторе модели)
        virtual    QVariant        headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;

    // Возвращает число строк (return m_licences.size();)
    virtual    int            rowCount( const QModelIndex &parent = QModelIndex() ) const;
    // Возвращает число столбцов (return m_columnNames.size();)
    virtual int            columnCount( const QModelIndex &parent = QModelIndex() ) const;

private:
    QStringList    m_columnNames;            //!< Список строк с названием столбцов.
    LicenceList    m_licences;            //!< Список данных о лицензиях.
};



В данном примере ты должен заполнить список лицензий извне, модель будет использовать его для вывода.
Можно переделать и формировать этот список в конструкторе.
Можно в самой моделе читать данные из БД.
Все можно. ;)

Сообщение отредактировал BRE - 18.3.2009, 14:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 14:50
Сообщение #9


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

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

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




Репутация:   17  


Спасибо. Попробую! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.3.2009, 16:40
Сообщение #10


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

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

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




Репутация:   17  


Цитата(AD @ 18.3.2009, 14:50) *
Спасибо. Попробую! :)

ActionModel( const LicenceList &actions, QObject *parent = 0 ); - имелся в виду конструктор? :))))

А какой должно быть значение переменной role, если разрешен только просмотр записей?

Сообщение отредактировал AD - 18.3.2009, 16:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   [Решено] Cоздание собственной модели для отображения таблицы.   17.3.2009, 15:33
- - Litkevich Yuriy   Цитата(AD @ 17.3.2009, 18:33) У меня есть...   17.3.2009, 16:05
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:05...   17.3.2009, 16:07
- - Litkevich Yuriy   конечное представление должно предоставлять возмож...   17.3.2009, 16:08
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:08...   17.3.2009, 16:09
- - Litkevich Yuriy   тогда сделай запрос, положи его в модель запроса (...   17.3.2009, 16:13
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:13...   17.3.2009, 16:15
- - Litkevich Yuriy   Цитата(AD @ 17.3.2009, 18:33) Имя лицензи...   17.3.2009, 16:20
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:20...   17.3.2009, 16:29
- - Litkevich Yuriy   Цитата(AD @ 17.3.2009, 19:29) 1 database....   17.3.2009, 16:37
|- - AD   Таблица удобнее пользователю. Да и нагляднее.   17.3.2009, 16:45
- - Litkevich Yuriy   т.е. что-то такое: да?   17.3.2009, 16:45
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:45...   17.3.2009, 16:51
- - Litkevich Yuriy   для случая таблицы, а не дерева можно сделать так:...   17.3.2009, 16:56
|- - AD   Цитата(Litkevich Yuriy @ 17.3.2009, 16:56...   18.3.2009, 9:03
|- - AD   Блин, получилось не так, как я хотел. Есть желание...   18.3.2009, 9:48
|- - AD   Кое-что из ассистента почитал и сделал так: /// От...   18.3.2009, 11:52
|- - BRE   Почему не сделать свою модель и не обрабатывать ну...   18.3.2009, 11:57
|- - AD   Цитата(BRE @ 18.3.2009, 11:57) Все данные...   18.3.2009, 12:53
||- - BRE   Цитата(AD @ 18.3.2009, 12:53) Не понял, к...   18.3.2009, 13:21
|- - AD   еще несколько уточнений: 1) Правильно понял, что з...   18.3.2009, 14:08
|- - BRE   LicenceModel struct LicenceData { QString licence...   18.3.2009, 14:21
|- - AD   Спасибо. Попробую!   18.3.2009, 14:50
|- - AD   Цитата(AD @ 18.3.2009, 14:50) Спасибо. По...   18.3.2009, 16:40
|- - BRE   Цитата(AD @ 18.3.2009, 16:40) ActionModel...   18.3.2009, 17:18
- - Litkevich Yuriy   Цитата(BRE @ 18.3.2009, 20:18) В data пер...   18.3.2009, 17:46
|- - AD   Не могу понять, по какой причине на вот этом break...   19.3.2009, 11:44
|- - BRE   Раскрывающийся текст /// Класс модели для отображе...   19.3.2009, 12:11
|- - AD   Сделал наследником от QAbstractTableModel. Но тепе...   19.3.2009, 14:07
|- - BRE   Цитата(AD @ 19.3.2009, 14:07) Сделал насл...   19.3.2009, 14:27
|- - AD   Виноват. Когда заполнил названия столбцов, все ото...   19.3.2009, 14:51
|- - AD   Вот окончательный вариант решения! Model/// К...   19.3.2009, 16:36
|- - BRE   Цитата(AD @ 19.3.2009, 16:36) class Stati...   19.3.2009, 16:58
|- - AD   Уговорил Напишу деструктор! А вообще вот по...   19.3.2009, 17:40
|- - BRE   Цитата(AD @ 19.3.2009, 17:37) А вообще во...   19.3.2009, 17:43
- - Litkevich Yuriy   так тему почистил, отделил тему kuler'а, тепер...   13.4.2009, 13:51


Тема закрытаНачать новую тему
Теги
Нет тегов для показа


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


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