Название: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: PavelVX от Сентябрь 28, 2012, 10:49 QTreeWidget * treeWidget = new QTreeWidget(this);
treeWidget->header()->hide(); treeWidget->setAcceptDrops(true); treeWidget->setDragEnabled(true); treeWidget->setDragDropMode(QAbstractItemView::InternalMove); Заполняется он из БД, поэтому, если делать DD, то нужно изменять одно из полей item и сохранить это изменение в БД. QTreeWidget поддерживает drug drop без проблем, но вот как узнать, какой item я перетащил, что бы изменить его свойства? Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: kambala от Сентябрь 28, 2012, 12:07 по-моему без view/model тут не обойтись
Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: PavelVX от Сентябрь 28, 2012, 12:54 Как с моделью тут быть, я не знаю, если подскажешь, буду рад.
За неимение других идей, я пошел корявым способом, создал наследника QTreeWidget, переопределил void dropEvent(QDropEvent *event); void startDrag(Qt::DropActions supportedActions); QTreeWidgetItem* currentItemForDrop; //заполняется в startDrag В дропе смотрим, изменился ли родитель, если да, то пишем в базу. Но тут возникла проблема: как мне определить, что мой айтем стал TopLevelItem?? Мож кто подскажет, как это узнать? Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: Kurles от Сентябрь 28, 2012, 13:06 Как с моделью тут быть, я не знаю, если подскажешь, буду рад. Отличная статья (http://doc.crossplatform.ru/qt/4.3.2/model-view-dnd.html) есть на эту тему.Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: kambala от Сентябрь 28, 2012, 14:28 да, и про всякие QTreeWidgetItem придётся забыть
Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: PavelVX от Октябрь 03, 2012, 10:42 в общем, я не то , что бы упрямый, но в данном месте, переделывать на модель, я не стал.
Определить, является ли элемент корневым. как оказалось, просто: indexOfTopLevelItem(ItemForDrop) == -1. Развивая дальше проект, решил добавлять элементы на дерево через ПКМ. Когда щелкаем по элементу, проблем нет, но вот как создать корневой элемент? Т.е. щелкая ПКМ, как определить, что я щелкнул именно по свободному пространству QTreeWidget? Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: Kurles от Октябрь 03, 2012, 10:55 QTreeWidgetItem * QTreeWidget::itemAt ( const QPoint & p ) const
Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: PavelVX от Октябрь 04, 2012, 04:38 Спасибо!
Век живи, век учись, ..... И откуда вы все это знаете ... :) Название: Re: QTreeWidget + drug drop = как определить, какой элемент был перенесен? Отправлено: PavelVX от Октябрь 05, 2012, 12:19 Думаю подобное многими реализовывалось, поэтому интересует как это ПРАВИЛЬНЕЕ сделать.
Есть модель model - наследник от QSqlTableModel (структура: ключ, ключ родителя, название, доп поля) Есть форма, на ней QTreeWidget - (ключ, название) для простоты считаем, что дерево строится полностью на момент создания. И QTableView отображающая model. tableView->setSelectionMode(QAbstractItemView::SingleSelection); tableView->setSelectionBehavior(QAbstractItemView::SelectRows); Так же есть QDataWidgetMapper + несколько элементов, в которых отображаются доп поля. Как правильно синхронизировать действия по отображения текущего элемента? Т.е. ЛКМ по элементу в таблице - показываем текущим элементом лист на дереве. ЛКМ по листу в тривью, устанавливаем текущим нужную строку в tableView. У модели же нет такого понятия как текущий индекс. Поэтому и возникает вопрос с синхронным показом и удалением. |