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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4] 5 6 ... 9
46  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 29, 2015, 07:19
Спасибо за разъяснения. Буду осозновать и делать как надо, запишу в копилку опыта.

По поводу Del. Вовсе не хочется спорить без дела. Пытаюсь понять. Например это:
Цитировать
Насколько я понял, решили поместить в меню 2 удаления - кликнутого и selected. Не вижу в этом ничего плохого, но тогда распишите в меню "кто есть кто"
Меня ставит в тупик.
В меню у меня один пункт удаления:

Зачем второй?
Разве эта строчка не дублирует действие мыши:
m_deleteAction->setShortcut( QKeySequence::Delete );

Зачем открывать меню, если для виджета назначен этот же Экшин. Все работает. Значит сделано все Верно?
Мне кажется (возможно только кажется) здесь  я сделал все верно, но веду себя как будто это не так. Скорее всего дело проще - я не осознал, что сдела правильно. И это не ради спора. Видимо, что то мне пока не дано осознать. Наверное на практике псотепенно пойму.
47  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 29, 2015, 06:22
Однако, Экшин удаления предварительно приходится добавлять в конструктор виджета:
Код
C++ (Qt)
 explicit ProxyPaneWidget( QWidget * parent = 0 ) : QWidget( parent )
 {
   m_deleteAction = new QAction( this );
   m_deleteAction->setText( tr( "Delite" ) );
   m_deleteAction->setShortcut( QKeySequence::Delete ) ;
   m_deleteAction->setShortcutContext( Qt::WidgetWithChildrenShortcut );
 
   connect( m_deleteAction, SIGNAL( triggered() ),
            this, SLOT( deleteSelectedItem() ) );
 
   addAction( m_deleteAction );
 }


Затем в меню:
Код
C++ (Qt)
void ProxyPaneWidget::showCustomMenu(QPoint const & pos)
{
 bool selectionEmpty = m_proxyList->selectionModel()->selection().empty();
 
 QMenu * m_proxyMenu = new QMenu( this );
 m_proxyMenu->addAction( tr( "Ascending" ), this, SLOT( sortAscendingOrder()) );
 m_proxyMenu->addAction( tr( "Descending" ), this, SLOT( sortDescendingOrder()) );
 m_proxyMenu->addAction( tr( "Reset" ), this, SLOT( resetProxy()) );
 
 if ( !selectionEmpty )
 {
   m_proxyMenu->addSeparator();
   m_proxyMenu->addAction( m_deleteAction );
 }
 
 m_proxyMenu->exec( m_proxyList->mapToGlobal( pos ) );
}
Только в этом случае клавиша Del работает.
Не вижу способа сделать Экшин удаления не членом класса.
48  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 28, 2015, 17:44
Хорошо, отдохнул, собрал волю  в кулак, признаю, что в чем то был не прав. В любом случае всем спасибо, что заставили думать в ином русле. Изначально видимо не точно разъяснил суть проблемы. С другой стороны теперь известно два пути, устраивающих меня и кое что осознал глубже и вывел для себя с вашей помощью несколько приемов работы с меню. Хорошо, делаем пункт текущим, но не делаем его активным. Так проще.

Работа над ошибками. Как справедливо заметили, сорю членами класса. Сделать я могу все, что угодно, но нет вырабатанного стиля и не знаю приемов и целесообразности того или иного применения. Не всегда представляю кого в качестве родителя назначить. Как понял это не совсем имеет отношение к наследованию. Т.е. имеет, но можно назначать любого вверх по иерархии, а не только непосредственного.
Так вот код меню. Что в нем не так?
Код
C++ (Qt)
void ProxyPaneWidget::showCustomMenu( QPoint const & pos )
{
 bool selectionEmpty = m_proxyList->selectionModel()->selection().empty();
 
 QAction * deleteAction = new QAction( this );
 deleteAction->setText( tr( "Delite" ) );
 deleteAction->setShortcut( QKeySequence( QKeySequence::Delete ) );
 deleteAction->setShortcutContext( Qt::WidgetWithChildrenShortcut );
 connect( deleteAction, SIGNAL( triggered() ),
          this, SLOT( deleteSelectedItem() ) );
 
 QMenu * proxyMenu = new QMenu( this );
 proxyMenu->addAction( tr( "Ascending" ), this, SLOT(sortAscendingOrder()) );
 proxyMenu->addAction( tr( "Descending" ), this, SLOT(sortDescendingOrder()) );
 proxyMenu->addAction( tr( "Reset" ), this, SLOT(resetProxy()) );
 if ( !selectionEmpty ){
   proxyMenu->addSeparator();
   proxyMenu->addAction( m_deleteAction );
 }
 proxyMenu->exec( m_proxyList->mapToGlobal( pos ) );
}

