| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > фильтр ввода в QTableWidgetItem |
| Автор: hawk3500 12.1.2012, 14:29 |
| Здравствуйте. Возникла ситуация в которой мне надо отлавливать вводимые с клавиатуры данные в любую из ячеек таблицы QTableWidget. Никакой ни фильтр не установить ни сигнал соединить. Если сказал не ясно то опишу как пример: есть QTableWidget и нужно использовать его как основу для HEX редактора, т.е. количество вводимых символов в ячейку не превышает двух и они соответствуют HEX коду. Заранее благодарен. С уважением, HAWK3500. |
| Автор: spyswamp 12.1.2012, 15:19 |
| Обрати свой взор в сторону делегатов (в документации искать QItemDelegate и т.п.). Создавай там любой editor и ограничивай его как хочешь. |
| Автор: _GRIN_ 12.1.2012, 16:15 |
| и в createEditor() можно возвращать просто QLineEdit - ну а фильтр ему через QValidator задать =) |
| Автор: hawk3500 12.1.2012, 16:33 |
| т.е. если я Вас правильно понял то Вы предлагаете в каждую ячейку помещать какойто другой ,отличный от того что по умолчанию виджет(например QLineEdit)? |
| Автор: spyswamp 12.1.2012, 20:49 |
| Ага. Это делается по уму именно так. |
| Автор: _GRIN_ 13.1.2012, 07:44 |
| hawk3500, не совсем верно - ты задаёшь делегат 1 раз для всего вью (QTableWidget - наследник от QTableView - а он наследник от QAbstractItemView) - а уж делегат для каждого айтема при соответствующем действии (например двойной клик по ячейке) создаст редактор (будет вызвана функция createEditor() - ты её переопределяешь в своей имплементации делегата - и возвращаешь например QLineEdit с соответствующим QValidator). |
| Автор: hawk3500 13.1.2012, 07:53 |
| _GRIN_ спасибо. Сегодня попробую. |
| Автор: hawk3500 13.1.2012, 09:59 | ||
Я сделал вот так:
возможно вопрос глупый , но как в TesttextEdited получить QTableWidget родителя и допустим переключится на другую ячейку? |
| Автор: hawk3500 13.1.2012, 11:02 |
| Я так понял что createEditor вызывается каждый раз при активации поля....но если в этом поле уже были данные......как их отобразить в новообразовавшийся QLineEdit? Добавлено через 10 минут и 6 секунд С последним разобрался....а вот как из делегата обращаться к QTableWidget так и не понял |
| Автор: _GRIN_ 13.1.2012, 13:55 | ||
ну проще всего явно передавать делегату указатель на вью (в конструкторе, или в отдельной функции), т.к. при задании делегат для вью - вью не становится parent-ом делегата
Так что кастить parent() к вью - не стоит (даже если на самом деле ты в конкнструкторе делега вью указал как parent). А другого апи для данных целей кьют не предоставляет - думаю не без причины =) Добавлено через 5 минут и 12 секунд Кстати, рискну предположить, что тебе не нужен указатель на QTableWidget - я так понимаю, что ты хочешь в таблице данные изменить. Если я прав, то для этого используй QAbstractItemDelegate::setModelData(). P.S. Вообще лучше сразу смотреть в сторону model+view - а не в сторону виджетов - говорю по собственному опыту. |
| Автор: hawk3500 13.1.2012, 14:14 |
| Спасибо. Сделал как Вы рекомендовали. Всё замечательно работает))) |