【发布时间】:2016-07-29 03:10:19
【问题描述】:
我只是在 GtkTextView 中以“draw”信号绘制特定内容,
在下一次发射信号时,我在 GtkTextView 中绘制不同的东西。
在下一次信号调用中,如果没有要绘制的内容,则清除之前的所有绘制,这很好。
但是当它要绘制新内容时,它会一次绘制所有以前的内容,而不仅仅是需要的内容。这不好。
我尝试了很多方法来防止这种行为,cairo_save() 和 cairo_restore() 的所有可能组合似乎都没有这样做。
我怎样才能让它不一次画所有以前的画,而只画新的?
【问题讨论】:
-
你为什么要搞乱 GtkTextView 的绘制信号?我不确定 GTK 是否支持。无论如何,你如何导致重绘?你打电话给developer.gnome.org/gtk3/stable/… 之类的东西吗?
-
这是我可以编辑小部件自己的 cairo_t 的唯一方法。我连接信号并在处理程序内部进行条件检查。它的行为很奇怪,我无法理解。完全看不懂它的模式。它第一次不会绘制任何内容,必须多次发出信号才能绘制内容。 queue draw 有细微的差别,但我还是使用它。我认为,无论如何都会经常发出信号,主要是因为光标动画。 (闪烁/状态 w/e)
-
@UliSchlachter 我想让它画不同的东西,一次,每次我想要并清除以前的图纸。无论我尝试什么,它已经做了这些事情,但总是有些事情没有。
-
如果你的想法只是画东西,那么考虑一下实际上打算这样使用的小部件,比如
Gtk.DrawingArea。如果您想拥有更大的灵活性并更轻松地移动东西,请查找GooCanvas。如果您考虑制作某种文字处理器,您仍然需要一个类似画布的小部件。Gtk.Overlay,如果您想在现有文本之上绘图,您可能会侥幸逃脱 - 我没有太多经验。 -
@jcoppens 两者都没有,因为使用“draw”信号时,您不会在小部件顶部绘制,而是在小部件本身上绘制。 GTK+3 现在完全用 Cairo 渲染,“draw”信号(以前是一个暴露事件)似乎是改变小部件绘制方式的唯一更高级别的方法。