- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过继承 DrawingArea Widget 来实现自定义小部件,为此我需要使用 cairo 进行绘制。似乎在 gtk3 中引入了一个名为“draw”的新信号。如何在小部件内部绘制? map 和实现信号是否也应该被覆盖?
一个简单的示例代码会很有帮助。谢谢。
最佳答案
简而言之,您需要覆盖提供开罗上下文的绘制信号:
gboolean
user_function (GtkWidget *widget,
CairoContext *cr,
gpointer user_data)
然后您可以使用 CairoContext cr
绘制小部件的实际内容。
来自 C API:
The GtkDrawingArea widget is used for creating custom user interface elements. It’s essentially a blank widget; you can draw on it. After creating a drawing area, the application may want to connect to:
Mouse and button press signals to respond to input from the user. (Use gtk_widget_add_events() to enable events you wish to receive.)
The “realize” signal to take any necessary actions when the widget is instantiated on a particular display. (Create GDK resources in response to this signal.)
The “size-allocate” signal to take any necessary actions when the widget changes size.
The “draw” signal to handle redrawing the contents of the widget.
当小部件发生变化时,小部件应该对一些绘制进行排队,例如,在分配大小时,您应该使用 gtk_widget_queue_draw
强制小部件再次绘制它自己。
示例 - 使用绘图区域而不是对其进行子类化,但概念仍然存在:(取自Gnome C API)
gboolean
draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
{
guint width, height;
GdkRGBA color;
GtkStyleContext *context;
context = gtk_widget_get_style_context (widget);
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
gtk_render_background (context, cr, 0, 0, width, height);
cairo_arc (cr,
width / 2.0, height / 2.0,
MIN (width, height) / 2.0,
0, 2 * G_PI);
gtk_style_context_get_color (context,
gtk_style_context_get_state (context),
&color);
gdk_cairo_set_source_rgba (cr, &color);
cairo_fill (cr);
return FALSE;
}
[...]
GtkWidget *drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, 100, 100);
g_signal_connect (G_OBJECT (drawing_area), "draw",
G_CALLBACK (draw_callback), NULL);
您还应该在 GtkWidget 中阅读有关高度与宽度的几何管理的信息
我使用 C 是因为在您的问题中没有提到编程语言,同时它是编写所有其他语言的原始 API。
网上有一些关于创建 Gtk+ 自定义 Widget 的例子。
关于gtk - 如何在子类 DrawingArea 小部件中绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132099/
我有一个 GTK+ DrawingArea,它应该在左上角显示一个矩形。当我使用 Cairo 绘制矩形时,整个绘图区域都填充了矩形的颜色。我怎样才能防止这种情况发生?开罗为何这么做?我做错了什么? #
我目前在框架内加载一个 DrawingArea 小部件 - 它总是扩展以填充框架。然后我可以在 DrawingArea 上设置 configure 事件来分配一个与窗口大小相同的像素图,在它上面绘制,
我想通过继承 DrawingArea Widget 来实现自定义小部件,为此我需要使用 cairo 进行绘制。似乎在 gtk3 中引入了一个名为“draw”的新信号。如何在小部件内部绘制? map 和
我想更新 DrawingArea 中的 cairo 绘图。我试图通过使用新函数作为参数调用 DrawingArea::connect_draw(...) 来实现这一点。我的问题是它没有替换原来的绘图函
我正在尝试使用 GTK、Cairo 和 Glade 在 Rust 中构建一个 GUI。我想使用 gtk::DrawingArea 绘制一个运动场,但我不知道如何使用它。我有这个: extern cra
我正在根据找到的基本教程编写一个 PyGtk 绘图程序 here . 有什么方法可以将图像添加到绘图区域,这样您仍然可以在图像上绘图吗?例如邮票或导入的照片。我试过添加 gtk.Image() 但 g
我有以下 Python 2.7/PyGObject 3.0/PyGST 0.10 模块: from gi.repository import Gtk, Gdk, GdkPixbuf import pa
我正在尝试制作简单的正方形,您可以在其中使用鼠标进行绘画。问题是,每当绘制信号发生时,cairo 表面似乎已完全清除。我理解这一点,因为在第一个 queue_draw() 之后,白色背景消失了,我看到
我有一个绘图区,我在里面画了一些图形或图像,所以我有这个回调来截屏: void CanvasToolBox::actionCanvasCamera() { auto root = Gdk::W
我正在使用 gtkmm 和 cairo 开发一款平台游戏,但我找不到将图像设置为背景的方法,因此我不必在每次绘制事件时都重新绘制它。我正在将图像作为 pixbufs 进行管理。这真的可能吗,还是我想错
我想画一些相框,一张一张的Gtk::DrawingArea .在应用开始时,我需要获取DrawingArea的大小, 分配一个 RGB 缓冲区, 但是, DrawingArea::get_width(
我创建了一个 Gtk.grid,其中包含一堆可调整大小并可在网格周围拖动的按钮。 我还创建了一个 Gtk.drawingarea 来绘制网格线。我希望让我的按钮像这样透明: Gtk.Button.se
我想使用 PIL 将 gtk.DrawingArea() 对象内容保存到 jpeg 文件。我特别想添加到 this script制作照片的可能性。我找到了如何save image to jpeg 。我
我有一个使用 Glade 创建的界面。它包含一个 DrawingArea 和按钮。 我尝试创建一个线程,每隔 X 次刷新我的 Canva。几秒钟后,我收到如下错误消息: “X 窗口服务器 0.0”、“
我正在创建一个用于数据可视化的小工具。GUI 是用 Pygtk 创建的,非常简单。用户输入文件名后,可以按“calc”按钮查看输出。输出由 pycairo 渲染并呈现在 gtk.DrawingArea
先上GTKmm documentation example在 more complex clock example 上,他们正在继承 public Gtk::DrawingArea 来构建他们的应用程
我在 CEF Python 3 ( link ) 上得到这段代码 ... self.container = gtk.DrawingArea() self.container.s
我在 Ubuntu 12.04 LTS 32 位上使用带有 GNU 工具链和 gtkmm3 的 C++11。我一直在玩 Programming with gtkmm 3 中 gtkmm3 的一些示例。
我有一个使用 Cairo image surface 的小型 PyGI 项目,然后我用 surface pattern 缩放它并在 Gtk.DrawingArea 上渲染。 我想将缩放 版本写入 PN
我正在使用“gtkmm”制作一个 GUI 程序。我想在“Gtk::DrawingArea”小部件上绘制一些图形,但我希望该小部件“可调整大小”,所以当我绘制时,让我们说一条从“(0, 0)”到“(50
我是一名优秀的程序员,十分优秀!