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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: QSortFilterProxyModel - удаление строки  (Прочитано 24185 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #15 : Апрель 27, 2015, 10:59 »

Разве в QT концепция отцов и детей это не один из способов реализации сборщика мусора?

Нет )
Сборщик мусора это фигня, которая вызывается виртуальной машиной, чтобы почистить память за ссылками на которые никто не ссылается и когда вызовится сборщик программист предсказать не может.

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

Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #16 : Апрель 27, 2015, 11:13 »

Тогда извините за мое невежество.
Однако все таки в литературе вроде как по разному разъясняется концепция уборки мусора. И один из способов такой как реализован в Qt. Да и вроде в литературе Qt припоминается употребление подобного термина.
Но особо спорить не буду. Нет так нет. Значить перефразирую. Что не особо понимаю когда я сам должен удалять мусор, а когда это сделают за меня? Т.е. ясно, что я обычно назначаю родителя, который и проследит за этим. Но всегда ли я правильно это делаю не ясно. Ведь вроде для меню назначил родителя. Так почему Игорь не доволен Улыбающийся?
Но не хотелось бы пока удаляться от текущей задачи. Добить это меню до победного.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Апрель 27, 2015, 11:17 »

В контекстном меню просто напоминание, что работает клавиша Del. Зачем же пользователю открывать контестное меню, что бы нажать клавишу Del? И что в данном случае я сделал не так, мне не понятно. Если пользователь без всякого контекстного меню давит Del - удаляется текущий пункт, только и всего.
Вот именно: по клавише Del - текущий. А с меню - НЕ текущий (а тот где выпало меню). Это 2 РАЗНЫХ операции удаления. Поэтому клавишу Del совать в меню не надо. Наоборот, там надо показать имя айтема который будет удален (это я имел ввиду под "подчернуть").

По поводу постановки/дизайна. Я бы не мудрил а сделал стандартно. По нажатию правой кнопки если айтем не выбран (selected) - он выбирается, сбрасывая предыдущий выбор. Если юзер хочет оставить текущий выбор - нехай тисне Shift, це стандарт. Если же айтем уже выбран - то никаких изменений в selection не происходит. Вот и все, теперь ОДНА операция удаления и Del в меню на месте.

Ну а насчет "сборщика мусора" и без меня ответят, такое комментировать любят Улыбающийся

[OFF]
К сожалению, при работе с Qt время в основном тратится на изучение Qt классов - а вот с точки зрения языка и собственно программирования - как-то маловато для этого остается. Вас я ни в чем не обвиняю, просто это "объективная проблема"  Улыбающийся
[/OFF]
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #18 : Апрель 27, 2015, 11:42 »

По поводу изучения самого языка. Как раз на год и засел за учебники и видеолекции C/C++, но именно за учебники и лекции, а не за практику. И сейчас гораздо легче. Просто более менее читаю код и на это раз более осознанно понимаю то, что мне говорят. И как раз больше изучаю Qt, а практику прохожу вот на текущих задачах.

Вернемся к меню. Ну что тут сказать? Вы забываете, что в меню не один пункт. И увод фокуса с текщего пункта (карточки, которая привязана к этом пункту) при выборе иных пунктов меню, мне порядком надоел. Понимаю, зачем такое меню? С этим списком мне необходимо делать другие манипуляции: сортировка, фильтр..., а не только удаление или просмотр информации. И эти пункты никак не связаны с конкретным айтемом. А стандартная концепция не вариант...

Значит иных предложений нет для организации предложенной концепции, кроме как изначальной? Ладно вернемся к ней до лучших времен. Это вариант отвечает в полной мере задуманному:
- Удаление текущего пункта с помщью Del.
- Удаление текущего и не текущего пункта под курсором мыши с помощью контекстного меню.
« Последнее редактирование: Апрель 27, 2015, 12:12 от Serega » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #19 : Апрель 27, 2015, 13:10 »

Сделал простенький пример, в котором есть модели (QAbstractTableModel и QSortFilterProxyModel), есть два представления QTableView -- для оригинальной модели и отсортированной.
Есть возможность добавления и удаления записей из таблицы (применимо только к оригинальной, но без проблем можно доработать, чтобы и отсортированная таблица удаляла)
Для оригинальной таблицы есть простенькое контекстное меню и удаления возможно также с помощью кнопки Delete

Serega, посмотрите, возможно вам это поможет Улыбающийся


Update. Щас вспомнил... при удалении студента из списка нужно удалить память за ним Улыбающийся
Всё из-за плохого влияния явы и питона Смеющийся

В файле studentsmodel.cpp нужно строку students.removeAt(row); поменять на delete students.takeAt(row);
« Последнее редактирование: Апрель 27, 2015, 14:14 от gil9red » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 27, 2015, 14:10 »

Вернемся к меню. Ну что тут сказать? Вы забываете, что в меню не один пункт. И увод фокуса с текщего пункта (карточки, которая привязана к этом пункту) при выборе иных пунктов меню, мне порядком надоел. Понимаю, зачем такое меню? С этим списком мне необходимо делать другие манипуляции: сортировка, фильтр..., а не только удаление или просмотр информации. И эти пункты никак не связаны с конкретным айтемом. А стандартная концепция не вариант...
UI - весьма консервативная область. Прежде чем так резво (совершенно не подумавши) отказываться от стандартных вещей - неплохо бы к ним повнимательнее присмотреться. То же Win7 - откройте список файлов и давите правую кнопку. Нажали на файле - все происходит как я рассказал выше. Нажали в пустое место - выпало др контекстное меню (те самые общие операции). Чем это плохо? По-моему ничем, нормально сделано, и юзер с этим уже знаком, глупых вопросов задавать не будет.

