用GTK接口创建逻辑门模拟器
如何制作大门的放置区域?
我想使用GTK从系统接口集成中获益,但我不知道如何为这个放置区域制作小部件。在这个区域,我们应该能够放置门,连接在一起,缩放,移动视图,选择,编辑,删除门,等等。。。
名为GtkFixed的小部件可以自由接收其他小部件,并可以处理有关编辑、选择等的信号。。。就像我想要的编辑区。但我不知道这是否是我想要的。
所以,我的问题是:
有关于我想做什么的文件吗?
我使用这个GtkFixed小部件的方向对吗?
如果没有,我应该用什么?(可能是GtkDrawingArea小部件?)
编辑:经过更多的研究,我需要的是一个GtkDrawingArea,但是使用cairo库就像用锤子杀死一只苍蝇。

最佳答案

要使用的小部件是Gtk::DrawingArea
步骤:
创建一个继承自Gtk::DrawingArea的类。
通过在继承类中声明bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr);方法重写默认绘图处理程序。
在这个函数中,使用Cairo::Context渲染您想要的任何内容,这里是documentation
每次有必要时,Gtk都会调用此方法,但可以通过调用queue_draw()DrawingArea方法强制调用此方法。
鼠标、键盘和其他类型的事件可以通过重写事件处理程序或连接到自定义函数的信号来处理。
要接收事件类型,必须使用add_events(eventTypeFlag)方法设置标志。对于键盘事件,DrawingArea小部件必须抓住焦点。
例子:

class MyClass: Gtk::DrawingArea {
public:
    MyClass() {
        set_can_focus();
        add_events(Gdk::BUTTON_PRESS_MASK | Gdk::KEY_PRESS_MASK);
    }

protected:
    bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) {
        cr->move_to(0, 0);
        cr->rel_line_to(100, 100);
        cr->set_source_rgb(1.0, 0.0, 0.0);
        cr->set_line_width(6);
        cr->stroke();
        return true;
    }

    bool on_button_press_event(GdkEventButton* event) {
        grab_focus();
        std::cout << "click with button #" << event->button << std::endl;
        return true;
    }

    bool on_key_press_event(GdkEventKey* event) {
        std::cout << "key #" << event->keyval << " pressed" << std::endl;
        return true;
    }
};

文档:
GtkmmAPI doc
Gtk drawing area
Cairo context
Gdk events

07-24 21:03