0

CでGTK+エディターを使用しています。テキストビューにカーソル位置の現在の行番号と列番号を表示する機能を追加しました。そのうまく機能しています。ただし、矢印キーを使用してカーソルを移動しようとすると、行番号と列番号が更新されないという欠点があります。以下は、行番号と列番号を更新するための私のコードです

    update_statusbar(GtkTextBuffer *buffer,GtkStatusbar  *statusbar)
{
  gchar *msg;
  gint row, col;
  GtkTextIter iter;

  gtk_statusbar_pop(statusbar, 0); 
  g_print("c");
  gtk_text_buffer_get_iter_at_mark(buffer,
      &iter, gtk_text_buffer_get_insert(buffer));

  row = gtk_text_iter_get_line(&iter);
  col = gtk_text_iter_get_line_offset(&iter);

  msg = g_strdup_printf("Col %d Ln %d", col+1, row+1);

  gtk_statusbar_push(statusbar, 0, msg);

  g_free(msg);
}

int main ( int argc, char *argv[])
{
.
.
.
.
.
.
  g_signal_connect(buffer, "changed", G_CALLBACK(update_statusbar), statusbar);
  update_statusbar(buffer, GTK_STATUSBAR (statusbar));

}

問題は「変更された」信号にあると思います。カーソルは矢印キーで移動するため、バッファは変更されません。だから誰かが私に問題を解決するためのより良い方法を提案できますか?

前もって感謝します :)。

4

3 に答える 3

4

TextBufferの「cursor-position」プロパティには、挿入マーク(別名カーソル)のバッファオフセットがあります。このプロパティの変更に対応するシグナルは「notify::cursor-position」という名前で、gobjectで定義されている通知シグナルです。

于 2012-11-23T03:30:19.410 に答える
0

ここにテキストバッファ信号のリストがあり、ここに一般的なウィジェット信号のリストがあります

後者のリンクには、key-release-eventおそらく興味深いと思われるシグナルがあります。

于 2012-11-22T19:42:12.763 に答える
0

これはおそらくこの仕事をするための最良の方法です。GtKTextViewのmove_cursorシグナルは、キーを押すとうまく機能しますが。マウスクリックによるカーソル位置の変更には反応しません。GtKTextViewの通知信号はマウスクリックで機能しますが、バッファの挿入位置を更新しようとしているときにスレッドの競合が発生します。したがって、最良の方法は、シグナル「notify::cursor-position」をGtKTextViewの背後にあるバッファーに直接関連付けることです。シグナルをGtKTextViewに関連付ける必要はありません。

于 2014-10-23T16:52:14.397 に答える