crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QStandardItemModel сложность со столбцами..., Не могу правильно добавить столбцы...
bahek3
  опции профиля:
сообщение 31.3.2011, 16:50
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 2.12.2010
Пользователь №: 2237

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




Репутация:   0  


Вопрос очень простой... но я все хожу вокруг да около и все никак не могу найти ответ... уже с этими индексами всю голову себе сломал... подскажите пжалста как быть... вопрос такой... Есть модель QStandardItemModel... из таблицы в БД я беру данные и строю из них дерево.. на это внимание не обращайте, это просто к сведению... Дело в том, что вложенность то будет наращиваться... и мне нужно чтобы первая колока была "data" а вторая "id"... в одну строку чтобы оно было.... ну блин уже пересмотрел примеров вагон и все никак не сложу из них одного нормального решения... подскажите кто...

QSqlQuery *pQuery = new QSqlQuery(QSqlDatabase::database("test"));
pQuery->prepare("SELECT id, data FROM t_groups;");
pQuery->exec();

m_pModel = new QStandardItemModel(this);

int i = 0;
while(pQuery->next()){
QStandardItem *pItem = new QStandardItem(pQuery->value(1).toString());
m_pModel->appendRow(pItem);

QStandardItem *pItem2 = new QStandardItem(pQuery->value(0).toString());
QList<QStandardItem*> lst;
lst<<pItem2;
m_pModel->insertColumn(1,lst);

i++;
}

delete pQuery;

на картинке виден результат выполнения этого обрыка кода... я понимаю что нужно перемещаться еще и по строкам... но все никак не попаду...
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 31.3.2011, 19:52
Сообщение #2


Участник
**

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

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




Репутация:   4  


скомпилируй это - я так понял, что тебе такая штука нужна
QStandardItemModel * model = new QStandardItemModel();
    model->setColumnCount(2);
    QStandardItem *parentItem = model->invisibleRootItem();
     for (int i = 0; i < 4; ++i) {
         QStandardItem *item = new QStandardItem(0,2); //сказали, что колонок две
         parentItem->appendRow(item);
         parentItem = item;
         model->setData(item->index(),QString("item %0").arg(i)); //инфа для первой колонки
         model->setData(item->index().sibling(0,1),QString("123")); //инфа для второй
     }
     ui->treeView->setModel(model);

может мой вариант плохой, я сам его изобрёл только что :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bahek3
  опции профиля:
сообщение 1.4.2011, 8:28
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 2.12.2010
Пользователь №: 2237

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




Репутация:   0  


Цитата(abc @ 31.3.2011, 19:52) *
скомпилируй это - я так понял, что тебе такая штука нужна
QStandardItemModel * model = new QStandardItemModel();
    model->setColumnCount(2);
    QStandardItem *parentItem = model->invisibleRootItem();
     for (int i = 0; i < 4; ++i) {
         QStandardItem *item = new QStandardItem(0,2); //сказали, что колонок две
         parentItem->appendRow(item);
         parentItem = item;
         model->setData(item->index(),QString("item %0").arg(i)); //инфа для первой колонки
         model->setData(item->index().sibling(0,1),QString("123")); //инфа для второй
     }
     ui->treeView->setModel(model);

может мой вариант плохой, я сам его изобрёл только что :)


Спасибо! Вчера я всетки сочинил решение) и в этом варианте очень много близкого... если бы не сочинил сам, то он был бы очень полезен... Спасибо!! ;)) вот что насочинял... мот кому пригодится..
void MainWindow::setupInterface()
{
    setupUi(this);
    m_pModel = new QStandardItemModel(this);
    m_pModel->invisibleRootItem()->insertColumns(0,2);
    m_pModel->setHorizontalHeaderLabels(QStringList()<<"data"<<"id");

    QSqlQuery *pQueryFirstLevel = prepareQuery(0);

    //******* 1 LEVEL *******//
    int i = 0;
    while(pQueryFirstLevel->next()){
        QStandardItem *pFirstLevelItem = new QStandardItem;
        addItem(m_pModel->invisibleRootItem(),pFirstLevelItem,pQueryFirstLevel,i);

        //******* 2 LEVEL *******//
        int j = 0;
        pFirstLevelItem->insertColumns(0,2);
        QSqlQuery *pQuerySecLevel = prepareQuery(pQueryFirstLevel->value(0).toInt());
        while(pQuerySecLevel->next()){
            QStandardItem *pSecondLevelItem = new QStandardItem;
            addItem(pFirstLevelItem,pSecondLevelItem,pQuerySecLevel,j);

            //******* 3 LEVEL *******//
            int k = 0;
            pSecondLevelItem->insertColumns(0,2);
            QSqlQuery *pQueryThrdLevel = prepareQuery(pQuerySecLevel->value(0).toInt());
            while(pQueryThrdLevel->next()){
                QStandardItem *pThirdLevelItem = new QStandardItem;
                addItem(pSecondLevelItem,pThirdLevelItem,pQueryThrdLevel,k);

                //******* 4 LEVEL *******//
                int l = 0;
                pThirdLevelItem->insertColumns(0,2);
                QSqlQuery *pQueryFourLevel = prepareQuery(pQueryThrdLevel->value(0).toInt());
                while(pQueryFourLevel->next()){
                    QStandardItem *pFourthLevelItem = new QStandardItem;
                    addItem(pThirdLevelItem,pFourthLevelItem,pQueryFourLevel,l);

                    l++;
                }

                k++;
                delete pQueryFourLevel;
                //******* 4 LEVEL *******//
            }

            j++;
            delete pQueryThrdLevel;
            //******* 3 LEVEL *******//
        }

        i++;
        delete pQuerySecLevel;
        //******* 2 LEVEL *******//
    }

    delete pQueryFirstLevel;
    //******* 1 LEVEL *******//
    mf_treeView->setModel(m_pModel);
}

