TextView内のカーソルの位置(何行、何文字目)を取得する
概要
TextBuffer内の文字は Gtk::TextBuffer::iterator オブジェクトによって表されるので、カーソル位置を 得るにはカーソル位置のiteratorを取得する必要がある。ただしカーソル位置はiteratorではなくて Gtk::TextBuffer::Markオブジェクトで与えられているので、Gtk::TextBuffer::Mark::get_iter() によってカーソル位置の iteratorを取得する。具体的には次のようにする。Gtk::TextView m_textview;
m_textview.get_buffer()->get_insert()->get_iter();
あとは Gtk::TextBuffer::iterator::get_line()とGtk::TextBuffer::iterator::get_line_offset() で カーソルの位置を取得できる。ここでget_line_offset()はバイトではなくてユニコード文字として カウントされるのに注意する。つまり日本語の文字の場合は3文字ではなくて1文字でカウントされる。 またget_line()とget_line_offset()は0から始まることに注意する。
ソース
textview2.cpp
#include <gtkmm.h>
#include <iostream>
class MainWin : public Gtk::Window
{
Gtk::TextView m_textview;
public:
MainWin();
virtual ~MainWin();
private:
void on_buf_changed();
};
MainWin::MainWin()
{
// バッファ更新シグナル
m_textview.get_buffer()->signal_changed().connect( sigc::mem_fun( *this, &MainWin::on_buf_changed ) );
add( m_textview );
show_all_children();
resize( 600,600 );
}
MainWin::~MainWin()
{}
void MainWin::on_buf_changed()
{
std::cout << "---------------------\n" << m_textview.get_buffer()->get_text() << std::endl
<< "何行目 = " << m_textview.get_buffer()->get_insert()->get_iter().get_line() << std::endl
<< "何文字目 = " << m_textview.get_buffer()->get_insert()->get_iter().get_line_offset() << std::endl;
}
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ textview2.cpp -o textview2 `pkg-config gtkmm-2.4 --cflags --libs`