Откуда берется QModelIndex() в seekRoot.parent() != QModelIndex();

В справке Qt есть пример в Model/View Tutorial - 3.2 Работа с выборками. Коды ресурсов находятся в Qt\Qt5.9.1\Examples\Qt-5.9.1\widgets\tutorials\modelview\7_selections.

Я не могу понять, что такое QModelIndex() в while(seekRoot.parent() != QModelIndex()). Это похоже на конструктор QModelIndex, но что здесь используется? Он возвращает новый пустой индекс модели? Или это функция MainWindow? Это кажется невозможным.

Откуда это взялось? И каково возвращаемое значение?

void MainWindow::selectionChangedSlot(const QItemSelection & /*newSelection*/, const QItemSelection & /*oldSelection*/)
{
    //get the text of the selected item
    const QModelIndex index = treeView->selectionModel()->currentIndex();
    QString selectedText = index.data(Qt::DisplayRole).toString();
    //find out the hierarchy level of the selected item
    int hierarchyLevel=1;
    QModelIndex seekRoot = index;
    while(seekRoot.parent() != QModelIndex())
    {
        seekRoot = seekRoot.parent();
        hierarchyLevel++;
    }
    QString showString = QString("%1, Level %2").arg(selectedText)
                         .arg(hierarchyLevel);
    setWindowTitle(showString);
}

person XY.Wang    schedule 16.07.2020    source источник


Ответы (2)


Пустой конструктор QModelIndex() указывает на недопустимый (т.е. несуществующий) QModelIndex:

Создает новый пустой индекс модели. Этот тип индекса модели используется для указания того, что позиция в модели недействительна.

Таким образом, seekRoot.parent() != QModelIndex() проверяет, есть ли у seekRoot родитель (т. е. его родитель не является недопустимым).

Его также можно записать (более четко) как seekRoot.parent().isValid() (см. QModelIndex::isValid). ).

person m7913d    schedule 16.07.2020
comment
Спасибо, что указали на isValid. Это НАМНОГО более читабельно, чем != QModelIndex(). - person JarMan; 17.07.2020

Конструктор по умолчанию QModelIndex() создает временный недопустимый индекс, с которым сравниваются выходные данные вызова seekRoot.parent(). Другими словами, это выражение проверяет, является ли родительский индекс действительным или нет.

person vahancho    schedule 16.07.2020