void MainWindow::addItem(QStandardItem *pOwnerItem, QStandardItem *pNewItem, QSqlQuery *pQuery, int i)
{
    pOwnerItem->appendRow(pNewItem);
    m_pModel->setData(m_pModel->index(i,0,pOwnerItem->index()),pQuery->value(1).toString());
    m_pModel->setData(m_pModel->index(i,1,pOwnerItem->index()),pQuery->value(0).toString());
}

QSqlQuery *MainWindow::prepareQuery(int nID)
{
    QSqlQuery *pQuery = new QSqlQuery(QSqlDatabase::database("test"));
    pQuery->prepare("SELECT id, data FROM t_groups WHERE id_owner = :id;");
    pQuery->bindValue(":id", nID);
    pQuery->exec();

    return pQuery;
}


Но теперь встал другой вопрос)) Как получить значение этого id... ?
Вот суть вопроса... я хочу сделать колонку id скрытой... и когда я нажимаю на какую-нить группу, узнать значение в ее второй колонке... ну тоесть ее id... и снова сочинял до не возможности... Раз уже открыл тему так может и этот вопрос рассмотрим тогда...?

void MainWindow::slotDebug(QModelIndex index)
{
    QString str = m_pModel->data(index).toString();
    lineEdit->setText("Group name - \"" + str + "\" id - \"");
}


Так получаю значения текущего выбранного элемента... в "index" когда деюбажиш видно что [0,0] - это выбраное значение (например "Группа 1"), а в [0,1] - значение id (получается 1).... Как мне это 1 достать??? Пробовал вроде так (может с ошибкой пишу как помню):
    QStandardItem *item = m_pModel->itemFromIndex(index);
    QModelIndex idx = m_pModel->index(item->row(),1,item->index());
    qDebug()<<item->row()<<idx.data().toString();

Получается снова не то все... в асистанте пересмотрел все методы класса QModelIndex, QStandardItemModel и QStandardItem.... мот что и пропустил... но много чего и перепробовал... думаю этот вариант близок к теме... но вот эта запись смущает item->row() при получении индекса....
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bahek3
  опции профиля:
сообщение 1.4.2011, 10:18
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 2.12.2010
Пользователь №: 2237

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




Репутация:   0  


Цитата(bahek3 @ 1.4.2011, 8:28) *
Спасибо! Вчера я всетки сочинил решение) и в этом варианте очень много близкого... если бы не сочинил сам, то он был бы очень полезен...


Не так выразился! Этот вариант вообще здоровский!! и он был бы не полезен а самим решением...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.4.2011, 11:52
Сообщение #5


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


bahek3, а если бы уровней было этак с сотню - для каждого бы копипаст был ? :) В цикле ещё приемлимо. А лучше, ИМХО, - рекурсия. Вообще, дерево и рекурсия - родные брат и сестра )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bahek3
  опции профиля:
сообщение 1.4.2011, 14:41
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 2.12.2010
Пользователь №: 2237

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




Репутация:   0  


Цитата(Алексей1153 @ 1.4.2011, 11:52) *
bahek3, а если бы уровней было этак с сотню - для каждого бы копипаст был ? :) В цикле ещё приемлимо. А лучше, ИМХО, - рекурсия. Вообще, дерево и рекурсия - родные брат и сестра )))


Я вкурсе что такие дела решаются рекурсией)) просто это как пробное решение... и не заморачивался на этом... Я хочу пока просто освоить эту тему... :rolleyes: Мне бы лучше ответ на последний вопросец мой кто подсказал) а тогда уже и оптимизировать можно было бы))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 1.4.2011, 20:05
Сообщение #7


Участник
**

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

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




Репутация:   4  


Цитата(bahek3 @ 1.4.2011, 9:28) *
QStandardItem *item = m_pModel->itemFromIndex(index);
QModelIndex idx = m_pModel->index(item->row(),1,item->index());

думаю, нужно убрать item->index()
можно немножко иначе, и мне такой вариант больше нравится:
если ты знаешь index итема:
QModelIndex index1 = index.sibling(0,1)
получили индекс соседа из колонки нумер 1
и дальше, как ты и сделал:
m_pModel->data(index1).toString();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bahek3
  опции профиля:
сообщение 3.4.2011, 14:58
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 2.12.2010
Пользователь №: 2237

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




Репутация:   0  


Цитата(abc @ 1.4.2011, 20:05) *
QModelIndex index1 = index.sibling(0,1)


Интересная функция... нужно с ней познакомиться поближе... не знал ее назначения, но вижу полезная штука... Спасибо! Большое спасибо за участие и за дельные советы! ;) Думаю дальше уже нахимичу)

Маленькая поправочка...
QModelIndex index1 = index.sibling(index.row(),1)

И все работает как нужно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 2:09