QT: Как отобразить поля со списком в виде ячеек в древовидном представлении

В приложении QT GUI на основе дизайнера я использую QTreeView для отображения дерева элементов, предоставляемого экземпляром QStandardItemModel. Древовидное представление состоит из нескольких столбцов, и все элементы в первом столбце доступны для проверки. На скриншоте показан пример того, как это выглядит сейчас: так сейчас выглядит древовидное представление

Теперь предположим, что я хочу, чтобы пользователь мог выбирать разные имена для «точки». Идея состоит в том, чтобы рядом с каждым флажком располагался QComboBox. И в качестве альтернативы «точке» он может выбрать из набора строк, например. "точка", "pt" и "coord2D". Позже я хотел бы, чтобы все выборки для всех дубликатов «точки» были синхронизированы, но давайте начнем с простого...

Я не слишком знаком с этой идеей, но мне кажется, что нужно создать ItemDelegate для представления, как описано в документации QT или в этом разделе (обе ссылки обратитесь к QTableWidgets вместо QTreeViews).

Итак, в качестве первого шага я взял пример делегата ComboBoxDelegate из вопроса о переполнении стека, упомянутого выше, и вызвал это из моего приложения, используя этот код, также взятый из связанного вопроса:

QStandardItemModel* model = new QStandardItemModel(20,2);
ui.tvStructures->setModel(model);
ui.tvStructures->setItemDelegate(new ComboBoxDelegate());

for (int row = 0 ; row < 20; ++row)
{
    for (int col = 0; col < 2; ++col)
    {
        QModelIndex index = model->index(row, col, QModelIndex());
        model->setData(index, QVariant((row+1) * (col+1)));
    }
}

Обратите внимание, что я разместил этот код внутри конструктора родительского QDialog, где расположен элемент управления. В итоге я получил таблицу с двумя столбцами, как и ожидалось, но без полей со списком. Фактически, при отладке кода я наблюдаю, что конструктор делегата вызывается (во время новой операции), но ни один из createEditor, setEditorData, setModelData или updateEditorGeometry не вызывается каждый раз. Я думал, что это может быть связано с тем, что некоторая магия соединения перезаписывает триггеры, необходимые для рисования, но даже если я удалю весь код, который ссылается на tvStructures QTreeView, кроме того, что я опубликовал, я все равно не вижу никаких полей со списком.

Чего не хватает?

Обратите внимание, что я использую несколько устаревшую версию QT 4.7.1.


person rava    schedule 13.01.2016    source источник


Ответы (1)


Похоже, вам не хватает родителя для new QComboBoxDelegate. Вы можете использовать QDialog, которого вы упомянули в качестве родителя.

Также: следуйте этому длинному примеру, чтобы убедиться, что вы ничего не упустили.

person Felipe Lema    schedule 14.01.2016
comment
Возможно, ты прав. Однако, если я использую это [т.е. QDialog] или ui.tvStructures в качестве родителя, никаких изменений во внешнем виде не произойдет. Также в вашем примере я должен удалить это как родителя, поскольку конструктор вызывается из main(). Даже если я это сделаю, я все равно получу поля со списком. - person rava; 15.01.2016
comment
хорошо, я нашел свою ошибку благодаря вашему примеру. Чего действительно не хватало, так это вызова tableView.openPersistentEditor(model.index(i, 1)) - хотя я не знаю, почему это не было необходимо в других примерах. - person rava; 15.01.2016