Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: создание айтемов в QStandardItemModel для QTreeView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
icore2008
Всем привет.

Есть модель QStandardItemModel, которая устанавливается в QTreeView.
Мне нужно сделать так, чтобы напротив иерархии детей (QStandardItem) item1, item2, item3 создавались айтемы модели.
Подскажите, пожалуйста, как это реализовать?

Рисунок с детьми прилагается

ЗЫ: Пример simpletreemodel смотрел - не подходит реализация.
void*
icore2008, т.е. ты хочешь чтобы на месте надписей "description" были произвольные итемы модели?
icore2008
Цитата(void* @ 22.7.2008, 21:43) *
icore2008, т.е. ты хочешь чтобы на месте надписей "description" были произвольные итемы модели?


Хочу, чтобы на месте "пустого" напротив айтемов item1, item2, item3, item4 во второй колонке можно было разместить айтемы модели
Litkevich Yuriy
Цитата(icore2008 @ 23.7.2008, 1:45) *
Хочу, чтобы на месте "пустого" напротив айтемов item1, item2, item3, item4 во второй колонке можно было разместить айтемы модели

писать надо на русском и так чтобы тебя поняли, перевод с твоего языка нарусский выглядит так:
Цитата
Хочу, чтобы на месте "пустого" напротив элементов item1, item2, item3, item4 во второй колонке можно было разместить элементы модели


вот тебя человек и спрашивает, какие элементы модели? Разъясни.
icore2008
Цитата(Litkevich Yuriy @ 22.7.2008, 21:54) *
...

вот тебя человек и спрашивает, какие элементы модели? Разъясни.


