В приложении 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.