用GTK创建逻辑门模拟器,如何制作放置区域
Creating a logic gate simulator with GTK, how to make the placing area?
使用GTK接口创建逻辑门模拟器
如何制作大门的放置区域
我想使用GTK从系统接口集成中受益,但我不知道如何为这个放置区域制作一个小部件。在这个区域,我们应该能够放置闸门,将它们连接在一起,缩放,移动视图,选择,编辑,删除闸门等
一个名为GtkFixed的小部件可以免费接收其他小部件,并可以处理有关编辑、选择等的信号。就像我想要的编辑区域。但我不知道这是否是我想要的。
因此,我的问题如下:
- 有关于我想做什么的文档吗
- 我使用GtkFixed小部件的方向是否正确
- 如果没有,我应该使用什么 (可能是GtkDrawingArea小部件?(
编辑:经过更多的研究,我需要的是GtkDrawingArea,但使用cairo
库就像试图用锤子杀死一只苍蝇
要使用的小部件是Gtk::DrawingArea
步骤:
- 创建一个继承自
Gtk::DrawingArea
的类 - 通过在继承类中声明
bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr);
方法来覆盖默认图形处理程序 - 在这个函数中,使用
Cairo::Context
来呈现您想要的任何内容,这是文档 Gtk
每次需要时都会调用此方法,但可以通过调用DrawingArea
的queue_draw()
方法来强制执行- 鼠标、键盘和其他类型的事件可以通过重写事件处理程序或连接到自定义函数的信号来处理
- 要接收一种类型的事件,必须使用
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;
}
};
文件:
- Gtkmm和API文件
- Gtk绘图区
- 开罗背景
- Gdk事件
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何制作一个将函数作为参数的类方法
- 如何从unique_ptr制作static_cast
- Python中的for循环与C++有何不同
- 下面是我为检测链接列表中的循环而制作的代码
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数
- 将QGraphicsItem的移动区域限制在多边形区域内
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 如何制作无限制照明系统
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 什么是(或如何制作)cpp中矢量的默认初始值设定项?
- 如何在QT中制作模态QProgressDialog?
- 如何制作指向模板函数的指针?
- 可视化 如何在 c++ 中制作特定大小的文件?
- 我可以制作指向智能指针的智能指针吗?
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 用GTK创建逻辑门模拟器,如何制作放置区域