Проблема такова:
Если deleteAction определяю в конструкторе виджета то все работает как положенно. Если же как в приведенном примере, то клавиша Del перестает работать.
49  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 19:53
Переделать переопределение собития правой кнопки мыши так, что бы пункт становился текущим, но при этом не активным не составило труда:
Код
C++ (Qt)
void ProxyList::mousePressEvent(QMouseEvent *event)
{
 if(event->button() == Qt::MidButton)
 {
   return;
 }
 if(event->button() == Qt::RightButton)
 {
   setCurrentIndex( indexAt( event->pos() ) );
   return;
 }
 QListView::mousePressEvent(event);
}
И в купе с первоначально предложенным вариантом http://www.prog.org.ru/index.php?topic=28819.msg211186#msg211186 все работает как например в реализациях закладок в браузере. Закладка выделяется, но не активируется. Надеюсь, что такой подход не сложно будет реализовать более подобающе.
50  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 17:50
Меня действительно сложно переубедить. Решения посмотрел. В общем то они в основном сходны с моим. Однако может быть на самом деле не с того конца начал жечь лучину. Наверное проще все таки сделать выбранный пункт текущим, возможно делать его таковым только при выборе удаления, а сигнал на просмотр текущего пунтка не посылать. Возможно такая реализация будет проще.

Ну хотя бы туже панель закладок браузера посмотрите. Закладка активируется только при ЛКМ. ПКМ ее не активирует. Может с этого мне и надо было начинать. Проще было бы понять чего я добиваюсь и почему именно. Такое поведение меня бы устроило. Хорошо попорбую иной подход решения задачи.
51  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 16:06
Слушайте с вами не соскучишся или со мной Улыбающийся.
- Мне не нравится, что при клике ПКМ для удаления какого либо пункта меню этот пункт становится текущим и в браузере (назовем вспомогательное окно так) открывается закладка, а затем когда пункт удалили открывается вдобавок соседняя закладка.
- Не нравится, что когда пользователь вызвал контекстное меню для сортировки, опять же текущей становится та закладка над которой случайно оказался курсор в данный момент.

Левая кнопка мыши должна работать как обычно - делать пункт текущим. ПКМ сейчас не делает пункт текущим, как и задумано, но удалять пункт она должна именно под курсором, даже если он не текущий (не выделен) в данный момент.

В вашем примере переделал так, что этих проблем нет. События кнопок мыши переназначил, объявил класс представления. Но если я попытаюсь удалить пункт под курсором, то удалится не он а тот который в данный момент выделен. Вот это я хочу поправить, что бы при этом не отвалилась кнопка Del.

Так вот все работает как надо в изначально предложенном варианте. Но сказали, что вариант исполнен не красиво. Пытаюсь сдеать красиво Улыбающийся.

Если пытаюсь сделать иным способом, Del перестает работать.


На вашем скрине выделен Иванов, а удалить мне надо Васю с помощь только ПКМ, Иванов должен остаться текущи пунктом.
Т.е. в примере надо решить только эту проблему. Но здесь уже начинается свистопляска для меня.
52  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 15:51
И наверное ввел в заблуждение с термином фокус. В общем то не фокус текущего выбранного пункта списка теряется. С сортировкой и фильтром все в порядке.
Просто к каждому пункту меню привязана карточка в другом окне. И если ткнуть правой кнопкой мыши для удаления пункта в списке, то карточка сменится, что как раз не нужно, тем более пользователь мог не обязательно вызвать меню для удаления, а например для сортировки.. Ну это выглядит примерно так как в браузере слева список закладок. Нет смысла делать удаляемый пункт текущим. Пусть текущий остается тот который просматривает пользователь.

