Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PavelVX от Сентябрь 28, 2012, 10:49



Название: 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.
У модели же нет такого понятия как текущий индекс. Поэтому и возникает вопрос с синхронным показом и удалением.