Re: signal_button_press_event() not sending signal?



Matthew Ryan Hurne wrote:

On Sun, 2004-12-19 at 22:59 +0100, Antonio Coralles wrote:
Matthew Ryan Hurne wrote:

> First of all, let me hint that I am very new to Gtkmm programming, and
> relatively new to C++ programming in general.
>
> I am trying to write a simple program that draws a bezier curve in a
> DrawingArea which can be manipulated by clicking and dragging its
> control points.
>
> Right now the program draws a curve, but I have not yet successfully
> implemented anything to manipulate it.  That's what I'm working on.
>
> I figured I'd start by figuring out how to detect a button click on the
> DrawingArea.  I know I'll need to get the coordinates of the mouse
> pointer as well.  From reading the tutorial, etc. it seemed that
> Widget::signal_button_press_event() is the appropriate method to
use.  I
> have connected it to a signal handler in my MainWindow class.
> Everything compiles fine but the code in my signal handler doesn't seem
> to execute.
>
> Here's what code it seems you'd need.
> In MainWindow's constructor (curveArea is my DrawingArea):
>
> curveArea.signal_button_press_event().connect(sigc::mem_fun(*this,
> &MainWindow::on_curve_button_press_event));
>
> A protected member of MainWindow:
>
> bool MainWindow::on_curve_button_press_event(GdkEventButton* event)
> {
>         std::cout << "The drawing area was clicked" << std::endl;
>
>         return true;
> }
>
> I searched the web for a while trying to find any hints, and was only
> able to find something on a mailing list from 2002 that said it was a
> bug.  Seems like that wouldn't be relevant anymore.  Any help would be
> greatly appreciated. If you want all my source code, I can attach
it in
> a future e-mail.  I wasn't sure if that was proper mailing list
> etiquette so I figured I'd leave it out in this message.  Oh and one
> more thing...I'm having a lot of fun learning all this stuff.  :-)
>
> Matthew Hurne
>
> _______________________________________________
> gtkmm-list mailing list
> gtkmm-list gnome org <mailto:> <mailto:>
> http://mail.gnome.org/mailman/listinfo/gtkmm-list

I would suggest you to read
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch14.html. To
detect mouse clicks i would override bool
Gtk::Widget::on_button_press_event(GdkEventButton*  event)  ... For
further documentation for the various GdkEvent structs you may look at
http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html.

antonio
_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org <mailto:>
http://mail.gnome.org/mailman/listinfo/gtkmm-list

Thanks for the tip on reading chapter 14, though I've already done that.
I have been able to draw the curve, control points, and lines connected
the control points just fine.  I haven't coded the interaction between
the mouse and the curve, that's where I'm at now.

Thanks a TON for the link to the GDK event structures.  Though right now
I can't use it because it seems the mouse clicks aren't even being
"detected", it will definitely be important when it comes to checking
the mouse position and whether a control point has been clicked.

I did what you suggested, or at least what I think you suggested, with
no results.  I have inherited my own class, called CurveArea, from
DrawingArea.  I overloaded its on_button_press_event(GdkEventButton
*event) member with the following:

bool CurveArea::on_button_press_event(GdkEventButton* event)
{
        if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
               std::cout << "The drawing area was clicked"
                          << std::endl;
        }

        return true;
}

Here is the relevant line in CurveArea's constructor:

        this->signal_button_press_event().connect(sigc::mem_fun(*this,
&CurveArea::on_button_press_event));

I'm guessing I don't need the this->, but I figured being explicit
couldn't hurt.

Yes, you don't need it ....

When clicking on the CurveArea, nothing is printed to the console.
Help! Ahh!

Maybe you've put your drawing area into a widget which doesn't receive X events [ http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch12.html ]. A Gtk::EventBox might help ...
By the way: are you working in windows or linux ?


Oh, by the way, why does on_button_press_event have to return a bool?

To be honest, i'm not sure about this myself; as far as I know, returning true indicates that the event has been handled ....

antonio



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]