crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Большая таблица
sidsukana
  опции профиля:
сообщение 28.4.2011, 19:49
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Есть таблица 22357*173 :) Через QTableView и QStandardItemModel заполняется медленно и очень много оперативки сжирает. Есть ли иной способ составления такой таблицы, при условии что там только текст и числа? Понимаю что нужно под себя писать на основе QAbstract но пока еще не дошел о этого :)

Блин не в том разделе создал :( Из поиска не вышел, нажал новую тему :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vass
  опции профиля:
сообщение 29.4.2011, 1:14
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 17.3.2009
Из: Россия, Рыбинск
Пользователь №: 617

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




Репутация:   0  


Дайте, попробую угадать, вы сначала рисуете вью с прицепленной к нему моделью а потом начинаете модель заполнять?
Попробуйте скрыть вью, заполнить модель и снова показать вью, должно стать значительно быстрее,
дело в том что Qt пытается перерисовать виджет после каждого добавления новой строки. вот и получается медленно, впрочем от пожирания памяти вас это не спасет.
От памати надо свою модель писать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.4.2011, 10:31
Сообщение #3


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

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

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




Репутация:   94  


Цитата(sidsukana @ 28.4.2011, 22:49) *
и QStandardItemModel
Эта модель сделана для простоты использования/освоения концепции Модель/Представление. Она очень медленная, для больших наборов данных она не пригодна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 29.4.2011, 16:02
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Цитата(Vass @ 29.4.2011, 4:14) *
Дайте, попробую угадать, вы сначала рисуете вью с прицепленной к нему моделью а потом начинаете модель заполнять?
Попробуйте скрыть вью, заполнить модель и снова показать вью, должно стать значительно быстрее,
дело в том что Qt пытается перерисовать виджет после каждого добавления новой строки. вот и получается медленно, впрочем от пожирания памяти вас это не спасет.
От памати надо свою модель писать.


Нет, вьювер есть, но модель то я заполняю заранее, а только уже готовую применяю.

Цитата(Litkevich Yuriy @ 29.4.2011, 13:31) *
Цитата(sidsukana @ 28.4.2011, 22:49) *
и QStandardItemModel
Эта модель сделана для простоты использования/освоения концепции Модель/Представление. Она очень медленная, для больших наборов данных она не пригодна.


Ясно будем пытаться сделать свою :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 29.4.2011, 20:56
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Набросал простой пример, может прояснит ситуацию.

Сам, тоже, еще разбираюсь.


Прикрепленные файлы
Прикрепленный файл  simpleTableView.zip ( 3.02 килобайт ) Кол-во скачиваний: 129
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 29.4.2011, 22:59
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Это в примерах я уже тоже нашел и переписал под себя, однако сейчас таблица пустая так тормозит как будто отрисовка идет постоянно, как решить такое?

.h
Раскрывающийся текст
class DBCTableModel : public QAbstractTableModel
{
    Q_OBJECT
    
public:
    DBCTableModel(QObject *parent = 0, DTForm *form = NULL);
    DBCTableModel(QMap<quint32, QMap<quint32, QString>> dataMap, QObject *parent = 0, DTForm *form = NULL);

    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole);
    bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
    bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
    QMap<quint32, QMap<quint32, QString>> getMap();

private:
    QMap<quint32, QMap<quint32, QString>> dataMap;
    DTForm* m_form;
};


.cpp
Раскрывающийся текст
DBCTableModel::DBCTableModel(QObject *parent, DTForm *form)
    : QAbstractTableModel(parent), m_form(form)
{
}

DBCTableModel::DBCTableModel(QMap<quint32, QMap<quint32, QString>> data, QObject *parent, DTForm *form)
    : QAbstractTableModel(parent), m_form(form)
{
    dataMap = data;
}

int DBCTableModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_form->GetRecordCount();
}

int DBCTableModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_form->GetFieldCount();
}

QVariant DBCTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (index.row() >= dataMap.size() || index.row() < 0)
        return QVariant();

    if (role == Qt::DisplayRole)
    {
        QMap<quint32, QMap<quint32, QString>> dmap = dataMap;
        QMap<quint32, QString> fmap = *dmap.find(index.row());

        return fmap.find(index.column()).value();
    }
    return QVariant();
}

bool DBCTableModel::insertRows(int position, int rows, const QModelIndex &index)
{
    Q_UNUSED(index);
    beginInsertRows(QModelIndex(), position, position+rows-1);

    QMap<quint32, QString> fmap;
    for (quint32 row = 0; row < rows; row++)
    {
        for (quint32 col = 0; col < m_form->GetFieldCount(); col++)
            fmap.insert(col, " ");

        dataMap.insert(row, fmap);
    }

    endInsertRows();
    return true;
}

bool DBCTableModel::removeRows(int position, int rows, const QModelIndex &index)
{
    Q_UNUSED(index);
    beginRemoveRows(QModelIndex(), position, position+rows-1);

    for (quint32 row = 0; row < rows; ++row)
        dataMap.remove(position);

    endRemoveRows();
    return true;
}

bool DBCTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::EditRole)
    {
        quint32 row = index.row();
        quint32 column = index.column();

        QMap<quint32, QMap<quint32, QString>> dmap = dataMap;
        QMap<quint32, QString> fmap = *dmap.find(row);

        fmap.remove(column);
        fmap.insert(column, value.toString());
        dataMap.remove(row);
        dataMap.insert(row, fmap);

        emit(dataChanged(index, index));

        return true;
    }

    return false;
}

QMap< quint32, QMap<quint32, QString> > DBCTableModel::getMap()
{
    return dataMap;
}

Qt::ItemFlags DBCTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;

    return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 29.4.2011, 23:25
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


У меня нормально работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 29.4.2011, 23:29
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Разобрался почему тормозило и долго грузилось)
QMap<quint32, QMap<quint32, QString>> dmap = dataMap;
QMap<quint32, QString> fmap = *dmap.find(row);


непомню уже зачем я так сделал, но это медлено и заменил на

QMap<quint32, QString> fmap = *dataMap.find(row);


:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.4.2011, 0:04
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Странно... вроде все пашет, но больше 2-х столбцов заполнить не могу.
У вас какая таблица?
У меня n строк, и 14 столбцов.
При том, что все 14 столбцов есть, но заполнены только первые 2-а.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 30.4.2011, 0:06
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


В 1 посте я упомянул размерность :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 18.4.2024, 6:54