我使用 goocanvas 并将信号用于连接到某些图形项目的鼠标事件。如果我使用信号处理程序中的对话框,则关闭对话框后所有信号都会中断。这是 gtkmm/goocanvas 的错误还是我的程序中的某种滥用?
错误的行为是:
您可以单击画布区域中的某个位置,没有任何事情发生,这是正确的。如果您单击圆圈,信号处理程序将启动同样预期的对话框。关闭对话框(确定按钮)后,您可以单击画布上的某处并调用信号处理程序,这是错误的。
在我的真实程序中,信号处理程序有时从未被调用,有时在错误的区域被调用等等。有点奇怪的行为。我希望有人能找到问题所在。
#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;
}