LINUX.ORG.RU

[GTK#] сигнал keypress у Gtk.TextView


0

1

Изломал голову со следующим вопросом:
Мне нужно обрабатывать кое-какие действия при изменении текста в TextView, но я не могу найти сигнал, к которому бы я мог привязать функцию.. а если обрабатывать KeyPress, то он обрабатывается только в том случае если не нажаты символы вводимые в поле т.е. это ctrl alt f1-f12 и тому подобные, а мне нужно и буквы тоже обрабатывать. Кто знает как это сделать?

Ответ на: комментарий от Deleted

using System;
using Gtk;
using NotepadGtk;

public partial class MainWindow : Gtk.Window
{
   public MainWindow () : base(Gtk.WindowType.Toplevel)
   {
      Build ();
   }

   protected void OnDeleteEvent (object sender, DeleteEventArgs a)
   {
      Application.Quit ();
      a.RetVal = true;
   }
   protected virtual void OnCloseActionActivated (object sender, System.EventArgs e)
   {
      Application.Quit();
   }
   
   protected virtual void OnLoadActionActivated (object sender, System.EventArgs e)
   {
      FileChooserDialog od = new FileChooserDialog(«Open File»,
             null, FileChooserAction.Open,
               Stock.Cancel, ResponseType.Cancel,
              Stock.Open, ResponseType.Accept);
      if ((ResponseType) od.Run() != ResponseType.Accept) {
      Console.WriteLine («Hello»);
   } else {
      Console.WriteLine («World»);
   }
return;
   }
   
   protected virtual void OnTextview1MoveCursor (object o, Gtk.MoveCursorArgs args)
   {
      
   }
   
   protected virtual void OnAboutActionActivated (object sender, System.EventArgs e)
   {
      About ab = new About();
      ab.ShowAll();
   }
   
   protected virtual void OnTextview1KeyPressEvent (object o, Gtk.KeyPressEventArgs args)
   {
      label1.Text = textview1.Buffer.CharCount.ToString();//вот это не пашет если печатать, но если нажать функциональную клавишу то работает
   }
}

я так понимаю дело в том что виджет перехватывает управление если нажата буква, и не отдает его моему слоту OnTextview1KeyPressEvent. В Qt для этого можно настроить eventFilter, а здесь как быть? Только начинаю юзать Gtk#


pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Событие вешается на буфер, а не на сам textview, например «insert-text» если произошла вставка текста или «changed» если произошли изменения :)

xterro ★★★★★
()
Ответ на: комментарий от xterro

спасибо сейчас проверю.. честно даже представить не мог, что можна обработать евенты буфера =)

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

вообще-то, надо смотреть на прототипы сигналов. у key-press-event возвращаемое значение - boolean, показывающее, необходима ли дальнейшая обработка события или ее надо завершить

ananas ★★★★★
()
Ответ на: комментарий от ananas

Это так в Qt, а здесь EventHandler добавляется. А вообще было бы неплохо если бы было как в Qt eventFilter, уж больно привык я к этой технологии =)

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

что там в qt не знаю, и знать не хочу. а здесь - http://library.gnome.org/devel/gtk/2.90/GtkWidget.html#GtkWidget-key-press-event

а у тебя возвращаемое значение void, и что там на стеке лежать будет - никому не известно, потому и косяки с обработкой

ananas ★★★★★
()
Ответ на: комментарий от xterro

Событие вешается на буфер, а не на сам textview

Не надо вводить ТС в заблуждение. key-press замечательно перехватывается у textview. По крайней мере на pygtk.

baverman ★★★
()
Ответ на: комментарий от xterro

Мне нужно обрабатывать кое-какие действия при изменении текста в TextView

кое-какие действия

Естественно, все зависит от этих гипотетических действий. Неплохо было б их озвучить.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.