Название: Scroll по таблице Отправлено: Виталий от Август 23, 2012, 13:40 Добрый день! Помогите пожалуйста мне в решении моей проблемы.
Мне нужно сделать необычный скролл по QTableWidget. Нужно чтобы скролить можно было зажав левую кнопку мыши на ячейке и перетаскивая вверх/вниз - таблица прокручивается (как на тачскринах(!)). Я сделал это следующим образом. У меня есть класс-наследник от QWidget в нём я переопределяю метод Код
Код
скролл в итоге работает, но возникает странный глюк: после перетаскивания окна по рабочему столу QTableWidget "думает", что левая кнопка мышки зажата и прокручивается при наведении курсора на него. В документации к qt написано что QApplication::mouseButtons() возвращает не текущее состояние нажатых кнопок мыши, а последнее зарегистрированное в произошедших ранее событиях. Отсюда вопрос: можно ли как-то принудительно сбросить состояние мыши (в Qt::NoButton)? Или возможны какие-нибудь еще варианты? Название: Re: Scroll по таблице Отправлено: lighting от Август 23, 2012, 13:52 а чего-бы не переопределить mouseEvent для TableWidget и получать только те события которые нужны?
Название: Re: Scroll по таблице Отправлено: Bepec от Август 23, 2012, 13:58 lighting частично прав.
Зачем вы обрабатываете все события ховер, если достаточно поставить фильтр на QTableWidget с целью отлова "MouseMoveEvent". MouseMoveEvent вызывается только при движении с нажатыми клавишами мыши, которые можно у него же и узнать. При чём это будет 100% достоверная информация ;) PS ну в принципе и всё ;) Название: Re: Scroll по таблице Отправлено: kambala от Август 23, 2012, 14:03 и ещё для Qt-классов желательно использовать qobject_cast вместо dynamic_cast, ну и на 0 проверять полученный указатель
а чего-бы не переопределить mouseEvent для TableWidget и получать только те события которые нужны? многие очень не любят наследоватьсяНазвание: Re: Scroll по таблице Отправлено: Виталий от Август 23, 2012, 15:03 В конструкторе установлен фильтр:
Код где: V1 - класс формы, на которой лежит tableWidget; listMenu - сам tableWidget, событие которого обрабатывается в eventFilter'е. поставить фильтр на QTableWidget с целью отлова "MouseMoveEvent" Если я правильно понял, в этом самом eventFilter' е и надо отлавливать mouseMoveEvent? Не подскажете как?Название: Re: Scroll по таблице Отправлено: Bepec от Август 23, 2012, 15:21 Код: // вот это всё находится в вашем евент фильтре ;) Примерно так. Название: Re: Scroll по таблице Отправлено: Виталий от Август 23, 2012, 15:38 При движении мыши над tableWidget тип события QEvent::HoverMove, а не QEvent::MouseMove.
И после перетаскивания окна по рабочему столу QTableWidget "думает", что левая кнопка мышки зажата и прокручивается при наведении курсора на него, то есть QApplication::mouseButtons().testFlag(Qt::LeftButton) возвращает true. Вопрос и состоит в том, как сбросить состояние мыши в Qt::NoButton. Название: Re: Scroll по таблице Отправлено: Bepec от Август 23, 2012, 15:49 Кхм. Уважаемый вы тыквы любите? А то на них похожи становитесь в моих глазах.
Повторяю в последний раз. MouseMove вызывается когда вы двигаете мышкой с зажатой клавишей(любой клавишей). Пофиг над чем двигаете. Соответственно в MouseMove имеются ( в НЁМ, а не в QApplication) адекватные на момент события состояния кнопок. PS если и это не поймёте, то что с вами делать? :/ Название: Re: Scroll по таблице Отправлено: Виталий от Август 23, 2012, 16:59 Тогда я тоже повторюсь: не знаю почему, но тип события при движении мыши - HoverMove, а не MouseMove, специально проверял, выводя event->type() в qDebug. Соответственно входной if не срабатывает. Попробовал такой вариант:
Код Теперь прокрутка работает вообще всегда, когда мышь над tableWidget'ом, даже без нажатых кнопок. При этом mouseEvent.button() возвращает какую-то чушь, отрицательное длинное целое, десятизначное, при каждом запуске приложения разное, даже если ЛКМ нажата. Как будто нажатие вообще не происходит. Название: Re: Scroll по таблице Отправлено: Bepec от Август 23, 2012, 18:58 Что сказать :) Завтра заценю что у вас там такое. Ещё б версию куте привели какую используете :)
Название: Re: Scroll по таблице Отправлено: Serr500 от Август 23, 2012, 21:39 При этом mouseEvent.button() возвращает какую-то чушь, отрицательное длинное целое, десятизначное, при каждом запуске приложения разное, даже если ЛКМ нажата. Как будто нажатие вообще не происходит. А с чего Вы взяли, что при QEvent::HoverMode вы получите QMouseEvent? В документации явно сказано, что будет QHoverEvent. Эти ошибки - последствия static_cast. Если бы Вы использовали dynamic_cast, то получили бы NULL и поняли, что что-то не так.Ловите MouseMoveEvent. MouseMove вызывается когда вы двигаете мышкой с зажатой клавишей(любой клавишей). Это если mouseTracking выключен. Если включен, то он ловит движения и без кнопок.Название: Re: Scroll по таблице Отправлено: Bepec от Август 23, 2012, 23:32 А по умолчанию, mouseTracking выключен ;)
Название: Re: Scroll по таблице Отправлено: Bepec от Август 24, 2012, 08:24 Чуть сложновато для новичка, да :)
На самом деле причина простая - в качестве виджета, отображающего элементы, используется Код: QWidget(0xa82e20, name = "qt_scrollarea_viewport") Потому поправьте код вот так и будет у вас всё работать: Код: ui.treeWidget->viewport()->installEventFilter(this); PS и да, ловить надо всё же MouseMove ;) |