Проблема с GtkTextBuffer, Непонятная ошибка во время выполнения.Нужна помощь? - PullRequest
0 голосов
/ 22 сентября 2011

Я использую этот код:

class editbook
{
  GtkWidget* _nbook;
  std::vector<GtkWidget*> _srcset; //and so on...

...........................................................................................

void editbook::add_page()
{
    GtkWidget* tmp = gtk_source_view_new();
    _srcset.push_back(tmp);
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled"));
}

...........................................................................................

void editbook::set_text(const std::string& text)
{
    int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook));
    GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1);
}

Компилируется нормально.Но выдает эту странную ошибку времени выполнения:

Ошибка сегментации: возвращаем 139

Я проследил проблему до: gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));

ПРИМЕЧАНИЕ. Я использую GtkSourceView вместо GtkTextView, но это не может быть проблемой, потому что я получаю ту же ошибку, когда я пытаюсь GtkTextView.

ПРИМЕЧАНИЕ. Я использую Gtk 2x

ПРИМЕЧАНИЕ. Я не уверен, стоит ли отмечать этот вопрос на C или C ++.клюв.Gtk + является C lib.Но я использую C ++.Так что я просто покажу оба.

1 Ответ

1 голос
/ 23 сентября 2011

Проблема в вашем коде может заключаться в том, что дочерний виджет, добавленный к GtkNotebook через gtk_notebook_append_page, не видимый , попробуйте показать дочерний виджет с помощью вызова gtk_widget_show. Что-то в этих строках:

void editbook::add_page()
{
    GtkWidget* tmp = gtk_source_view_new();
    _srcset.push_back(tmp);
    gtk_widget_show(tmp); //Show the child widget to make it visible
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled"));
}

Когда вы используете gtk_notebook_get_current_page, если ни один из дочерних виджетов не виден, тогда он возвращает -1, что, я думаю, может иметь место в вашем случае, а index равно -1, когда вы используете operator[], который Не проверяйте границы программы, вылетает. Я настоятельно рекомендую вам использовать vector::at вместо operator[], чтобы вы получили исключение std::out_of_range во время выполнения, чтобы указать на проблему. Вы можете использовать:

void editbook::set_text(const std::string& text)
{
    int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook));
    GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset.at(index)));
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1);
}

Надеюсь, это поможет!

...