[Qt-interest] Question regarding QTimer
Anton Chernov
mechernov at gmail.com
Thu Mar 17 14:10:59 CET 2011
The events you get could be blocked by another widget that is a child of the
widget those events you are filtering.
Lets say you have:
QWidget* mother = new QWidget;
QWidget* dauther = new QWidget(mother);
QWidget* son = new QWidget(mother);
MyEventFilter* filter = new MyEventFilter;
mother->installEventFilter(filter); // you are filtering the events of
mother, but the mother get them only when those events are ignored by
dauther | son (depend on what you press on).
My advice was to look if you have some of dauthers and sons in your code :)
2011/3/17 william.crocker at analog.com <william.crocker at analog.com>
>
> >
> > I'm sorry, but I didn't get your point. I'm receiving the mouse event
> > fine to the widget that I want them, and I'm handling those and not
> > propagating these events further. The problem that I'm facing is when
> > user press mouse for long time inside the widget, I want to do something
> > before user releases the mouse. The 1st thing that came to my mind, is
> > to use Qtimer, and do the thing after timeout occurs, but the slot is
> > called always only after the mouse is released. Are you suggesting,
> > that the timer behavior will be affected if events are propagated or
> > something on that path?
> >
> > Any other ideas how to achieve the functionality? I.e to do something
> > after user holds mouse for certain time (without releasing it).
> >
>
> Why don't you investigate how *this* is implemented (and I quote) :
>
> QToolButton::DelayedPopup
>
> After pressing and holding the tool button down for a certain amount of
> time (the timeout is style dependent, see
> QStyle::SH_ToolButton_PopupDelay), the menu is displayed. A typical
> application example is the "back" button in some web browsers's
> tool bars. If the user clicks it, the browser simply browses back to the
> previous page. If the user presses and holds the button
> down for a while, the tool button shows a menu containing the current
> history list
>
> > Thanks,
> > vesa
> >
> > On Thu, Mar 17, 2011 at 12:18 PM, Anton Chernov <mechernov at gmail.com
> > <mailto:mechernov at gmail.com>> wrote:
> >
> > Ok, here are the highlights:
> >
> > > Qt automatically grabs the mouse when a mouse button is pressed
> > inside a widget; the widget will continue to receive mouse events
> > until the last mouse button is released. A mouse event contains a
> > special accept flag that indicates whether the receiver wants the
> > event. *You should call ignore() if the mouse event is not handled
> > by your widget.*
> > *Make sure you call ignore in the custom widget. (Or QWidget::event()
> )
> > *
> > *
> > *
> > > Qt::WA_NoMousePropagation. *Schould be off!*
> > *
> > *
> > But if the worst case is the following:*
> > *
> > > If you create new widgets in the mousePressEvent() the
> > mouseReleaseEvent() may not end up where you expect, depending on
> > the underlying window system (or X11 window manager), the widgets'
> > location and maybe more.
> > Then maybe its worth reporting a bug.
> >
> >
> > 2011/3/17 Vesa Shmuel Peltonen <vesashmuel at gmail.com
> > <mailto:vesashmuel at gmail.com>>
> >
> > Thanks guys for your help so far!
> >
> > I'm checking the relevant object in the filter, and the filter
> > is installed on a custom Qwidget.
> >
> > Here are the relevant traces. As you can see, the timer slot is
> > called only after the mouse is released. The timeout probably
> > has happened before that, because it is called immediately after
> > mouse release event (when non zero timeout is used).
> >
> > [Qt Message] eventFilter: IN
> > [Qt Message] eventFilter: mouse press
> > [Qt Message] starting longpress timer with 0 timeout
> > [Qt Message] eventFilter: OUT
> >
> > [Qt Message] eventFilter: IN
> > [Qt Message] eventFilter: mouse move
> > [Qt Message] eventFilter: OUT
> >
> > [Qt Message] eventFilter: IN
> > [Qt Message] eventFilter: mouse move
> > [Qt Message] eventFilter: OUT
> >
> > [Qt Message] eventFilter: IN
> > [Qt Message] eventFilter: mouse move
> > [Qt Message] eventFilter: OUT
> >
> > [Qt Message] eventFilter: IN
> > [Qt Message] eventFilter: mouse release
> > [Qt Message] eventFilter: OUT
> >
> > [Qt Message] longPressTimeOutSlot IN
> >
> >
> > On Wed, Mar 16, 2011 at 6:43 PM, Anton Chernov
> > <mechernov at gmail.com <mailto:mechernov at gmail.com>> wrote:
> >
> > Where is you filter installed? Make sure this widget gets
> > the events.
> >
> > By the way I would check if this is the right object in the
> > params (*object) ... :) Installing this filter on qApp will
> > cause you hell :)
> >
> > 2011/3/16 Vesa Shmuel Peltonen <vesashmuel at gmail.com
> > <mailto:vesashmuel at gmail.com>>
> >
> > Yes, I know :)
> > The timer is started only once, when mouse is pressed. I
> > expected, that the timer will timeout after 150 ms even
> > when the mouse is still down, but it is not.
> > So, the sequence is this:
> > 1. Mouse press down
> > -> timer started (I tried even 0 with timeout)
> > 2. Mouse hold down for long time
> > 3. Mouse released
> > => timeout slot is called only here (even with 0
> timeout).
> >
> > As I said, tried this only on S^3, maybe platform
> > specific behavior?
> >
> > Thanks again,
> > Vesa
> >
> >
> > On Wed, Mar 16, 2011 at 5:16 PM, Atlant Schmidt
> > <aschmidt at dekaresearch.com
> > <mailto:aschmidt at dekaresearch.com>> wrote:
> >
> > Vesa:
> >
> >
> >
> > You know that QTimers are “retriggerable”, right?
> > That is,
> > if you do an m_timer->start(150) multiple times,
> each
> > within 150 ms of the previous one, the timer
> > doesn’t time-out
> > until 150 ms after the **LAST** call to start().
> >
> > Perhaps you’re getting more MouseButtonPress events
> > than you think and they’re re-triggering your
> > timer? Maybe
> > you can place some debugging print or some such in
> the
> > path that start()s the timer?
> >
> >
> >
> > Atlant
> >
> >
> >
> >
> ------------------------------------------------------------------------
> >
> > *From:*
> > qt-interest-bounces+aschmidt=dekaresearch.com
> > <http://dekaresearch.com>@qt.nokia.com
> > <http://qt.nokia.com>
> > [mailto:qt-interest-bounces+aschmidt
> > <mailto:qt-interest-bounces%2Baschmidt>=
> dekaresearch.com
> > <http://dekaresearch.com>@qt.nokia.com
> > <http://qt.nokia.com>] *On Behalf Of *Vesa Shmuel
> > Peltonen
> > *Sent:* Wednesday, March 16, 2011 10:39
> > *To:* qt-interest at qt.nokia.com
> > <mailto:qt-interest at qt.nokia.com>
> > *Subject:* [Qt-interest] Question regarding QTimer
> >
> >
> >
> > Hello all,
> >
> >
> >
> > I've simple question. I'm trying to start a timer
> > when mouse press event is received on eventfilter:
> >
> >
> >
> > xxx::eventFilter(QObject *object, QEvent *event)
> >
> > {
> >
> >
> >
> > if ( event->type() == QEvent::MouseButtonPress )
> >
> > {
> >
> >
> >
> > m_timer->start(150); // msec
> >
> > ...
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > It seems that the timer timeouts always only after
> the mouse is released, even if the mouse press is very long (many seconds).
> >
> > Is this known behavior and is there way to overcome
> the problem? Is the system process blocking the application thread during
> the mouse press, so even if the timeout should have happen much earlier, the
> slot is called only after the mouse is released?
> >
> > Btw, my environment is Qt 4.7.2 on *S^3 device*. I've
> not tested the behavior on other platforms.
> >
> >
> >
> >
> >
> > Thanks,
> >
> > Vesa
> >
> >
> >
> > Click here
> > <
> https://www.mailcontrol.com/sr/xVgY2I1OSnbTndxI!oX7UiNQo6b55PW6E6Mk6PJ6lylK0Gxzl8M9JqgO7Csb+Br3JfPdjQoD3dvZM0Vr2cPI!w==
> >
> > to report this email as spam.
> >
> >
> >
> ------------------------------------------------------------------------
> > This e-mail and the information, including any
> > attachments, it contains are intended to be a
> > confidential communication only to the person or
> > entity to whom it is addressed and may contain
> > information that is privileged. If the reader of
> > this message is not the intended recipient, you are
> > hereby notified that any dissemination, distribution
> > or copying of this communication is strictly
> > prohibited. If you have received this communication
> > in error, please immediately notify the sender and
> > destroy the original message.
> >
> > Thank you.
> >
> > Please consider the environment before printing this
> > email.
> >
> >
> >
> > _______________________________________________
> > Qt-interest mailing list
> > Qt-interest at qt.nokia.com <mailto:
> Qt-interest at qt.nokia.com>
> > http://lists.qt.nokia.com/mailman/listinfo/qt-interest
> >
> >
> >
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Qt-interest mailing list
> > Qt-interest at qt.nokia.com
> > http://lists.qt.nokia.com/mailman/listinfo/qt-interest
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at qt.nokia.com
> http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20110317/319a9993/attachment.html
More information about the Qt-interest-old
mailing list