我正在学习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);
}
答案 0 :(得分:1)
你从
开始Gtk::TextView* textview = 0;
稍后你会这样做:
textview->set_buffer(text);
也许我错过了一些东西但是在任何时候我都没有看到你将textview指向实际的textview对象。 我希望有类似的东西:
refBuilder->get_widget("???", textview );
在初始化期间。
此外,您应该使用nullptr
而不是0.或NULL
假设您不使用c ++ 11