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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 3 4 [5] 6 7 ... 9
61  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 10:39
Спасибо! По поводу членов класса. Есть такое дело. Необучен. Не всегда представляю (если вообще представляю это правильно) когда я сам должен удалять мусор, когда за меня это сделает мусорщик. Но это был бы следующий ученический вопрос по поводу правильности оформления данного кода (как бы забежали вперед на счет работы над ошибками). Учту и исправлю. Экшин и Меню изначально инициализировались в конструкторе виджета, теперь вроде как осознаю, что такой подход не верен. Хотя вроде как часто видел в кодах, что Акшины именно там готовились, потом заряжались в методе меню.

По поводу непродуманной постановки. Попробую объяснить. Пользователь не просто просматривает список, при выборе пункта списка открывается информационное окно для данного пункта. И когда надо удалить пункт списка вовсе не обязательно, что бы фокус уходил с уже открытого инфоокна, следовательно необязатель, а возможно и не желательно делать айтем текущим. Если же захочет, то для этого ЛКМ.
Считал, что клавиша Del для того и существует, что бы пользователь мог работать клавиатурой без применения мыши, манипулируя клавишами стрелок и удаления. Это происходит гораздо быстрее при быстром списковом просмотре. Изначально предложенная http://www.prog.org.ru/index.php?topic=28819.msg211186#msg211186 реализация именно так и работает (совместно и мышь как надо и клавиша Del). Подумывал сделать это более правильно если есть способ. В контекстном меню просто напоминание, что работает клавиша Del. Зачем же пользователю открывать контестное меню, что бы нажать клавишу Del? И что в данном случае я сделал не так, мне не понятно. Если пользователь без всякого контекстного меню давит Del - удаляется текущий пункт, только и всего.

Третий абзац я как то пока не осознал, что вы хотели сказать. Не ясно как надо подчеркнуть тот айтем который хочу удалить? Или это не решение вопроса, а то как вы считает как надо было продумать саму концепцию меню?

В любом случае спасибо. Пока решаю те или иные вопросы, набираюсь опыта как это делают профи. В данном случае думаю пригодится такой способ работы с контекстным меню. Хотя пока и не удалось применить его для данной задачи. Но зато научился отсылать сигналы и вызывать методы в зависимости от выбранного пунтка меню. Признаюсь был в тупике как это сделать.
62  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 27, 2015, 07:02
Снова наэкспериментировался. Запустить слот удалось. Проблема в том, что клавиша Del не работает. Видимо в этом случае ей не хватает соединения сигнал-слот. Но стандартного сигнала для экшина отправляющего хотя бы позицию курсора я не нашел. Не заводить же неаследника для создания сигнала? Как то затратно. Можно навесить событие на Del, но хрен редьки не слаще.
В общем вопрос. Что не так? Можно ли как то исправить?
Код
C++ (Qt)
void proxyPaneWidget::showCustomMenu(const QPoint &pos)
{
 QAction * m_deleteAction = new QAction( this );
 m_deleteAction->setText( tr( "Delite" ) );
 m_deleteAction->setShortcut( QKeySequence( QKeySequence::Delete ) );
 m_deleteAction->setShortcutContext( Qt::WidgetWithChildrenShortcut );
 
 m_proxyMenu = new QMenu( m_proxyList );
 m_proxyMenu->addAction( m_deleteAction );
 
 QModelIndex selectedItemIndex = m_proxyList->indexAt(pos);
 
 QAction *menuAct = new QAction(this);
 menuAct = m_proxyMenu->exec( m_proxyList->mapToGlobal( pos ) );
 
 if( menuAct->text() == "Delite" )
   deleteSelectedItem(&selectedItemIndex);
}


Код
C++ (Qt)
void proxyPaneWidget::deleteSelectedItem(QModelIndex * delIndex)
{
 m_currentItemIndex = delIndex ? *delIndex : m_proxyList->currentIndex();
 m_source->removeItem( m_proxyModel->mapToSource( m_currentItemIndex ).row() );
}
Или я что то недопонимаю, что скорее всего. Или это тупиковая затея.
63  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 18:36
Спасибо за подсказку. У нас ночь уже. Днем буду разбираться.
64  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 18:00
И здесь стоит упоминуть, что действия правой кнопки мыши я переназначил и пункт не становится текущим. Сделано  это, что бы не правоцировать ненужные действия после выбора пункта.
А что мешает вызвать удаление сразу после закрытия контекстного меню? m_currentItemIndex просто застрелить, а удаление оформить напр так
Код
C++ (Qt)
void proxyPaneWidget::deleteSelectedItem( QModelIndex * delIndex )  // delIndex = 0 в прототипе
{
 QModelIndex index = delIndex ? *delIndex : m_proxyList->currentIndex();
 


Признаю. Ломал голову и ничего не понял. Как устроен слот ясно. Как до него донести индекс с контекстного меню? Естественно в меню у меня не единственный пункт.
65  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 15:09
Поэтому и говорю, что неудачно назвал переменную индекса.
Дело в том, что в прокси представлении действительно выделен текущий индекс и пользователь может менять его клавиатурой или ЛКМ.
Но пользователь может навести курсор мыши на другой пункт и вызвать контекстное меню. И здесь стоит упоминуть, что действия правой кнопки мыши я переназначил и пункт не становится текущим. Сделано  это, что бы не правоцировать ненужные действия после выбора пункта.
66  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 26, 2015, 14:56
Хорошо. Выкрутился снова:
Код
C++ (Qt)
 connect( m_proxyLineEdit, SIGNAL( textChanged( QString const & ) ),
          m_proxyModel, SLOT( setFilterWildcard( QString const & ) ) );
 
 connect( m_proxyLineEdit, SIGNAL( textChanged( QString const & ) ),
          m_proxyModel, SIGNAL( proxyDataChanged() ) );

Но как то не совсем интуитивно по поводу приоритета сигналов. Может ли случиться, сначала перерасчет счетчика, а затем фильтрация?
Но тем не менее работает правильно.
67  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 26, 2015, 14:34
Еще заморочка. Комбинирую фильтр с RegExp. Ловлю QString со строки ввода. И тут все в порядке:
Код
C++ (Qt)
bool proxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
 QString word = sourceModel()->data(sourceModel()->index(sourceRow, 0, sourceParent)).toString();
 
 if(m_filterSet.contains(word))
 {
   QRegExp rx(filterRegExp().pattern(), Qt::CaseInsensitive, QRegExp::WildcardUnix);
 
   emit proxyDataChanged(); //HOW TO DO
 
   return word.contains(rx);
 }
 return false;
}

