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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListView drag-n-drop блин...  (Прочитано 5924 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Октябрь 05, 2017, 20:23 »

Никогда не пользовался, по описанию всё выглядело просто, функционал не новый, вроде должно всё работать. Нужно просто перемещать строки в списке. Сделал как везде описано:

Код:
// lv - указатель на QListView
    lv->setMovement(QListView::Free);
    lv->setSelectionMode(QAbstractItemView::SingleSelection);
    lv->setDragEnabled(true);
    lv->viewport()->setAcceptDrops(true);
    lv->setDropIndicatorShown(true);
    lv->setDragDropMode(QAbstractItemView::InternalMove);
    lv->setDragDropOverwriteMode(false);

И хрена там. Строки не перемещаются, а копируются, при этом заменяют те, на которые сброшены, а не только вставляются между ними.

Что тут ещё в документации не описано?
Записан

2^7-1 == 127, задумайтесь...
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Октябрь 07, 2017, 23:23 »

может надо setDragDropOverwriteMode(true) ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Октябрь 08, 2017, 13:37 »

может надо setDragDropOverwriteMode(true) ?

Неа.

Цитировать
If its value is true, the selected data will overwrite the existing item data when dropped, while moving the data will clear the item. If its value is false, the selected data will be inserted as a new item when the data is dropped.

Но на самом деле, там всё гораздо хуже. Свойство "заменять" задаётся не только этим флажком, который похоже игнорируется, оно задаётся флажком в модели, которая цепляется к виду. У модели QStringListModel оно зашито глухо в класс. Его метод flags() возвращает флажок, который разрешает замену в строке при дропе на неё. Но по какой-то бездарной глупости нет метода, которым можно было бы менять свойства объекта этого класса. То есть, нет метода QStringListModel::setFlags(...). Единственный способ изменить флаги - наследовать QStringListModel и перегрузить flags(). Вроде бы есть другой способ - использовать не QListView, а QListWidget - у него избыточная функциональность, поэтому я его не рассматривал. В нём вроде бы можно вызывать setFlags() но почему-то не для всего класса, а для каждого элемента списка отдельно. Причём именно элемента списка, а не строки в QStringListModel. То есть, надо после каждого добавления строки в связанную со списком модель вытаскивать item этой строки из QListWidget, и для него вызывать setFlags(). В общем - напутали тут с этими моделями капитально. Всё это выглядит аляповато и не доработано. Хотя уже существует несколько лет. Может быть - диверсия...
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 08, 2017, 14:37 »

Когда-то ковырялся, пришел к выводу что проще нарисовать свое чем все это учить. Там ничего страшного, довольно удачно оформляется в виде фильтра. К критике стандартного добавлю

- если хотим менять местами только строки данного виджета - почему drag image показывается за его пределами? Т.е. зачем намекать юзеру что, мол, можно дропнуть куда-то еще если нельзя?

- drop indicator слишком интимный (тонкая линия), а drag image быть и огромной простыней которая без толку гадит на экране. Легкого/удобного способа поменять и то и другое не нашел (не уверен что они вообще есть)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Октябрь 08, 2017, 15:55 »

supportedDropActions переопределена в модели?
По идеи, всё как в абстрактной модели должно быть.
Взгляните тут
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Октябрь 08, 2017, 17:41 »

Да мне как бы надо то всего-навсего, чтобы в списке простые строки нормально переносились. Переупорядочивать его. Удивляет, что такая в общем совершенно стандартная ерунда вызывает целую возню с переопределением классов, перегрузкой методов... Начинает напоминать продукцию одной софто-мусорной компании, которая десятилетия выпускала г...но, предоставляя разработчикам возможность из него что-то делать.
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Октябрь 09, 2017, 17:28 »

Это просто какая-то дырка от бублика... Унаследовал QStringListItem, переопределил flags(index), в котором взял родительский QStringListItem::flags(index) и сбросил в нём Qt::ItemIsDropEnabled. В результате строки драгаются, но перестали вообще дропаться. Даже между другими строками. То есть, изменилась функциональность не только строк, но списка, как целого. Какой болван это всё напроектировал? Непонимающий
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Октябрь 09, 2017, 19:07 »

В общем, если кто-то будет то же самое делать - работающий код есть вот здесь. То есть, надо сделать такой же класс, как там DragDropListModel, и его привязать к QListView в качестве модели. Единственное что нужно, чтобы айтемы именно переносились, а не копировались в списке - надо убрать Qt::CopyAction из supportedDropActions(). Если переноска айтемов только внутри списка, то можно убрать flags() - штатный QStringListItem::flags() и так возвращает эти флаги установленными.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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