带有常量字符串的Gtk :: TextView

时间:2013-12-04 01:51:52

标签: c++ user-interface gtkmm gtktextview

我正在使用Gtkmm 3+而我正在尝试做的是让文本缓冲区具有常量字符串“>”,即使用户试图删除它也是如此。此外,当用户按下返回时,它将自动再次出现。基本上像终端一样有一个常量字符串。

我能想到的唯一方法是连接到删除和退格信号,这样用户就无法删除字符串。但是,有更好的方法吗?

到目前为止,这是我能想到的唯一方法:

//in constructor
txt_view_i_.signal_event().connect(sigc::mem_fun(*this, &MainWindow::inputEvent));

//function
bool MainWindow::inputEvent(GdkEvent* event)
{
    if((event->key.keyval == GDK_KEY_BackSpace || event->key.keyval == GDK_KEY_Delete) && buffer_input_->get_char_count() < 3)
        return true;

    return false;
}

但是不能很好地工作,因为如果你键入超过3个字符然后转到行的开头你可以删除常量字符串。

我想到的另一种方法是在TextView小部件中添加标签。我做到了,但用户仍然可以删除它。这是代码:

Gtk::TextBuffer::iterator it = buffer_input_->get_iter_at_line(1);
Glib::RefPtr<Gtk::TextChildAnchor> refAnchor = buffer_input_->create_child_anchor(it);
Gtk::Label* lbl = Gtk::manage(new Gtk::Label("> "));
txt_view_i_.add_child_at_anchor(*lbl, refAnchor);

2 个答案:

答案 0 :(得分:1)

这与我回答here的问题非常相似,但不完全相同:您可以创建一个GtkTextTag,使其内容无法编辑,并将其从缓冲区的开头应用到并包括"> "提示。

然后当您收到输入时,将输出附加到缓冲区,然后在下一行附加一个新提示,并重新应用该标记以使整个事物不可编辑。

链接答案中的链接显示了完成此操作的一些C代码,甚至包括提示。它不是Gtkmm或C ++,但它应该作为一个例子。

答案 1 :(得分:0)

以下是我用来解决它的代码:

Glib::RefPtr<Gtk::TextBuffer::Tag> tag = Gtk::TextBuffer::Tag::create();
tag->property_editable() = false;
Glib::RefPtr<Gtk::TextBuffer::TagTable> tag_table =  Gtk::TextBuffer::TagTable::create();
tag_table->add(tag);
buffer_input_ = Gtk::TextBuffer::create(tag_table);
txt_view_i_.set_buffer(buffer_input_);
scroll_win_i_.add(txt_view_i_);

Gtk::TextBuffer::iterator buffer_it_ = buffer_input_->begin();
buffer_input_->insert_with_tag(buffer_it_, "> ", tag);

以下是我如何制作它以便用户无法在常量字符串之前进行编辑:

//connect to the mark set signal
buffer_input_->signal_mark_set().connect(sigc::mem_fun(*this, &MainWindow::setMark));

//make the box uneditable
void MainWindow::setMark(const Gtk::TextBuffer::iterator& it, const Glib::RefPtr<Gtk::TextBuffer::Mark>& mark)
{
    if(it.get_offset() < 2)
        txt_view_i_.set_editable(false);
    else
        txt_view_i_.set_editable(true);
}

希望有人会觉得这很有用。