В дизайнерском приложении QT GUI я использую QTreeView для отображения дерева элементов, предоставленного экземпляром QStandardItemModel. Дерево-представление является многостолбцовым, и все элементы в первом столбце можно проверить. На скриншоте показан пример того, как выглядит это в настоящее время: QT: Как показать комбинированные поля как ячейки в древовидном представлении
Теперь предположим, что я хочу, чтобы пользователь мог выбирать разные имена для «точки». Идея состоит в том, чтобы QComboBox находился рядом с каждым из этих флажков. И в качестве альтернативы «точке» он может выбирать из набора строк, например. «точка», «pt» и «coord2D». Позже я бы хотел, чтобы все выборы для всех дубликатов «точки» были синхронизированы, но давайте начнем просто ...
Я не слишком хорошо знаком с этой идеей, но для меня это выглядит так: создайте ItemDelegate для представления, как описано in the QT Documentation или in this topic (обе ссылки относятся к QTableWidgets, а не к QTreeViews).
Так что я сделал, как первый шаг, я взял пример делегат ComboBoxDelegate из stack overflow question mentioned above и назвал его внутри моего приложения, используя этот код также взят из связанного с этим вопроса:
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
Возможно, вы правы. Однако, если я использую «это» [т. QDialog] или «ui.tvStructures» в качестве родителя, никаких изменений внешнего вида не будет. Также в вашем exmample я должен удалить «this» в качестве родителя, поскольку конструктор вызывается из main(). Даже если я это сделаю, я все равно получаю комбобокс. – rava
ok Я нашел свою ошибку благодаря вашему примеру. То, что действительно отсутствовало, было вызовом tableView.openPersistentEditor (model.index (i, 1)). Я не знаю, почему это не было необходимо в других примерах. – rava