извините - протупил
имелись в виду объкты класса QStandardItem и чтобы они лежали в той же модели, что и иерархия дерева - напротив дочерних айтемов только во второй колонке
Litkevich Yuriy
я все равно ничего не понял, давай без терминов модель/представление, как визуально должно выглядеть, описать сможешь?
icore2008
давайте :)
хочу, чтобы напротив надписей item1, item2, item3 во второй колонке находились другие надписи :)
Litkevich Yuriy
ну тебе надо данные разместить по соответствующим координатам (index'ам) в модели, где-то был простой пример, может у Шлее, вспомню выложу.
icore2008
спасибо большое, буду ждать :)
Litkevich Yuriy
вот помоему нашел, скомпиль проверь.
/* ======================================================================
**  main.cpp
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/
#include <QtGui>

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication       app(argc, argv);
    QStandardItemModel model(5, 3);

    for (int nTopRow = 0; nTopRow < 5; ++nTopRow) {
        QModelIndex index = model.index(nTopRow, 0);
        model.setData(index, "item" + QString::number(nTopRow + 1));

        model.insertRows(0, 4, index);
        model.insertColumns(0, 3, index);
        for (int nRow = 0; nRow < 4; ++nRow) {
            for (int nCol = 0; nCol < 3; ++nCol) {
                QString strPos = QString("%1,%2").arg(nRow).arg(nCol);
                model.setData(model.index(nRow, nCol, index), strPos);
            }
        }
    }

    QTreeView treeView;
    treeView.setModel(&model);
    treeView.show();

    return app.exec();
}
icore2008
Cпасибо Вам огромнейшее :)
Поделитесь, пожалуйста, книжкой Шлее. В Интернете искал, но там либо ссылки битые, либо скачивается архив с книжкой но не до конца, столько трафика убил уже :(
Litkevich Yuriy
лучше купи, она того стоит, я на Озоне покупал

вот тут список магазинов и цен.
заметь в названии Qt4!
void*
Цитата(icore2008 @ 22.7.2008, 22:29) *
хочу, чтобы напротив надписей item1, item2, item3 во второй колонке находились другие надписи

знаю еще что в QTreeWidget'e для твоего случая такие надписи можно сделать так:
QTreeWidgetItem item;
item.setText(1, "your text"); //1 - номер столбца, отсчет начинается с нуля
icore2008
Цитата(void* @ 23.7.2008, 9:21) *
...
знаю еще что в QTreeWidget'e для твоего случая такие надписи можно сделать так:
QTreeWidgetItem item;
item.setText(1, "your text"); //1 - номер столбца, отсчет начинается с нуля


Спасибо, можно, но у меня модель QStandardItemModel
icore2008
Интересует вот этот кусочек кода:

 model.insertRows(0, 4, index);
        model.insertColumns(0, 3, index);
        for (int nRow = 0; nRow < 4; ++nRow) {
            for (int nCol = 0; nCol < 3; ++nCol) {
                QString strPos = QString("%1,%2").arg(nRow).arg(nCol);
                model.setData(model.index(nRow, nCol, index), strPos);


Можно ли как-то положить во вновь создаваемые строки и колонки объекты типа QStandardItem?
пробовал

Цитата
void QStandardItemModel::setItem ( int row, int column, QStandardItem * item )


но тут нужно указывать ряд, куда вставлять, а в примере, приведенном Litkevich Yuriy, количество строк в модели, после добавления остаётся равным 5.
Litkevich Yuriy
посмотри void QStandardItemModel::appendRow ( const QList<QStandardItem *> & items )
может подойдет
icore2008
Цитата(Litkevich Yuriy @ 23.7.2008, 16:53) *


подойдет, но только для добавления к основной модели, а мне нужно именно дочерние QStandardItem
Litkevich Yuriy
если тебя смутило, то что число строк не меняется, то обрати внимание на исходную функцию:
Цитата
void QStandardItemModel::setItem ( int row, int column, QStandardItem * item )

Sets the item for the given row and column to item. The model takes ownership of the item. If necessary, the row count and column count are increased to fit the item. The previous item at the given location (if there was one) is deleted.

This function was introduced in Qt 4.2.

See also item().
void QStandardItemModel::setItem ( int row, QStandardItem * item )

This is an overloaded member function, provided for convenience.


т.е. "Если необходимо, то число строк и число колонок увеличивается, чтобы разместить элемент"
icore2008
Цитата(Litkevich Yuriy @ 23.7.2008, 17:07) *
если тебя смутило, то что число строк не меняется, то обрати внимание на исходную функцию:
Цитата
void QStandardItemModel::setItem ( int row, int column, QStandardItem * item )

...


т.е. "Если необходимо, то число строк и число колонок увеличивается, чтобы разместить элемент"


хорошо, но как я укажу int row, int column, куда нужно положить айтемы?
после построения модели (добавления рядов и колонок) число строчек не меняется
Проверял qDebug'ом
Litkevich Yuriy
тебе надо разобратся как работате пример у Макса, и внужное тебе место вставлять елемент, ведь тыже хочешь его кудато конктретно воткнуть.
читал это: "Классы моделей"?
icore2008
Цитата(Litkevich Yuriy @ 23.7.2008, 17:19) *
тебе надо разобратся как работате пример у Макса, и внужное тебе место вставлять елемент, ведь тыже хочешь его кудато конктретно воткнуть.
читал это: "Классы моделей"?

Читал, только на английском в ассистанте :)

хотел переопределить

Цитата
int QAbstractItemModel::rowCount ( const QModelIndex & parent = QModelIndex() ) const [pure virtual]


Но как?
icore2008
решение нашел в примере Simple Tree Model.
Вполне устраивает
icore2008
Вроде бы разобрался со вставкой строк и колонок в примере, приведенном Администратором из Книги М.Шлее.
При вставке строк в модель, например строк вставляются вроде бы только строки, но они ничем не заполнены на первый взгляд.
Цитата
bool QAbstractItemModel::insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() ) [virtual]

Далее, в ассистанте идет объяснение:
Цитата
On models that support this, inserts count rows into the model before the given row. The items in the new row will be children of the item represented by the parent model index.

Именно слова выделенные жирным и подсказали мне, что при вставке новых рядов таки создаются айтемы! :-)

Поправьте, пожалуйста, если я неправ :-)
Litkevich Yuriy
Ну в дереве строки и являются элементами (items) дерева.
А иначе, что такое строки?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.