Выбор строки после редактирования, QSqlQueryModel + QSortFilterProxyModel + QTableView |
Здравствуйте, гость ( Вход | Регистрация )
Выбор строки после редактирования, QSqlQueryModel + QSortFilterProxyModel + QTableView |
512es |
1.12.2009, 15:05
Сообщение
#1
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Всем привет!
Много гуглил, искал решение, чего только не перепробовал. Но проблему так и не удалось решить: На основе примера *\qt\examples\sql\querymodel\editablesqlmodel.cpp сделал редактируемую QSqlQueryModel, и прикрутил к ней QSortFilterProxyModel. Вот кусок кода, по которому видно, что я уже перепробовал:
Задача: после редактирования ячейки обновить отображаемые данные в таблице и оставить выбранной ячейкой ту, которую мы редактировали. Для этой цели вызываю сигнал emit signalGoToClientById(index), который соединён со слотом:
Оно работает, но если я выхожу из редактирования кликом мышки, то после того как выставить нужную ячейку, курсор переходит на ту строку, куда я кликнул. Помогите люди добрые, наверняка вы уже сталкивались с этой же проблемой.. Сообщение отредактировал 512es - 1.12.2009, 15:07 |
|
|
Litkevich Yuriy |
1.12.2009, 15:49
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
после редактирования ячейки обновить отображаемые данные в таблице и оставить выбранной ячейкой ту, которую мы редактировали. тут нужна оговорка, "если эта ячейка ещё существует" т.к. в ощем случае её мог удалить другой пользователь.Модельные индексы непостоянны, т.е. они имеют свойство менять своё значение (показывать в другое место). Попробуй запоминать "постоянный модельный индекс" (QPersistentModelIndex) и по нему восстанавливать выделение |
|
|
512es |
7.12.2009, 16:09
Сообщение
#3
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Модельные индексы непостоянны, т.е. они имеют свойство менять своё значение (показывать в другое место). Попробуй запоминать "постоянный модельный индекс" (QPersistentModelIndex) и по нему восстанавливать выделение QPersistentModelIndex не решил моей проблемы( Если не пытаться переходить на изменившуюся ячейку, т.е. // emit signalGoToClientById(index); то курсор будет переходить туда, куда мы кликнули. Но если прокрутить таблицу вниз, и попытаться изменить ячейку, после чего перейти кликом на другую, то курсор попадёт туда, где была бы эта строка, если бы мы были вначале списка. Описание глюка: Допустим, в таблице 10 строк. За раз видно на экране 5 строк. 1) При редактировании 3-ей строки и выхода из редактирования кликнув на 4-ую мы попадём на 4-ую (как вроде и должно быть) Цитата [зона видимости 1...... 2...... 3...... <- редактируем 4...... <- клик, выход из редактирования <- попадаем сюда 5...... зона видимости] 6...... 7...... 8...... 9...... 10.... 2) А если мы прокрутили таблицу в конец (т.е. видим только 6-10 строки), редактируем 8-ую строку, и выходим из редактирования кликом на 9-ую, мы снова попадём на 4-ую строку! Цитата 1...... 2...... 3...... 4...... <- попадаем сюда!!!! 5...... [зона видимости 6...... 7...... 8...... <- редактируем, надо перейти сюда 9...... <- клик, выход из редактирования 10.... зона видимости] А теперь, если я даже вызову сигнал перехода на нужную строку, после обновления данных: 3) Редактируем 8-у, клик по 9-ой, сигналом перескакиваю на 8-ю (как и должно быть), но потом всё равно курсор возвращается на 4-ую строку! Я даже пробовал переходить на одну и ту же конкретную строку, например: selectRow(900); Всё равно попадаю туда, куда кликнул до обновления таблицы. Хелп! |
|
|
Litkevich Yuriy |
7.12.2009, 17:19
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
512es |
9.12.2009, 17:26
Сообщение
#5
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
selectRow(900); это не переход на строку, а её выделение, для перехода нужно устанавливать текущую, ключевые слова: "set current"setCurrentIndex(cur) ? Это в первом посте. Пробовал и так и так. У меня в таблице выделение по строкам идёт, поэтому для меня сейчас это синонимы. Так и не решил проблему. Перепробовал уже, как мне кажется, все возможные методы.. Перегуглил весь инет. Неужели нельзя QSqlQueryModel заставить работать как полагается?? В QSqlTableModel была у меня такая же проблема, я её решил с помощью updateRowInTable() в setData(). Но, в QSqlQueryModel нету возможности изменять данные в таблице! По крайней мере я не нашёл.. Хотя есть одна идейка только.. Через data() менять текст отображения изменёных ячеек. А изменёные индексы и содержание хранить в массиве.. Вот только не знаю, на сколько это правильно.. Мужики, выручайте, проект горит! Подскажите, в какую сторону копать! |
|
|
Litkevich Yuriy |
9.12.2009, 17:35
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
512es |
9.12.2009, 21:46
Сообщение
#7
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Litkevich Yuriy, за SelectionModel спасибо. Хоть мне и не нужно многостроковое выделение, зато с помощью QItemSelectionModel теперь могу выделять строку прямо из класса модели, без сигналов.
Вот только всё равно это не решило проблему. QItemSelectionModel, setCurrentIndex() и selectRow() дают тот же результат (в моём случае). Делаю вот так:
Получаем вот такой результат:
Может через Block Signal? Вот только не знаю, какой.. И откуда он берётся.. |
|
|
512es |
9.12.2009, 23:11
Сообщение
#8
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Уф.. У меня получилось!!
Полторы недели мучений, а оказывается всё было так просто!! Решение: Нельзя обновлять модель в setData() через повторное setQuery! Обновлять нужно так: this->query().exec(); И никто мне не подсказал.... =( Сообщение отредактировал 512es - 9.12.2009, 23:14 |
|
|
Текстовая версия | Сейчас: 12.12.2024, 9:41 |