crossplatform.ru

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


  Ответ в Большая таблица
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
sidsukana Дата 30.4.2011, 0:18
  Я вот сейчас никак не могу понять как очищать модель, или как ее удалять из QTableView ведь там AbstractItemModel...
При очищении (удалении строк и столбцов), если 2 раз загрузить данные, то инсертятся только строки :(
RazrFalcon Дата 30.4.2011, 0:12
  А, ну да. Буду пилить ваш пример.
sidsukana Дата 30.4.2011, 0:06
  В 1 посте я упомянул размерность :)
RazrFalcon Дата 30.4.2011, 0:04
  Странно... вроде все пашет, но больше 2-х столбцов заполнить не могу.
У вас какая таблица?
У меня n строк, и 14 столбцов.
При том, что все 14 столбцов есть, но заполнены только первые 2-а.
sidsukana Дата 29.4.2011, 23:29
  Разобрался почему тормозило и долго грузилось)
QMap<quint32, QMap<quint32, QString>> dmap = dataMap;
QMap<quint32, QString> fmap = *dmap.find(row);


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

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


:)
RazrFalcon Дата 29.4.2011, 23:25
  У меня нормально работает.
sidsukana Дата 29.4.2011, 22:59
  Это в примерах я уже тоже нашел и переписал под себя, однако сейчас таблица пустая так тормозит как будто отрисовка идет постоянно, как решить такое?

.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, 20:56
  Набросал простой пример, может прояснит ситуацию.

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

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


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

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


Ясно будем пытаться сделать свою :)
Litkevich Yuriy Дата 29.4.2011, 10:31
 
Цитата(sidsukana @ 28.4.2011, 22:49) *
и QStandardItemModel
Эта модель сделана для простоты использования/освоения концепции Модель/Представление. Она очень медленная, для больших наборов данных она не пригодна.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 1.5.2024, 14:00