LINUX.ORG.RU

Ошибка поиска родителей в QTreeView Qt Creator 3.1.1

 


0

1

Всем доброго времени суток. На форму кинут объект QTreeView. В нём отражаются даты записей таблицы базы данных в виде: Всё>>год>>месяц>>день. При клике на элементе дерева отрабатывает on_..._clicked(const QModelIndex &index). Необходимо отобразить в таблице записи за выбранный период. по index.data().toString() получаю выбранный день, по QModelIndex indM = index.parent() и indM.data().toString() получаю месяц выбранного дня, по QModelIndex indY = indM.parent() и indY.data().toString() хочу получить год выбранного дня, а получаю опять тот-же день!!! (например: 19 марта 19 года) В чём проблема?

Ответ на: комментарий от anonymous

Возможно...

С Qt Creator ом только начинаю работать. В Kylix на паскале в таких случаях работал, используя TTreeNode: Node: TTreeNode; Node:= tv_arx.Selected; год = Node.Parent.Parent.Text; месяц = Node.Parent.Text; день = Node.Text; Здесь тоже нужно работать через дерево?

nernick
() автор топика
Ответ на: комментарий от XMs

void MainWindow::on_tv_arch_clicked(const QModelIndex &index) {//клик на дереве архива команд

QString tmps; QString itemS = index.data().toString(); bool Ok; int itemI; QModelIndex indNew; QModelIndex indNewNew; qWarning(itemS.toLocal8Bit()); if(itemS == «ВСЕ») {//выбран весь архив tmps = «ВСЕ: выбран весь архив»; QMessageBox::information(0,"",tmps.toLocal8Bit()); } else { itemI = itemS.toInt(&Ok);//пробуем преобразовать в число if(Ok == false) {//выбран месяц tmps = «выбран %1 месяц %2 года»; indNew = index.parent();//переход к месяцу tmps = tmps.arg(itemS).arg(indNew.data().toInt()); QMessageBox::information(0,"",tmps.toLocal8Bit());

} else if(itemI > 40) {//выбран год tmps = «выбран %1 год»; tmps = tmps.arg(itemS); QMessageBox::information(0,"",tmps.toLocal8Bit()); } else {//выбрано число tmps = «выбрано %1 число %2 месяца %1 года»; indNew = index.parent();//переход к месяцу indNewNew = indNew.parent();//переход к году tmps = tmps.arg(itemS).arg(indNew.data().toString()).arg(indNewNew.data().toInt()); QMessageBox::information(0,"",tmps.toLocal8Bit()); } } }

nernick
() автор топика
Ответ на: комментарий от nernick

Внимание: прочитайте описание разметки LORCODE

Оформи как полагается, такую портянку невозможно же читать!

XMs ★★★★★
()
Ответ на: комментарий от XMs
void MainWindow::on_tv_arch_clicked(const QModelIndex &index) {//клик на дереве архива команд
    
    QString tmps;
    QString itemS = index.data().toString();
    bool Ok;
    int itemI;
    QModelIndex indNew;
    QModelIndex indNewNew;
    qWarning(itemS.toLocal8Bit());
    if(itemS == «ВСЕ») {//выбран весь архив tmps = «ВСЕ: выбран весь архив»;
        QMessageBox::information(0,"",tmps.toLocal8Bit());
    } else { 
        itemI = itemS.toInt(&Ok);//пробуем преобразовать в число 
        if(Ok == false) {//выбран месяц tmps = «выбран %1 месяц %2 года»; 
            indNew = index.parent();//переход к месяцу 
            tmps = tmps.arg(itemS).arg(indNew.data().toInt()); 
            QMessageBox::information(0,"",tmps.toLocal8Bit());
            
        } else if(itemI > 40) {//выбран год tmps = «выбран %1 год»; 
            tmps = tmps.arg(itemS); 
            QMessageBox::information(0,"",tmps.toLocal8Bit()); 
        } else {//выбрано число tmps = «выбрано %1 число %2 месяца %1 года»; 
            indNew = index.parent();//переход к месяцу 
            indNewNew = indNew.parent();//переход к году 
            tmps = tmps.arg(itemS).arg(indNew.data().toString()).arg(indNewNew.data().toInt());
            QMessageBox::information(0,"",tmps.toLocal8Bit()); 
        }
    }
}
fluorite ★★★★★
()
Ответ на: комментарий от XMs

попробую...

void MainWindow::on_tv_arch_clicked(const QModelIndex &index)
{//клик на дереве архива команд

  QString tmps;
  QString itemS = index.data().toString();
  bool Ok;
  int itemI;
  QModelIndex indNew;
  QModelIndex indNewNew;
    qWarning(itemS.toLocal8Bit());
    if(itemS == "ВСЕ")
    {//выбран весь архив
        tmps = "ВСЕ: выбран весь архив";
        QMessageBox::information(0,"",tmps.toLocal8Bit());
    }
    else
    {
        itemI = itemS.toInt(&Ok);//пробуем преобразовать в число
        if(Ok == false)
        {//выбран месяц
            tmps = "выбран %1 месяц %2 года";
            indNew = index.parent();//переход к месяцу
            tmps = tmps.arg(itemS).arg(indNew.data().toInt());
            QMessageBox::information(0,"",tmps.toLocal8Bit());

        }
        else
            if(itemI > 40)
            {//выбран год
                tmps = "выбран %1 год";
                tmps = tmps.arg(itemS);
                QMessageBox::information(0,"",tmps.toLocal8Bit());
            }
            else
            {//выбрано число
                tmps = "выбрано %1 число %2 месяца %1 года";
                indNew = index.parent();//переход к месяцу
                indNewNew = indNew.parent();//переход к году
                tmps = tmps.arg(itemS).arg(indNew.data().toString()).arg(indNewNew.data().toInt());
                QMessageBox::information(0,"",tmps.toLocal8Bit());
            }
    }
}
nernick
() автор топика
Ответ на: комментарий от fluorite

Полагаю, «tmps = …» не должно быть закомментировано.

Проверь, валидны ли индексы. Невалидный индекс — признак элемента верхнего уровня.

И вообще, не стоит проверку завязывать на текст. Текст — для пользователя. Например:

QString itemS = index.data().toString();
…
if(itemS == «ВСЕ»)

можно сократить и упростить:

if (!index.parent().isValid())

Более того, проверка родителя на валидность гарантирует, что это индекс верхнего уровня, тогда как строка, теоретически, может попасться где угодно.

Заодно теста ради убедись, что (если выделен какой-то день) у индекса 3 валидных предка, потом можно будет стереть:

int parents = 0;
QModelIndex parent = index.parent();
while(parent.isValid())
 {
  parent = parent.parent();
  parents++;
 }
qWarning("Valid parents: %d", parents);

XMs ★★★★★
()
Ответ на: комментарий от XMs

Результат: Valid parents: 3 Но это я и до обращения на форум узнавал:

if(!indNew.isValid()) qWarning(«error indNew!!!»); if(!indNewNew.isValid()) qWarning(«error indNewNew!!!»); 
сообщения error... не появлялись!
Самое интересное: когда для проверки вставлял код:

QMessageBox::information(0,"","строка index:\t "+IntTxt.arg(index.row())+" столбец "+IntTxt.arg(index.column())+"\n"+
                                         "строка indNew:\t"+IntTxt.arg(indNew.row())+" столбец "+IntTxt.arg(indNew.column())+"\n"+
                                         "строка indNewNew\t"+IntTxt.arg(indNewNew.row())+" столбец "+IntTxt.arg(indNewNew.column()));
[\code=cpp]
при выборе первой даты, первого месяца, второго года получил:
строка index: 0 столбец 0
строка indNew: 0 столбец 0
строка indNewNew 1 столбец 0
т.е строки индекса выдаются правильно, ошибка только в indNewNew.data()

nernick
() автор топика
Ответ на: комментарий от nernick

А кто у тебя модель заполняет? И ещё: годы (ведь indNewNew именно на одного из них должен указывать?) во вьюхе отображаются корректно?

XMs ★★★★★
()
Ответ на: комментарий от XMs

tmps = «выбрано %1 число %2 месяца %1 года»; - просто ВЫВОДИЛ на экран НЕ ТОТ аргумент!!! (голову пеплом уже посыпал...)

nernick
() автор топика
Ответ на: комментарий от nernick

Действительно, благодарю. Надо было перепроверить, когда ты отформатированное выложил

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.