C++ Gtk::具有常量字符串的TextView

C++ Gtk::具有常量字符串的TextView,c++,user-interface,gtkmm,gtktextview,C++,User Interface,Gtkmm,Gtktextview,我使用的是Gtkmm 3+,我试图让文本缓冲区具有常量字符串“>”,即使用户试图删除它。此外,当用户按下return时,它将自动再次出现。基本上像终端一样有一个常量字符串 我能想到的实现这一点的唯一方法是连接到delete和backspace信号,这样用户就不能删除字符串。但是,还有更好的办法吗 到目前为止,这是我能想到的唯一方法: //in constructor txt_view_i_.signal_event().connect(sigc::mem_fun(*this, &Main

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

我能想到的实现这一点的唯一方法是连接到delete和backspace信号,这样用户就不能删除字符串。但是,还有更好的办法吗

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

//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;
}
//在构造函数中
txt_view_i_.signal_event().connect(sigc::mem_fun(*this,&MainWindow::inputEvent));
//作用
bool主窗口::inputEvent(GdkEvent*事件)
{
如果((event->key.keyval==GDK_key|u BackSpace | event->key.keyval==GDK_key_Delete)&&buffer_input->get_char_count()<3)
返回true;
返回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);
Gtk::TextBuffer::iterator it=buffer\u input->get\u iter\u at_line(1);
Glib::RefPtr refAnchor=缓冲区\输入\创建\子\锚定(it);
Gtk::Label*lbl=Gtk::manage(新的Gtk::Label(“>”);
txt_view_i_。在锚定点添加子锚定点(*lbl,refAnchor);

这与我回答的问题非常相似,但并不完全相同:您可以创建一个
GtkTextTag
,使其内容不可编辑,并从缓冲区的开始应用它,直到
“>”
提示符

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


链接答案中的链接显示了一些C代码,其中包括提示。它不是Gtkmm或C++,但它应该作为一个例证。

< P>这里是我用来解决它的代码:

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);
Glib::RefPtr tag=Gtk::TextBuffer::tag::create(); tag->property_editable()=false; Glib::RefPtr tag_table=Gtk::TextBuffer::TagTable::create(); 标签\表格->添加(标签); 缓冲区输入=Gtk::TextBuffer::创建(标记表); 设置缓冲区(缓冲区输入); 滚动_win_i_.add(txt_view_i_); Gtk::TextBuffer::迭代器缓冲区\u it=缓冲区\u输入->开始(); 缓冲区输入->插入带有标签的缓冲区(缓冲区“>”,标签); 我是这样做的,用户无法在常量字符串之前进行编辑:

//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);
}
//连接到标记集信号
buffer_input_uu->signal_mark_set().connect(sigc::mem_fun(*this,&mainfown::setMark));
//使方框不可编辑
void main window::setMark(const Gtk::TextBuffer::iterator&it,const Glib::RefPtr&mark)
{
if(it.get_offset()<2)
txt\查看\设置\可编辑(假);
其他的
txt\查看\设置\可编辑(真);
}
希望有人会觉得这很有用