Russian Qt Forum

Qt => Model-View (MV) => Тема начата: NKovalev64 от Январь 26, 2013, 14:52



Название: Создание модели
Отправлено: NKovalev64 от Январь 26, 2013, 14:52
Здравствуйте уважаемые форумчане!

Коротко о проблеме: есть массив данных (в среднем около 100 элементов), каждый элемент которого представляет собой блок вида "ключ-значение" (около 10 полей), при этом все элементы массива содержат ОДИНАКОВОЕ количество ключей, ключи также идентичны.
Вот пример такого массива a0{key1:val1, key2:val2, ... keyn:valn}, a1{key1:val10, key2:val20, ... keyn:valn}, ... .

Значение ключей может быть двух типов double и string, это важно.

Данный массив я хочу отобразить в виде таблицы, в таком виде:
Код:
	key0	key1	key2	key3	key4	...	keyN
a0 val0 val1 val2 val3 val4 ... valn
a1 val10 val11 val21 val31 val41 ... valn1
...
an
Требуется создать МОДЕЛЬ которая будет создаваться из массива и помещаться в QTableView(?).
Важно! double значения некоторых ключей весьма длинные числа, необходимо чтобы в таблице они отображались с максимальной точностью, например 1952424 а не 1.95242e+06. При этом необходимо чтобы в конечной таблице (виджете) столбцы соответствующие double ключам сортировались верно, т.е. как числа а не как строки.
Далее (менее важно по приоритету) было бы здорово если модель умела нести в себе в качестве значений одного из ключей картинку, т.е. ссылку на нее например в файл ресурсов так чтобы картинка (иконка) отображалась к отдельном столбце таблицы:
Код:
	key0	key1	key2	key3	key4		...	keyN
a0 val0 val1 val2 val3 картинка ... valn
a1 val10 val11 val21 val31 картинка. ... valn1
...
an

Буду рад если кто то подскажет как написать такую модель или предложит готовое решение. Спасибо.


Название: Re: Создание модели
Отправлено: NKovalev64 от Январь 30, 2013, 13:43
Никто не знает или жалко подсказать?
А за деньги? Сколько?


Название: Re: Создание модели
Отправлено: Пантер от Январь 30, 2013, 13:56
Что делаешь и что не получается?


Название: Re: Создание модели
Отправлено: Bepec от Январь 30, 2013, 14:20
Немного бредово, но в принципе реально сделать довольно быстро - недельку ток поизучать )


Название: Re: Создание модели
Отправлено: NKovalev64 от Январь 30, 2013, 14:37
Что делаешь и что не получается?

Я даже не знаю что сказать. ВСЕ что известно указал выше.
Сейчас реализую задачу без использования модели, aka в лоб. Тут есть свои камни, например:
Создаю ячейку таблицы конструктором QTableWidgetItem::QTableWidgetItem(int type = Type). Передаю тип (2 - double, 3 - string - насколько я понимаю). Со строками все понятно, а числа отображаются только в экспоненциальном виде, например число 1952424 отображается как 195242e+06. Как сделать чтобы отображалось всегда нормально???


Название: Re: Создание модели
Отправлено: Пантер от Январь 30, 2013, 14:52
Наследуйся от http://doc.qt.digia.com/qt/qabstractitemmodel.html и переопределяй нужные методы. Примеры там есть.


Название: Re: Создание модели
Отправлено: NKovalev64 от Январь 30, 2013, 14:59
Наследуйся от http://doc.qt.digia.com/qt/qabstractitemmodel.html и переопределяй нужные методы. Примеры там есть.
Что ж, наверное я должен сказать спасибо - Спасибо! Я читал это уже не единожды, и в qtdoc, и у Бланшет и Боровского и еще несколько десятков статей в интернете. Что из это-го можно понять!??? Откуда я узнаю какие именно методы я должен буду переопределить и как? Да и вообще, это просто невозможно понять с листа.
В последнем посте я сформулировал простой вопрос, КАК ОТОБРАЗИТЬ ОБЫКНОВЕННОЕ ЦЕЛОЕ ЧИСЛО В ОБЫЧНОМ ВИДЕ!?


