[Interest] Place a QWidget below a button (and follow it!)

Sensei senseiwa at gmail.com
Tue Jun 25 16:10:15 CEST 2013


On 6/13/13 8:38 PM, Andre Somers wrote:
> While Bill is right, there is another way that allows you to do this
> without changing the main window for it: event filters. That will allow
> you to keep all the code you need for this in one place, in the widget
> that you want to make move.
>
> What I'd do, is give that widget a constructor argument with a pointer
> to the widget to follow around. Using QWidget::window, you find out what
> the window is the widget to be followed lives in. Install an event
> filter on that window-widget. If you use scrollable views somewhere,
> you'll need to iterate up yourself, to install the event filter for
> every widget in between too.
> In your widget-that-follows, reimplement the eventFilter(QObject*,
> QEvent*) method, and look for move and resize events. If you get these,
> you again take the geometry of the widget-to-follow, and use the
> mapToGlobal function of the widget-to-follow to get the global
> coordinates. Then, re-position your widget-that-follows to those
> coordinates.


Dear all,


I've tried to reimplement the moveEvent as suggested, just printing a 
string, but it's slow: I see a noticeable delay between the movement and 
the output string.

For the filter, Andre, I've probably misunderstood how to use it. Let's 
say I have a window and a follower. In the window I have to install the 
event filter, giving it as parameter the follower widget. In the 
follower, I need to reimplement the eventFilter.

Something in my code is wrong, though... Here's what I did:


mywidget::mywidget(QWidget *parent, Qt::WindowFlags flags, QWidget 
*follower) : QWidget(parent, flags)
{
     // Follow a target window
     target_ = follower;
}

bool mywidget::eventFilter(QObject *object, QEvent *event)
{
     if ((object == target_) && (event->type() == QEvent::Move))
     {
         qWarning("MOVE IT");
     }
     return false;
}



In the main window:

     installEventFilter(mywidgetInstance);


However, the "MOVE IT" is never seen :(




More information about the Interest mailing list