Но необходимо обновить счетчик пойманных слов в другом объекте. Отправляю сигнал emit proxyDataChanged();. Однако с этого переопределенного слота сигнал не отправляется. Как быть?
68  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 14:08
Так просто не получится иначе бы не заморачивался. Возможно переменную индекса неудачно назвал.
Как видим из меню пользователь не обязательно мог навести курсор на текущий инденкс. Иначе он мог бы удалить не ожидаемый пункт.
Как мне кажется выбрал более интуитивный вариант - отсылаем позицию курсора.
69  Qt / Model-View (MV) / Re: QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 12:42
Ладно будем думать, что молчание знак того, что ерундой занимаюсь и так не делают. Просто не хотел заводить вторую переменную если можно было обойтись одной. Но может это излишняя предосторожность.
Создал булеву переменную.
70  Qt / Model-View (MV) / QSortFilterProxyModel - удаление строки : Апрель 26, 2015, 08:03
Удаляю итем в прокси модели через Контекстное меню и клавишу Del. Заодно покритикуйте решение или предолжите лучше.
Контекстное меню устроил так:
Код
C++ (Qt)
void proxyPaneWidget::showCustomMenu(const QPoint &pos)
{
 m_currentItemIndex = m_proxyList->indexAt(pos);
 
 m_proxyMenu->addAction( m_deleteAction );
 m_proxyMenu->exec( m_proxyList->mapToGlobal( pos ) );
 
 m_currentItemIndex...; // HOW TO DO?
}
В методе удаления проверяю как пользователь хочет удалить итем, через Контекстное меню или с помощью клавиши Del:
Код
C++ (Qt)
void proxyPaneWidget::deleteSelectedItem()
{
 QModelIndex index = m_proxyList->currentIndex();
 
 if( m_currentItemIndex.isValid() )
   index = m_currentItemIndex;
 
 m_source->removeItem(m_proxyModel->mapToSource(index).row());
}

Проблема в том, что если пользователь вызывал контекстное меню и передумал удалять, то индекс остается, соответственно есть шанс удалить клавишей не ожидаемый пользователем итем.
В модели дерева файловой системы меню удаления делал подобным же образом, но там можно было просто послать строку пути, которую не сложно было обнулить.
Собственно вопрос такой. Как сделать индекс m_currentItemIndex невалидным или занулить? Наверное подобный вопрос можно было бы задать в ветке для новичков. Но может само решение удаления не выдерживает критики?
71  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 24, 2015, 12:09
Сбрость m_proxyModel не удается.
Создал слот:
Код
C++ (Qt)
void proxyPaneWidget::noSortProxy()
{
 m_proxyModel = new ProxyModel( this );
 m_proxyModel ->setSourceModel( m_sourseModel );
 m_proxyList->setModel( m_proxyModel );
}

Однако изначально m_proxyModel инициализируется в конструкторе, таким же образом: m_proxyModel = new ProxyModel( this );.
Насколько корректно такое решение и какими неприятностями оно может грозить? Может ли привести к утечке памяти? И может все таки можно как то сбросить исходную модель? Метод reset() не помогает и invalidate() вроде как отвечает за сброс сортировки, так же почему то не срабатывает. Какие могут быть ошибки?
72  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 24, 2015, 10:13
К сожалению не осознал.
Для прокси свое окно. И повторная установка оригинальной модели не дает результат:
m_proxyModel->setSourceModel(m_sourseModel);
m_proxyList->setModel(m_proxyModel);


Даже если перед этим поставть метод invalidate();
73  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 24, 2015, 09:36
Основной список несортирован.
При установке прокси список так же не сортирован.
Создаю меню - Сортровать по алфавиту. Здесь все в порядке.

Создаю меню - Отменить сортировку. Как вернуть в исходное состояние Проксимодель? Метод invalidate() не помогает.
74  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 23, 2015, 10:10
Работает та без проблем. Но может этот метод просто выдает какой сигнал, который обновляет представление, а сам предназначен для чего то иного. Честно не осознал для чего. Работает, но не хотелось бы что бы что то работало в холостую. Хотелось бы использовать именно то, что для этого и предназначено.
75  Qt / Model-View (MV) / Re: QSortFilterProxyModel - фильтр по списку : Апрель 22, 2015, 09:30
После смены фильтрующего списка QSet, вызвал метод invalidateFilter ();. Вроде как работает.
Подскажите правильно ли я понял этот метод?
Код
C++ (Qt)
void ProxyModel::openFilterFile( QString const & name )
{
 m_filterSet.clear();
 
 QFile file(name);
 if (file.open(QIODevice::ReadOnly)) {
   QTextStream stream(&file);
   while (!stream.atEnd()) {
     QString line = stream.readLine();
     m_filterSet.insert(line);
   }
 }
 
 invalidateFilter ();
}
Страниц: 1 ... 3 4 [5] 6 7 ... 9

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