Вроде как на этот раз меня правильно поняли, надеюсь.
53  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 15:37
Мне казалось, что я ясно изложил суть дела. Но может просто это кажется.
В переделанном примере http://www.prog.org.ru/index.php?topic=28819.msg211225#msg211225 выделите любой пункт меню. Затем переместите курсор мыши на другой пункт меню и не нажимая предварительно левую кнопку мыши вызовите контекстное меню и произведите удаление. Заметьте какой пункт вы на самом деле удалили. Необходимо удалить пункт под курсором, а не текущий выделенный.
54  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 15:17
Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала?

Да, спокойно.
Так покажите решение. Не мучайте уже Улыбающийся. Мне многому еще предстоит научиться.
55  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 15:10
Serega, после вашего исправления представления все-равно кликабельно Улыбающийся
Представление то кликабельно, так и должно быть. Но сможете удалить пункт над которым находится курсор без помощи ЛКМ, при этом, что бы клавиша Del работала? В общем то задача в том и состоит, что бы удаляемый пункт не становился текущим.
56  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 14:45
Igors знаете прежде чем менять ситуацию вы не представляете сколько мне пришлось подумать? А если нет пустого места в виджете, список обычно большой? И это не файловый менеджер. И в этом меню в общем то единственный пункт который каким то образом завязан на конкретном айтеме списка. Как раз это Удаление и есть. Но проблемы с уводом фокуса или как в данном случае назвать..., не дают возможности делать удаляемый пункт текущим. Если пользователь хочет просмотреть пусть жмет ЛКМ, думаю в данном конкретном случае для него это будет более удобно (во всяком случае для меня именно так). Удаление дело разовое, а сортировка и тому подобное более часто... Так что решаем, что это выбор из двух зол.

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

Есть такой вариант, делать удаляемый пункт текущим, но не делать его активным, т.е. не показывать инфокарточки. Вот такие варианты я видел. Но как то малоинтуитивно. Хотя тут можно обыграть ситуацию с помощью подсветки пунктов. Выбран и сделан  активным - синий. С помощью контекстного меню, делать выбор, но не активацию  - серенький. Как то так. Такие варианты есть и вроде как интуитивно. Наверно буду думать над подобным вариантом.
57  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 14:43
Спасибо gil9red, посмотрел ваш пример. С таким вариантом проблем нет. Вот теперь представьте. Слева у вас список эдак тысяч на 5-10. Справа окно для соответствующего пункта из списка, в котором открывается такая партянка с километр и само по себе действие затратно. И пользователь просто открыл контекстное меню в окне списка в призвольном месте, только для того что бы отсортировать или отфильтровать. Забавно ему после этого искать место от куда зашел. Конечно я могу сделать возврат и он сделан, но зачем провоцировать пользователя на неприятнсти и лишние действия?

Переделал пример. Там ситуация предельно ясна. Теперь проделайте трюк с мышкой Улыбающийся.
58  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 11:42
По поводу изучения самого языка. Как раз на год и засел за учебники и видеолекции C/C++, но именно за учебники и лекции, а не за практику. И сейчас гораздо легче. Просто более менее читаю код и на это раз более осознанно понимаю то, что мне говорят. И как раз больше изучаю Qt, а практику прохожу вот на текущих задачах.

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

Значит иных предложений нет для организации предложенной концепции, кроме как изначальной? Ладно вернемся к ней до лучших времен. Это вариант отвечает в полной мере задуманному:
- Удаление текущего пункта с помщью Del.
- Удаление текущего и не текущего пункта под курсором мыши с помощью контекстного меню.
59  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 11:13
Тогда извините за мое невежество.
Однако все таки в литературе вроде как по разному разъясняется концепция уборки мусора. И один из способов такой как реализован в Qt. Да и вроде в литературе Qt припоминается употребление подобного термина.
Но особо спорить не буду. Нет так нет. Значить перефразирую. Что не особо понимаю когда я сам должен удалять мусор, а когда это сделают за меня? Т.е. ясно, что я обычно назначаю родителя, который и проследит за этим. Но всегда ли я правильно это делаю не ясно. Ведь вроде для меню назначил родителя. Так почему Игорь не доволен Улыбающийся?
Но не хотелось бы пока удаляться от текущей задачи. Добить это меню до победного.
60  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 10:52
Разве в QT концепция отцов и детей это не один из способов реализации сборщика мусора?
Страниц: 1 2 3 [4] 5 6 ... 9

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