代码之家  ›  专栏  ›  技术社区  ›  Bahaa Zahika

c++Gtkmm TextBuffer和TextView分段错误

  •  1
  • Bahaa Zahika  · 技术社区  · 11 年前

    我正在学习c++和Gtk+GUI,我完全是新手,找不到好的教程,我遇到过这个问题,所以我会在这里写一个问题。

    当我单击更新按钮时,我会收到以下错误:

    分段故障

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


    我做错什么了吗?

    #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);
    }
    

    enter image description here

    1 回复  |  直到 11 年前
        1
  •  1
  •   odedsh    11 年前

    你从开始

    Gtk::TextView* textview = 0;
    

    稍后您会:

    textview->set_buffer(text);
    

    也许我错过了什么,但我没有看到你将文本视图指向实际的文本视图对象。 我希望得到以下内容:

     refBuilder->get_widget("???", textview );
    

    在初始化期间。

    此外,您还应使用 nullptr 而不是0。或 NULL 假设您不使用c++11