Я создаю свое первое приложение с графическим интерфейсом на C ++, используя gtkmm и Glade.
Мне пришлось объединить различные учебники, потому что ни один из найденных мной не поддерживает Glade в сочетании с Gtk :: Application и различными классами.
Смотрите код ниже:
main.cpp
int main(int argc, char **argv)
{
std::cout << "Start" << std::endl;
auto app = Gtk::Application::create(argc,argv,"org.gtkmm.ex");
auto builder = Gtk::Builder::create();
builder->add_from_file("gui02.glade");
HelloWorld* helloworld;
std::cout << "helloworld compl." << std::endl;
app->run(*helloworld);return 0;
}
helloworld.hpp
#include <gtkmm.h>
class HelloWorld : public Gtk::Window
{
protected:
Glib::RefPtr<Gtk::Builder> builder;
Gtk::Button *btn1;
Gtk::Label *lb1;
public:
HelloWorld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
protected:
void on_button1_clicked();
};
helloworld.cpp
#include "helloworld.hpp"
using namespace std;
using namespace Gtk;
HelloWorld::HelloWorld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
Gtk::Window(cobject), builder(refGlade)
{
builder->get_widget("label1", lb1);
builder->get_widget("button1", btn1);
btn1->signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button1_clicked));
}
void HelloWorld::on_button1_clicked()
{
lb1->set_text("HW!");
}
Компиляция с использованием:
g++ main.cpp helloworld.cpp -o main `pkg-config gtkmm-3.0 --cflags --libs`
Результат в командной строке:
Начните
привет мир
Ошибка сегментации (ядро сброшено)
Отладка с помощью gdb (соответствующая выдержка, при необходимости вы получите полный вывод)
Glib :: RefPtr :: operator-> (this = 0x7fffffffdd10) по адресу /usr/include/glibmm-2.4/glibmm/refptr.h:260
260 return pCppObject_;Поток 1 «основной» получил сигнал SIGSEGV, ошибка сегментации.
0x00007ffff7a4799e в Gtk :: Widget :: signal_hide () () из /usr/lib/x86_64-linux-gnu/libgtkmm-3.0.so.1
Поскольку я довольно новичок в C ++ (имею некоторый опыт работы с C #), я не очень привык к указателям. Где ошибка в этом случае?
Использование другого кода, где я создаю Window * и использую «app-> run (* window)», работает довольно хорошо, поэтому ошибка возникает где-то в новом app-> run () и аутсорсинге в классе «HelloWorld».
Ваш код вылетает здесь app->run(*helloworld);
Вы пытаетесь разыменовать пустой указатель. Этот указатель не указывает на объект в памяти.
Сделай это так:
HelloWorld* helloworld = new HelloWorld();
std::cout << "helloworld compl." << std::endl;
app->run(*helloworld);
Других решений пока нет …