Название: Re: Создание модели
Отправлено: Bepec от Январь 30, 2013, 15:03
Отдать в метод data QVariant с числом :D


Название: Re: Создание модели
Отправлено: alex312 от Январь 30, 2013, 15:22
... Я читал это уже не единожды, и в qtdoc, и у Бланшет и Боровского и еще несколько десятков статей в интернете. Что из это-го можно понять!???
про модели очень толково написано здесь - http://www.ozon.ru/context/detail/id/6364884/


Название: Re: Создание модели
Отправлено: NKovalev64 от Январь 30, 2013, 16:26
Отдать в метод data QVariant с числом :D
Что значит отдать в метод data()? Метод QVariant QTableWidgetItem::data(int role) const [virtual] возвращает значение но не устанавливает его.


Название: Re: Создание модели
Отправлено: Bepec от Январь 30, 2013, 16:30
Проще согласиться, чем объяснить.


Название: Re: Создание модели
Отправлено: NKovalev64 от Январь 30, 2013, 16:45
Проще согласиться, чем объяснить.

А если попробовать?
Item->data(Qt::DisplayRole) = 4; - не отображает ничего

Пока воспользовался этим: http://www.prog.org.ru/index.php?topic=24004.msg170463#msg170463, помогло.


Название: Re: Создание модели
Отправлено: ViTech от Январь 30, 2013, 18:01
А если попробовать?
Item->data(Qt::DisplayRole) = 4; - не отображает ничего

Это все неправильно. Если надо отображать таблицу без особых изысков, то лучше наследоваться от QAbstractTableModel и
Цитировать
When subclassing QAbstractTableModel, you must implement rowCount(), columnCount(), and data(). Default implementations of the index() and parent() functions are provided by QAbstractTableModel. Well behaved models will also implement headerData().
Как "implement rowCount(), columnCount(), and data()" смотрите в примерах и внимательнее изучите "Model/View Programming", это в справке Qt есть.

Если коротко, то числа можно вывести как-то так:
Код:
QVariant SomeTableModel::data(const QModelIndex &index, int role) const
{
  if (!index.isValid())
    return QVariant();

  switch (role)
  {
    case Qt::DisplayRole:
      switch (index.column())
      {
        case 0:
          return 4;
          break;
        case 1:
          return 423423.2342342;
          break;
        default:
        break;
      }
    break;
    default:
    break;
  }

  return QVariant();
}


Название: Re: Создание модели
Отправлено: Bepec от Январь 30, 2013, 18:05
А если ещё проще, то вы спрашиваете про создание модели.

А сами, на деле используете уже готовую. Соответственно наши советы не могут вам помочь, ибо вы задали вопрос, не понимая его значения :)


Название: Re: Создание модели
Отправлено: NKovalev64 от Февраль 02, 2013, 13:11
Всем спасибо за ответы. Мне таки удалось создать собственную модель от QAbstractTableModel, переопределить нужные методы и получить профит. Вообщем-то теперь кажется не сложно))) Но остаются еще вопросы, например как в в одном из столбцов отобразить иконки? Когда делал через qtablewidget, просто добавлял итем и устанавливал иконку. теперь использую модель установленную в qtableview и в одном из столбцов отображается адрес картинки, как сделать чтобы отображалась сама картика? (функция возвращающая иконку от адреса есть)


Название: Re: Создание модели
Отправлено: kambala от Февраль 02, 2013, 16:19
в методе data возвращать QPixmap для нужного столбца


Название: Re: Создание модели
Отправлено: Bepec от Февраль 02, 2013, 16:53
Возвращать в модели в data картинку :) только Role - displayed ловите.


Название: Re: Создание модели
Отправлено: NKovalev64 от Февраль 02, 2013, 17:07
Возвращать в модели в data картинку :) только Role - displayed ловите.

Понятно. Несколько уточнений, "картинку" - это QPimap? или Qimage / QPicture ???
Role - displayed, это Qt::DisplayRole ?

Update: Нашел - Qt::DecorationRole, отдавать QPixmap или Qicon.