使用对话框后,goocanvas信号处理已损坏

时间:2013-11-07 17:44:24

标签: gtk gtkmm

我使用goocanvas并将信号用于连接到某些图形项目的鼠标事件。如果我使用信号处理程序的对话框,关闭对话框后所有信号都会被破坏。这是gtkmm / goocanvas的错误还是在我的程序中有点滥用?

错误的行为是:

你可以点击画布区域的某个地方,没有任何事情发生,这是正确的。如果单击圆圈,信号处理程序将启动对话框,这也是预期的对话框。关闭对话框(OK按钮)后,您可以单击画布上的某个位置并调用信号处理程序,这是错误的。

在我的真实程序中,信号处理程序有时从不被调用,有时会在错误的区域调用,依此类推。有点奇怪的行为。我希望有人能找到问题。

#include <gtkmm.h>
#include <goocanvasmm.h>
#include <sigc++/sigc++.h>

bool ShowDialog( const Glib::RefPtr<Goocanvas::Item>& item, GdkEventButton* ev)
{
    enum { OK };
    Gtk::Dialog dialog;
    dialog.add_button( Gtk::Stock::OK, OK);
    dialog.show_all_children();
    dialog.run();
    return false;
}

int main(int argc, char* argv[])
{
    Gtk::Main app(&argc, &argv);
    Goocanvas::init("example", "0.1", argc, argv);
    Gtk::Window win;

    Goocanvas::Canvas m_canvas;
    m_canvas.set_size_request(640, 480);
    m_canvas.set_bounds(0, 0, 800, 800);
    Glib::RefPtr<Goocanvas::Item> root = m_canvas.get_root_item();

    Glib::RefPtr<Goocanvas::Ellipse> outer = Goocanvas::Ellipse::create( 100,100,20,20);
    outer->property_line_width() = 5;
    outer->property_stroke_color() = "red";
    outer->property_fill_color()="blue";
    root->add_child( outer );

    sigc::connection conn2= outer->signal_button_press_event().connect( sigc::ptr_fun(&ShowDialog));

    win.add(m_canvas);
    win.show_all_children();

    Gtk::Main::run(win);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我遇到了与信号处理相同的问题。它只在OnClick()显示额外窗口时出现,在任何其他情况下,一切正常。

我的按钮是画布中的静态元素,所以我通过检查click事件的坐标来限制函数调用。 OnClick()具有与官方示例(link)相同的结构。 GdkEventButton 事件参数可以访问 x y 坐标。

我使用的是GTK +但是这个&#34;解决方案&#34;应该也适合Gtkmm。