c++;Gtkmm TextBuffer和TextView分段故障 我正在学习C++和GTK+GUI,我完全是新手,我找不到好的教程,我已经面对这个问题了,所以我会在这里写一个问题。

c++;Gtkmm TextBuffer和TextView分段故障 我正在学习C++和GTK+GUI,我完全是新手,我找不到好的教程,我已经面对这个问题了,所以我会在这里写一个问题。,c++,gtk,gtkmm,C++,Gtk,Gtkmm,单击“更新”按钮时,出现以下错误: 分段故障 下面的图片解释了我的问题 我做错什么了吗 #include <iostream> #include <gtkmm-3.0/gtkmm.h> using namespace std; Gtk::Window* window = 0; Gtk::TextView* textview = 0; Glib::RefPtr<Gtk::TextBuffer> text; static void quit(); stati

单击“更新”按钮时,出现以下错误:

分段故障

下面的图片解释了我的问题


我做错什么了吗

#include <iostream>
#include <gtkmm-3.0/gtkmm.h>

using namespace std;

Gtk::Window* window = 0;
Gtk::TextView* textview = 0;
Glib::RefPtr<Gtk::TextBuffer> text;
static void quit();
static void update();

int main(int argc, char *argv[])
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

    //Load the GtkBuilder file and instantiate its widgets:
    Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
    try {
        refBuilder->add_from_file("window.glade");
    }

    catch(const Glib::FileError& ex) {
        std::cerr << "FileError: " << ex.what() << std::endl;
        return 1;
    }

    catch(const Glib::MarkupError& ex) {
        std::cerr << "MarkupError: " << ex.what() << std::endl;
        return 1;
    }

    catch(const Gtk::BuilderError& ex) {
        std::cerr << "BuilderError: " << ex.what() << std::endl;
        return 1;
    }

    //Get the GtkBuilder-instantiated Window:
    refBuilder->get_widget("window1", window);

    if(window) {

        window->set_title("GUI");
        window->set_size_request(600, 400);
        window->set_resizable(false);

        text = Gtk::TextBuffer::create();
        text->set_text("123");

        Gtk::Button* uButton = 0;
        refBuilder->get_widget("button2", uButton);
        if(uButton) {
            uButton->signal_clicked().connect(sigc::ptr_fun(update));
        }

        Gtk::Button* qButton = 0; // Quit button

        refBuilder->get_widget("button1", qButton);
        if(qButton) {
            qButton->signal_clicked().connect(sigc::ptr_fun(quit));
        }

        app->run(*window);
    }

    delete window;

    return 0;
}

static void quit() {
  if(window) window->hide(); //hide() will cause main::run() to end.
}

static void update() {
    textview->set_buffer(text);
}
#包括
#包括
使用名称空间std;
Gtk::Window*Window=0;
Gtk::TextView*TextView=0;
Glib::RefPtr文本;
静态void quit();
静态无效更新();
int main(int argc,char*argv[])
{
Glib::RefPtr app=Gtk::Application::create(argc,argv,“org.gtkmm.example”);
//加载GtkBuilder文件并实例化其小部件:
Glib::RefPtr refBuilder=Gtk::Builder::create();
试一试{
refBuilder->从_文件(“window.glade”)添加_;
}
catch(const Glib::FileError&ex){
std::cerr signal_clicked().connect(sigc::ptr_fun(quit));
}
应用程序->运行(*窗口);
}
删除窗口;
返回0;
}
静态void quit(){
if(window)window->hide();//hide()将导致main::run()结束。
}
静态无效更新(){
文本视图->设置缓冲区(文本);
}

你从

Gtk::TextView* textview = 0;
稍后你会:

textview->set_buffer(text);
也许我遗漏了什么,但我没有看到你将textview指向一个实际的textview对象。 我希望有这样的情况:

 refBuilder->get_widget("???", textview );
在初始化期间


您还应该使用
nullptr
而不是0。或者
NULL
假设您不使用c++11

谢谢您,先生,我的错误是我忘记了“refBuilder->get_widget(“?”,textview);”我使用了零,因为在本例中他们使用了零