Russian Qt Forum
Ноябрь 23, 2024, 02:58
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
QSortFilterProxyModel - удаление строки
Страниц:
1
[
2
]
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QSortFilterProxyModel - удаление строки (Прочитано 24185 раз)
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #15 :
Апрель 27, 2015, 10:59 »
Цитата: Serega от Апрель 27, 2015, 10:52
Разве в QT концепция отцов и детей это не один из способов реализации сборщика мусора?
Нет )
Сборщик мусора это фигня, которая вызывается виртуальной машиной, чтобы почистить память за ссылками на которые никто не ссылается и когда вызовится сборщик программист предсказать не может.
Та концепция совсем другое -- просто, когда у родителя вызывается деструктор, он смотрит список детей и их удаляет, дети смотрят у себя список детей и их удаляют, и так пока не закончится все дети
Простой пример: родитель окно, а всякие фреймы, кнопки, таблицы его дети
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #16 :
Апрель 27, 2015, 11:13 »
Тогда извините за мое невежество.
Однако все таки в литературе вроде как по разному разъясняется концепция уборки мусора. И один из способов такой как реализован в Qt. Да и вроде в литературе Qt припоминается употребление подобного термина.
Но особо спорить не буду. Нет так нет. Значить перефразирую. Что не особо понимаю когда я сам должен удалять мусор, а когда это сделают за меня? Т.е. ясно, что я обычно назначаю родителя, который и проследит за этим. Но всегда ли я правильно это делаю не ясно. Ведь вроде для меню назначил родителя. Так почему Игорь не доволен
?
Но не хотелось бы пока удаляться от текущей задачи. Добить это меню до победного.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QSortFilterProxyModel - удаление строки
«
Ответ #17 :
Апрель 27, 2015, 11:17 »
Цитата: Serega от Апрель 27, 2015, 10:39
В контекстном меню просто напоминание, что работает клавиша Del. Зачем же пользователю открывать контестное меню, что бы нажать клавишу Del? И что в данном случае я сделал не так, мне не понятно. Если пользователь без всякого контекстного меню давит Del - удаляется текущий пункт, только и всего.
Вот именно: по клавише Del - текущий. А с меню - НЕ текущий (а тот где выпало меню). Это 2 РАЗНЫХ операции удаления. Поэтому клавишу Del совать в меню не надо. Наоборот, там надо показать имя айтема который будет удален (это я имел ввиду под "подчернуть").
По поводу постановки/дизайна. Я бы не мудрил а сделал стандартно. По нажатию правой кнопки если айтем не выбран (selected) - он выбирается, сбрасывая предыдущий выбор. Если юзер хочет оставить текущий выбор - нехай тисне Shift, це стандарт. Если же айтем уже выбран - то никаких изменений в selection не происходит. Вот и все, теперь ОДНА операция удаления и Del в меню на месте.
Ну а насчет "сборщика мусора" и без меня ответят, такое комментировать любят
[OFF]
К сожалению, при работе с Qt время в основном тратится на изучение Qt классов - а вот с точки зрения языка и собственно программирования - как-то маловато для этого остается. Вас я ни в чем не обвиняю, просто это "объективная проблема"
[/OFF]
Записан
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #18 :
Апрель 27, 2015, 11:42 »
По поводу изучения самого языка. Как раз на год и засел за учебники и видеолекции C/C++, но именно за учебники и лекции, а не за практику. И сейчас гораздо легче. Просто более менее читаю код и на это раз более осознанно понимаю то, что мне говорят. И как раз больше изучаю Qt, а практику прохожу вот на текущих задачах.
Вернемся к меню. Ну что тут сказать? Вы забываете, что в меню не один пункт. И увод фокуса с текщего пункта (карточки, которая привязана к этом пункту) при выборе иных пунктов меню, мне порядком надоел. Понимаю, зачем такое меню? С этим списком мне необходимо делать другие манипуляции: сортировка, фильтр..., а не только удаление или просмотр информации. И эти пункты никак не связаны с конкретным айтемом. А стандартная концепция не вариант...
Значит иных предложений нет для организации предложенной концепции, кроме как изначальной? Ладно вернемся к ней до лучших времен. Это вариант отвечает в полной мере задуманному:
- Удаление текущего пункта с помщью Del.
- Удаление текущего и не текущего пункта под курсором мыши с помощью контекстного меню.
«
Последнее редактирование: Апрель 27, 2015, 12:12 от Serega
»
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #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
»
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QSortFilterProxyModel - удаление строки
«
Ответ #20 :
Апрель 27, 2015, 14:10 »
Цитата: Serega от Апрель 27, 2015, 11:42
Вернемся к меню. Ну что тут сказать? Вы забываете, что в меню не один пункт. И увод фокуса с текщего пункта (карточки, которая привязана к этом пункту) при выборе иных пунктов меню, мне порядком надоел. Понимаю, зачем такое меню? С этим списком мне необходимо делать другие манипуляции: сортировка, фильтр..., а не только удаление или просмотр информации. И эти пункты никак не связаны с конкретным айтемом. А стандартная концепция не вариант...
UI - весьма консервативная область. Прежде чем так резво (совершенно не подумавши) отказываться от стандартных вещей - неплохо бы к ним повнимательнее присмотреться. То же Win7 - откройте список файлов и давите правую кнопку. Нажали на файле - все происходит как я рассказал выше. Нажали в пустое место - выпало др контекстное меню (те самые общие операции). Чем это плохо? По-моему ничем, нормально сделано, и юзер с этим уже знаком, глупых вопросов задавать не будет.
Тут правда есть разница - нажать именно на имя файла (текст) а не на пустое место справа). Не хотите с этим возиться? Хорошо, тогда показывайте одно меню. Общие операции в нем всегда, а файловые - только когда есть selection. Разделите эти группы операций сепаратором в меню. А для Del просто напишите в меню
Цитировать
Delete 2 selected items Del
Вместо этого разрабатывать какой-то свой, особый стиль - весьма накладно, и не видно необходимости. Обычным рез-том является "велосипед" в худшем смысле этого термина
Записан
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #21 :
Апрель 27, 2015, 14:43 »
Спасибо
gil9red
, посмотрел ваш пример. С таким вариантом проблем нет. Вот теперь представьте. Слева у вас список эдак тысяч на 5-10. Справа окно для соответствующего пункта из списка, в котором открывается такая партянка с километр и само по себе действие затратно. И пользователь просто открыл контекстное меню в окне списка в призвольном месте, только для того что бы отсортировать или отфильтровать. Забавно ему после этого искать место от куда зашел. Конечно я могу сделать возврат и он сделан, но зачем провоцировать пользователя на неприятнсти и лишние действия?
Переделал пример. Там ситуация предельно ясна. Теперь проделайте трюк с мышкой
.
Записан
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #22 :
Апрель 27, 2015, 14:45 »
Igors
знаете прежде чем менять ситуацию вы не представляете сколько мне пришлось подумать? А если нет пустого места в виджете, список обычно большой? И это не файловый менеджер. И в этом меню в общем то единственный пункт который каким то образом завязан на конкретном айтеме списка. Как раз это Удаление и есть. Но проблемы с уводом фокуса или как в данном случае назвать..., не дают возможности делать удаляемый пункт текущим. Если пользователь хочет просмотреть пусть жмет ЛКМ, думаю в данном конкретном случае для него это будет более удобно (во всяком случае для меня именно так). Удаление дело разовое, а сортировка и тому подобное более часто... Так что решаем, что это выбор из двух зол.
Мало того, если делать удаляемый пункт текущим то сначала открывается информационная карточка для удаляемого пункта списка, затем соседнего. Вообще каша...
Есть такой вариант, делать удаляемый пункт текущим, но не делать его активным, т.е. не показывать инфокарточки. Вот такие варианты я видел. Но как то малоинтуитивно. Хотя тут можно обыграть ситуацию с помощью подсветки пунктов. Выбран и сделан активным - синий. С помощью контекстного меню, делать выбор, но не активацию - серенький. Как то так. Такие варианты есть и вроде как интуитивно. Наверно буду думать над подобным вариантом.
«
Последнее редактирование: Апрель 27, 2015, 15:05 от Serega
»
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #23 :
Апрель 27, 2015, 15:07 »
Serega, после вашего исправления представления все-равно кликабельно
Как я вас понял, у вас в контекстном меню есть сортировка и фильтрация, после которых выделенный элемент теряется?
После сортировки представление ведь сохраняет выделение элемента, вызовите у представления функцию scrollTo, чтобы отмотать к выделенному элементу
Да и не лучше было бы разметить действия сортировки и фильтрации вне контекстного меню, например, сделать кнопками над представлением?
«
Последнее редактирование: Апрель 27, 2015, 15:15 от gil9red
»
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #24 :
Апрель 27, 2015, 15:10 »
Цитата: gil9red от Апрель 27, 2015, 15:07
Serega, после вашего исправления представления все-равно кликабельно
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала? В общем то задача в том и состоит, что бы удаляемый пункт не становился текущим.
«
Последнее редактирование: Апрель 27, 2015, 15:16 от Serega
»
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #25 :
Апрель 27, 2015, 15:15 »
Цитата: Serega от Апрель 27, 2015, 15:10
Цитата: gil9red от Апрель 27, 2015, 15:07
Serega, после вашего исправления представления все-равно кликабельно
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?
Да, спокойно.
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #26 :
Апрель 27, 2015, 15:17 »
Цитата: gil9red от Апрель 27, 2015, 15:15
Цитата: Serega от Апрель 27, 2015, 15:10
Цитата: gil9red от Апрель 27, 2015, 15:07
Serega, после вашего исправления представления все-равно кликабельно
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?
Да, спокойно.
Так покажите решение. Не мучайте уже
. Мне многому еще предстоит научиться.
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #27 :
Апрель 27, 2015, 15:24 »
Цитата: Serega от Апрель 27, 2015, 15:17
Цитата: gil9red от Апрель 27, 2015, 15:15
Цитата: Serega от Апрель 27, 2015, 15:10
Цитата: gil9red от Апрель 27, 2015, 15:07
Serega, после вашего исправления представления все-равно кликабельно
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?
Да, спокойно.
Так покажите решение. Не мучайте уже
. Мне многому еще предстоит научиться.
запускаете пример, тыкаете на клавиатуре стрелку вниз или вверх, элемент выделяется и жмете Del
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: QSortFilterProxyModel - удаление строки
«
Ответ #28 :
Апрель 27, 2015, 15:30 »
Сортирую кнопкой (я о ней писал выше), выделение остается на элементе, если обрабатывать Del, то и он сработает
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Serega
Самовар
Offline
Сообщений: 127
Re: QSortFilterProxyModel - удаление строки
«
Ответ #29 :
Апрель 27, 2015, 15:37 »
Мне казалось, что я ясно изложил суть дела. Но может просто это кажется.
В переделанном примере
http://www.prog.org.ru/index.php?topic=28819.msg211225#msg211225
выделите любой пункт меню. Затем переместите курсор мыши на другой пункт меню и не нажимая предварительно левую кнопку мыши вызовите контекстное меню и произведите удаление. Заметьте какой пункт вы на самом деле удалили. Необходимо удалить пункт под курсором, а не текущий выделенный.
Записан
Страниц:
1
[
2
]
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...