【问题标题】:GtkWidget draw event fired mutliple timesGtkWidget 绘制事件多次触发
【发布时间】:2014-01-16 03:51:03
【问题描述】:

我一直在摸索为什么下面的代码会触发绘制回调三次而不是一次。

#include <iostream>
#include <gtk/gtk.h>

using namespace std;

void on_draw(){
    cout << "drawing"<<endl;
}

int main( int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *drgArea;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  drgArea = gtk_drawing_area_new();
//  gtk_widget_set_redraw_on_allocate(drgArea, -1);
  gtk_container_add(GTK_CONTAINER(window), drgArea);
  gtk_widget_show_all(window);
  g_signal_connect(drgArea, "expose-event",
            G_CALLBACK(on_draw), NULL);
  gtk_main();

  return 0;
}

【问题讨论】:

  • 我猜是gtk+-2.xx?在询问与具有较长版本历史且主要版本之间存在重大差异的库相关的问题时,您应该始终添加这一点。
  • 我的电脑中有另一个 gtk+-3xx,当我切换代码使用它时,回调计数跳到 4!
  • 在 gtk3 中您应该使用“draw”信号,如果您对此还有其他问题,请打开另一个问题。
  • 不,我只是尝试了它,因为您对版本号持怀疑态度,所以我尝试了另一个,肯定是我使用了“draw”信号。

标签: c events gtk gtk2 drawingarea


【解决方案1】:

这可能与您的合成器/窗口管理器有关。

使用 cinnamon [2.0.14] 在启动应用程序时显示 2 重绘(无论我使用 gtk3/3.10.6/"draw" 还是 gtk2/2.24.22/"expose-event")。

【讨论】:

  • 我是这样想的,也许像“realize”和“map”这样的事件被路由为正常的暴露事件,但是当我在 on_draw() 函数中添加 getchar() 或 sleep(1) 时,回调数量减少到只有一个!
  • 这可以在不同版本的 ubuntu 上正常工作,有什么办法可以防止我的开发机器上出现多个事件队列,谢谢
  • 您是否尝试过使用老式 2D 非合成窗口管理器 - 我对肮脏的细节不太熟悉。
  • 我想,我需要研究什么是“非合成窗口管理器”,非常感谢
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多