- Qt — Почему я не могу вызвать mousePressEvent для своей пользовательской кнопки в MainWindow
- Решение
- Другие решения
- Не приходят mousePressEvent от дочерних item’ов а
- Подписчики
- Thread: mousePressEvent problem
- mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Re: mousePressEvent problem
- Не приходят mousePressEvent от дочерних item’ов а
- Subscribers
- mousePressEvent
- Подписчики
Qt — Почему я не могу вызвать mousePressEvent для своей пользовательской кнопки в MainWindow
Я впервые спрашиваю о переполнении стека. Если есть предложения по поводу вопроса, пожалуйста, дайте мне знать.
Я очень новичок в Qt, и у меня есть некоторые проблемы при использовании событий. Надеюсь, что кто-то может предоставить любые мысли.
Фон:
У меня есть пользовательская кнопка, которая rxPushButton в rx.h а также rx.cpp , я использую on_rxPushButton_clicked изменить изображение, и это работает довольно хорошо.
В MainWindow Мне нужно использовать некоторые rx поэтому я включаю класс rx и я хочу определить, нажимаю ли я левую кнопку мыши, мне нужно знать, какая rx был нажат и запишите его идентификатор в int rxId в MainWindow ,
Проблема:
Я пробовал два способа достижения своей цели, в том числе mousePressEvent а также eventFilter , Я обнаружил, что не могу обнаружить сигнал нажатия мыши на любом rx , но я могу обнаружить это снаружи rx в других местах Mainwindow , Интересно, будут ли события конфликтовать, но когда я комментирую on_rxPushButton_clicked в rx.cpp , MainWindow все еще не работает для проблемы. Поэтому я предполагаю, что, возможно, пространство на экране занято rx не будет контролировать MainWindow (Я могу получить сообщение отладки «test1», но не «test2» в моем коде, проверьте ниже).
Как мне сделать, чтобы решить эту проблему, если мне нужны обе вещи (изменить изображение в rx и изменить одну переменную в MainWindow )? Или, может быть, это просто что-то не так с моим кодом и как изменить?
Я надеюсь разделить их, если это возможно, потому что мне все еще нужно включить много объектов в MainWindow в будущем.
Вот некоторые из моих связанных кодов:
Решение
Изменить изображение в rx
Используйте класс QSignalMapper, который связывает сигналы от QWidgets (класс rx) и повторно излучает их с параметрами виджета (класс rx), соответствующими объекту, который отправил сигнал.
Мы соединяем сигнал каждой кнопки clicked () со слотом map () преобразователя сигналов и создаем отображение в преобразователе сигналов от каждой кнопки до самой кнопки.
Наконец, мы подключаем сигнал mapped () преобразователя сигналов к сигналу clicked () пользовательского виджета (объект rx). Когда пользователь нажимает кнопку, пользовательский виджет (объект rx) будет испускать единственный сигнал clicked (), аргументом которого является кнопка (объект rx), по которой щелкнул пользователь.
Обрабатывать событие нажатия кнопки в функции MainWindow :: slotButtonsClicked (QWidget * p).
Изменить n переменную в MainWindow:
Вы можете обновить переменную MainWindow в функции mousePressEvent
Надеюсь, это работает 🙂
Другие решения
События, распространяющиеся, мешают вам это сделать. Когда мышь находится над кнопкой, событие отправляется кнопке, а не в главное окно, поэтому вы никогда не увидите test2 в отладочном выводе.
Так как я не знаю, что тебе нужно, трудно сказать, что ты должен делать. Вы можете обработать событие в кнопке и отправить несколько сигналов или что-то еще, или установить фильтр событий и проверить, является ли целевой объект вашей кнопкой, и так далее.
В любом случае, читайте Документация по системе событий Qt для лучшего понимания.
Источник
Не приходят mousePressEvent от дочерних item’ов а
На QGraphicsScene размещен переопределенный QGraphicsRectItem, в который добавлены с помощью addItem несколько дочерних QGraphicsRectItem. Фильтр событий для child’ов включен (setFiltersChildEvents(True)). По идее, любой клик на child, должен вызывать mousePressEvent у родительского QGraphicsRectItem, но это не работает. Клики на родителе работают. В документации внятного примера не нашел, только про игнорирование hoverEvent’ов от child. Что я делаю не так?
Рекомендуем хостинг TIMEWEB
Подписчики
Код смотреть нужно, что именно там напереопределяли. Метод mousePressEvent переопределяли? Если да, то по-хорошему нужно вызывать метод базового класса mousePressEvent, чтобы дальше по стеку событий прокинуть событие в родительские объекты.
Метод mousePressEvent переопределил только для отладочной информации, super вызываю. Если выкинуть все лишнее, не относящееся к вопросу, то примерно так:
Редактировать оказывается свой ответ нельзя. В общем, меня интересует, как мне получить event нажатия на new_child. Отрисовывается он нормально, перетаскивается вместе с родителем, но вот события не шлет
- Евгений Легоцкой → istiksi
- #
- 7 мая 2017 г. 21:27
- Ответ был помечен как решение.
В общем события сыпятся в другой обработчик. В один общий обработчик для всех событий.
До редактирования комментариев на сайте пока руки не доходят, чтобы написать. Так что пока без редактирования.
Источник
Thread: mousePressEvent problem
Thread Tools
Search Thread
Display
mousePressEvent problem
I have reimplemented mousePressEvent inside of a QGLWidget. It never gets called.
I have also reimplemented mouseMoveEvent in the same widget (as recounted in an earlier post). It gets called satisfactorily.
I dont think there is anything odd about my function:
Is there something special I need to know about reimplementing mousePressEvents? I tried implementing it on the parent of my QGLWidget, and it indeed got called when I clicked in the non-covered up part of the parent—
I am setting stereo mode on the QGLWidget, but it doesn’t seem to make any difference when I dont do so.
I’m baffled, and would greatly appreciate any help. My apologies if this seems like a repost, but my last query was asking for help with mouseMoveEvent, and after I solved my move problem and posed my press problem, I never got any responses
Re: mousePressEvent problem
How do you know it is not being called?
Put a break point on the first line and see if it gets caught, may be( FLOATING_DOT == mouseMode ) is false.
Re: mousePressEvent problem
Or replace mouseMoveEvent and mousePressEvent..I mean get the pressEvent just top of the moveEvent and try..
Re: mousePressEvent problem
This is how I know it is not being called—I have done just what you suggested
Re: mousePressEvent problem
not sure what you mean by this. Are you saying to re-order the functions? Why would that matter?
Re: mousePressEvent problem
not sure what you mean by this. Are you saying to re-order the functions? Why would that matter?
ps: sorry about the unquoted reply that probably didn’t make much sense with no context, it’s early in the workday.
Re: mousePressEvent problem
Exactly..Once I’ve faced with such a problem. And after I replace the regarding functions, it was OK.
Re: mousePressEvent problem
I was having what sounds like a similar problem recently where a custom QWidget (comprising QPushButton and QSpinBox) was being added to a QMenu as a QWidgetAction. I wanted a click (or mouseReleaseEvent) from the QPushButton to «activate» the QActionWidget.
I had to do a little work to get the mouseReleaseEvent to propagate through to the QMenu (using this post). I managed to catch execution in QMenu::activate, but d->mouseDown was not set. I think it had to do with clicking on the QPushButton which was not being considered to be «inside» the QWidgetAction and therefore failing to actually properly activate the QWidgetAction. This is the thread.
I solved my problem with a simple workaround, but would like to get it working using events properly.
EDIT: I just had a look at your code snippet again. I think you might need to call mousePressEvent on your base class in void ImageGLView::mousePressEvent(QMouseEvent *event).
EDIT: I take it back — I reread you post and I realised that your mousePressEvent isn’t even being called. Is the base class mousePressEvent being called when clicking inside QGLWidget (unlikely)? Is the parent’s mousePressEvent being called when you click inside the QGLWidget (should happen under normal circumstances, as far as I understand)?
Last edited by stefanadelbert; 16th April 2010 at 09:25 .
Re: mousePressEvent problem
I was having what sounds like a similar problem recently where a custom QWidget (comprising QPushButton and QSpinBox) was being added to a QMenu as a QWidgetAction. I wanted a click (or mouseReleaseEvent) from the QPushButton to «activate» the QActionWidget.
I had to do a little work to get the mouseReleaseEvent to propagate through to the QMenu (using this post). I managed to catch execution in QMenu::activate, but d->mouseDown was not set. I think it had to do with clicking on the QPushButton which was not being considered to be «inside» the QWidgetAction and therefore failing to actually properly activate the QWidgetAction. This is the thread.
I solved my problem with a simple workaround, but would like to get it working using events properly.
EDIT: I just had a look at your code snippet again. I think you might need to call mousePressEvent on your base class in void ImageGLView::mousePressEvent(QMouseEvent *event).
no, the base class mousePressEvent is NOT being called,or does it appear that the parents mousePressEvent is being called
Источник
Не приходят mousePressEvent от дочерних item’ов а
На QGraphicsScene размещен переопределенный QGraphicsRectItem, в который добавлены с помощью addItem несколько дочерних QGraphicsRectItem. Фильтр событий для child’ов включен (setFiltersChildEvents(True)). По идее, любой клик на child, должен вызывать mousePressEvent у родительского QGraphicsRectItem, но это не работает. Клики на родителе работают. В документации внятного примера не нашел, только про игнорирование hoverEvent’ов от child. Что я делаю не так?
We recommend hosting TIMEWEB
Subscribers
Код смотреть нужно, что именно там напереопределяли. Метод mousePressEvent переопределяли? Если да, то по-хорошему нужно вызывать метод базового класса mousePressEvent, чтобы дальше по стеку событий прокинуть событие в родительские объекты.
Метод mousePressEvent переопределил только для отладочной информации, super вызываю. Если выкинуть все лишнее, не относящееся к вопросу, то примерно так:
Редактировать оказывается свой ответ нельзя. В общем, меня интересует, как мне получить event нажатия на new_child. Отрисовывается он нормально, перетаскивается вместе с родителем, но вот события не шлет
- Evgenij Legotskoj → istiksi
- #
- May 7, 2017, 9:27 p.m.
- The answer was marked as a solution.
В общем события сыпятся в другой обработчик. В один общий обработчик для всех событий.
До редактирования комментариев на сайте пока руки не доходят, чтобы написать. Так что пока без редактирования.
Источник
mousePressEvent
Рекомендуем хостинг TIMEWEB
Подписчики
- Потому, что вы переопределяете метод класса, наследованного от QWidget и у него метод реализован с QMouseEvent, а вы дёрнули методы из графической сцены, которая наследована напрямую от QObject и реализует свой собственный метод mousePressEvent, который в своб очередь имеет другую сигнатуру.
Фактически вы не переопределили метод, как требовалось а написали его перегрузку, которая нигде в стеке событий не вызывается в принципе.
Виджет окна и графическая сцена это совершенно различные сущности. - Виджет окна и графическая сцена имеют свои собственные системы координат. Нужно либо маппить координаты из системы координат окна в систему координат графической сцены, что заведомо неправильно, вы же кликаете по графической сцене в первую очередь.
Поэтому нужно наследоваться от графической сцены, как было показано в уроке.
Создал новый класс который наследуется от QGraphicsScene. Внутри класса переопределил нажатие мыши.(как в уроке). Но при сборке проекта возникает ошибка «неразрешенный внешний символ . drawmouse::drawmous(Qobject) в функции mainwindow::mainwindow(QWidget)».
- Евгений Легоцкой → otvertka
- #
- 29 апреля 2018 г. 0:48
- Ответ был помечен как решение.
очистить проект, удалить build папку, проверить, чтобы метод был реализован. И что это за метод drawmouse? Вообще, показывайте код.
Источник