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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: hasSelection()==true если ничего не выбрано. Как такое возможно?  (Прочитано 4450 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 03, 2009, 18:01 »

Здравствуйте!


Столкнулся с такой проблемой. Есть объект QListView recordview. Для удаления записи из этого списка у меня есть кнопка. В определенном месте программы нужно решить, блокировать ли кнопку или не блокировать. Кнопку надо блокировать, если ни одна запись не выбрана.

Я пишу такой код

Код:
 action_delete->setEnabled(false);
 ...
 // Удаление записи
 // Пункт активен только если запись (или записи) выбраны в списке
 if(recordview->selectionModel()->hasSelection())
  action_delete->setEnabled(true);

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

Добавив дебаговый вывод увидел, что при hasSelection()==true количество выбранных строк может быть равно нулю (как??). Поэтому сделал совсем идиотскую вещь - расширил условие вот так

Код:
 if(recordview->selectionModel()->hasSelection() && 
    (recordview->selectionModel()->selectedRows()).size()>0)
  action_delete->setEnabled(true);

и все стало работать правильно.

Вопрос. Как такое возможно, что при hasSelection()==true, количество выбранных строк равно нулю? Причем, на экране запись не выбрана ни синенькой засветкой, ни пунктирными линиями вокруг записи.
Записан

Собираю информацию по крупицам
http://webhamster.ru
developer
Гость
« Ответ #1 : Январь 03, 2009, 18:15 »

Может быть, что selectionModel() некорректно удаляеться после выбора какого-либо елемента. То-есть я имею ввиду что когда ты только запустил прогу то recordview->selectionModel()->hasSelection() не существует и оно равно false, но если ты уже что-либо делал с recordview->selectionModel() то создаеться объект который уже не удаляеться, потому recordview->selectionModel()->hasSelection() равно true
Записан
Dendy
Гость
« Ответ #2 : Январь 03, 2009, 18:23 »

А что при этом в recordview->selectionModel()->selectedIndexes()?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Январь 03, 2009, 18:49 »

А что при этом в recordview->selectionModel()->selectedIndexes()?

Тоже пусто.

Цитировать
hasSelection  true
Selected rows size  0
Selected indexes size  0
Записан

Собираю информацию по крупицам
http://webhamster.ru
Dendy
Гость
« Ответ #4 : Январь 03, 2009, 18:57 »

Сходу и не поймёшь. Чем гадать на кофейной гуще зайдите отладчиком в hasSelection() и посмотрите почему он возвращает true.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Январь 03, 2009, 19:09 »

Ну кое-как решил проблему. Такое поведение происходит после кардинального изменения данных в QListView и вызова метода reset() для модели данных.

Пришлось после вызова reset() добавить вызова clear() и clearSelection() для selectionModel. После этого ситуация, когда hasSelection() говорит что что-то выбрано, а на деле ничего не выбрано, теперь не возникает.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Dendy
Гость
« Ответ #6 : Январь 03, 2009, 19:11 »

Я бы порекомендовал вернуть код в изначальный вид и понять в чём проблема. Если это баг в Qt - заслать репорт.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #7 : Январь 03, 2009, 19:49 »

Я бы порекомендовал вернуть код в изначальный вид и понять в чём проблема. Если это баг в Qt - заслать репорт.

Проблема в том, что если выставить засветку на какую-либо запись в QListView, а потом кардинально поменять данные в модели данных (ну, то есть QListView начинает показывать абсолютно другой список записей), сопроводить эту смену вызовом слота reset(), то selectionModel не сбрасывается. И видимо продолжает хранить указатель на выделенную строку, хотя той строки уже нет (она заменена на другую).

Незнаю, баг это или фича, но с англицким у меня eng->rus еще кое как, а вот rus->eng уже никак. Так что тролли остаются без моего багрепорта.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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