2016-01-13 9 views
1

В дизайнерском приложении QT GUI я использую QTreeView для отображения дерева элементов, предоставленного экземпляром QStandardItemModel. Дерево-представление является многостолбцовым, и все элементы в первом столбце можно проверить. На скриншоте показан пример того, как выглядит это в настоящее время: this is how the tree view currently looks likeQT: Как показать комбинированные поля как ячейки в древовидном представлении

Теперь предположим, что я хочу, чтобы пользователь мог выбирать разные имена для «точки». Идея состоит в том, чтобы 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

ответ

1

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

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

+0

Возможно, вы правы. Однако, если я использую «это» [т. QDialog] или «ui.tvStructures» в качестве родителя, никаких изменений внешнего вида не будет. Также в вашем exmample я должен удалить «this» в качестве родителя, поскольку конструктор вызывается из main(). Даже если я это сделаю, я все равно получаю комбобокс. – rava

+0

ok Я нашел свою ошибку благодаря вашему примеру. То, что действительно отсутствовало, было вызовом tableView.openPersistentEditor (model.index (i, 1)). Я не знаю, почему это не было необходимо в других примерах. – rava