Тут правда есть разница - нажать именно на имя файла (текст) а не на пустое место справа). Не хотите с этим возиться? Хорошо, тогда показывайте одно меню. Общие операции в нем всегда, а файловые - только когда есть selection. Разделите эти группы операций сепаратором в меню. А для Del просто напишите в меню
Цитировать
Delete 2 selected items   Del
Вместо этого разрабатывать какой-то свой, особый стиль - весьма накладно, и не видно необходимости. Обычным рез-том является "велосипед" в худшем смысле этого термина  Улыбающийся
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #21 : Апрель 27, 2015, 14:43 »

Спасибо gil9red, посмотрел ваш пример. С таким вариантом проблем нет. Вот теперь представьте. Слева у вас список эдак тысяч на 5-10. Справа окно для соответствующего пункта из списка, в котором открывается такая партянка с километр и само по себе действие затратно. И пользователь просто открыл контекстное меню в окне списка в призвольном месте, только для того что бы отсортировать или отфильтровать. Забавно ему после этого искать место от куда зашел. Конечно я могу сделать возврат и он сделан, но зачем провоцировать пользователя на неприятнсти и лишние действия?

Переделал пример. Там ситуация предельно ясна. Теперь проделайте трюк с мышкой Улыбающийся.
Записан
Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #22 : Апрель 27, 2015, 14:45 »

Igors знаете прежде чем менять ситуацию вы не представляете сколько мне пришлось подумать? А если нет пустого места в виджете, список обычно большой? И это не файловый менеджер. И в этом меню в общем то единственный пункт который каким то образом завязан на конкретном айтеме списка. Как раз это Удаление и есть. Но проблемы с уводом фокуса или как в данном случае назвать..., не дают возможности делать удаляемый пункт текущим. Если пользователь хочет просмотреть пусть жмет ЛКМ, думаю в данном конкретном случае для него это будет более удобно (во всяком случае для меня именно так). Удаление дело разовое, а сортировка и тому подобное более часто... Так что решаем, что это выбор из двух зол.

Мало того, если делать удаляемый пункт текущим то сначала открывается информационная карточка для удаляемого пункта списка, затем соседнего. Вообще каша...

Есть такой вариант, делать удаляемый пункт текущим, но не делать его активным, т.е. не показывать инфокарточки. Вот такие варианты я видел. Но как то малоинтуитивно. Хотя тут можно обыграть ситуацию с помощью подсветки пунктов. Выбран и сделан  активным - синий. С помощью контекстного меню, делать выбор, но не активацию  - серенький. Как то так. Такие варианты есть и вроде как интуитивно. Наверно буду думать над подобным вариантом.
« Последнее редактирование: Апрель 27, 2015, 15:05 от Serega » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #23 : Апрель 27, 2015, 15:07 »

Serega, после вашего исправления представления все-равно кликабельно Улыбающийся

Как я вас понял, у вас в контекстном меню есть сортировка и фильтрация, после которых выделенный элемент теряется?
После сортировки представление ведь сохраняет выделение элемента, вызовите у представления функцию scrollTo, чтобы отмотать к выделенному элементу

Да и не лучше было бы разметить действия сортировки и фильтрации вне контекстного меню, например, сделать кнопками над представлением?
« Последнее редактирование: Апрель 27, 2015, 15:15 от gil9red » Записан

Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #24 : Апрель 27, 2015, 15:10 »

Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала? В общем то задача в том и состоит, что бы удаляемый пункт не становился текущим.
« Последнее редактирование: Апрель 27, 2015, 15:16 от Serega » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #25 : Апрель 27, 2015, 15:15 »

Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?

Да, спокойно.
Записан

Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #26 : Апрель 27, 2015, 15:17 »

Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?

Да, спокойно.
Так покажите решение. Не мучайте уже Улыбающийся. Мне многому еще предстоит научиться.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #27 : Апрель 27, 2015, 15:24 »

Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?

Да, спокойно.
Так покажите решение. Не мучайте уже Улыбающийся. Мне многому еще предстоит научиться.

запускаете пример, тыкаете на клавиатуре стрелку вниз или вверх, элемент выделяется и жмете Del Веселый
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #28 : Апрель 27, 2015, 15:30 »

Сортирую кнопкой (я о ней писал выше), выделение остается на элементе, если обрабатывать Del, то и он сработает
Записан

Serega
Самовар
**
Offline Offline

Сообщений: 127


Просмотр профиля
« Ответ #29 : Апрель 27, 2015, 15:37 »

Мне казалось, что я ясно изложил суть дела. Но может просто это кажется.
В переделанном примере http://www.prog.org.ru/index.php?topic=28819.msg211225#msg211225 выделите любой пункт меню. Затем переместите курсор мыши на другой пункт меню и не нажимая предварительно левую кнопку мыши вызовите контекстное меню и произведите удаление. Заметьте какой пункт вы на самом деле удалили. Необходимо удалить пункт под курсором, а не текущий выделенный.
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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