Russian Qt Forum
Сентябрь 30, 2024, 10:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget + drug drop = как определить, какой элемент был перенесен?  (Прочитано 5309 раз)
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 я перетащил, что бы изменить его свойства?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Сентябрь 28, 2012, 12:07 »

по-моему без view/model тут не обойтись
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PavelVX
Гость
« Ответ #2 : Сентябрь 28, 2012, 12:54 »

Как с моделью тут быть, я не знаю, если подскажешь, буду рад.
За неимение других идей, я пошел корявым способом, создал наследника QTreeWidget, переопределил
    void dropEvent(QDropEvent *event);
    void startDrag(Qt::DropActions supportedActions);

    QTreeWidgetItem* currentItemForDrop; //заполняется в startDrag
В дропе смотрим, изменился ли родитель, если да, то пишем в базу. Но тут возникла проблема: как мне определить, что мой айтем стал TopLevelItem??
Мож кто подскажет, как это узнать?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #3 : Сентябрь 28, 2012, 13:06 »

Как с моделью тут быть, я не знаю, если подскажешь, буду рад.
Отличная статья есть на эту тему.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Сентябрь 28, 2012, 14:28 »

да, и про всякие QTreeWidgetItem придётся забыть
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PavelVX
Гость
« Ответ #5 : Октябрь 03, 2012, 10:42 »

в общем, я не то , что бы упрямый, но в данном месте, переделывать на модель, я не стал.
Определить, является ли элемент корневым. как оказалось, просто:
indexOfTopLevelItem(ItemForDrop) == -1.
Развивая дальше проект, решил добавлять элементы на дерево через ПКМ. Когда щелкаем по элементу, проблем нет, но вот как создать корневой элемент? Т.е. щелкая ПКМ, как определить, что я щелкнул именно по свободному пространству QTreeWidget?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Октябрь 03, 2012, 10:55 »

QTreeWidgetItem * QTreeWidget::itemAt ( const QPoint & p ) const
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
PavelVX
Гость
« Ответ #7 : Октябрь 04, 2012, 04:38 »

Спасибо!
Век живи, век учись, .....
И откуда вы все это знаете ... Улыбающийся
Записан
PavelVX
Гость
« Ответ #8 : Октябрь 05, 2012, 12:19 »

Думаю подобное многими реализовывалось, поэтому интересует как это ПРАВИЛЬНЕЕ сделать.
Есть модель model - наследник от QSqlTableModel (структура: ключ, ключ родителя, название, доп поля)
Есть форма, на ней QTreeWidget - (ключ, название) для простоты считаем, что дерево строится полностью на момент создания.
И QTableView отображающая model.
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
Так же есть QDataWidgetMapper + несколько элементов, в которых отображаются доп поля.
Как правильно синхронизировать действия по отображения текущего элемента? Т.е. ЛКМ по элементу в таблице - показываем текущим элементом лист на дереве. ЛКМ по листу в тривью, устанавливаем текущим нужную строку в tableView.
У модели же нет такого понятия как текущий индекс. Поэтому и возникает вопрос с синхронным показом и удалением.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.118 секунд. Запросов: 23.