Задать вопрос
@jenya92

Почему glade не загружается в мой класс?

Ребят, прошу больно не бить, учу плюсы и столкнулся с такой бедой. Создаю окно с разметкой из glade файла таким образом:
#include <gtkmm.h>
#include <iostream>
#include "./win.cpp"

int main (int argc, char *argv[]){
  auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
  auto refBuilder = Gtk::Builder::create();
  Gtk::Window* TestWin;
  //MainWindow* TestWin;

  try{
      refBuilder->add_from_file("./test.glade");
  }
  catch(const Glib::FileError& ex){
      std::cerr << "!! FileError: " << ex.what() << std::endl;
  }
  catch(const Glib::MarkupError& ex){
      std::cerr << "!! MarkupError: " << ex.what() << std::endl;
  }
  catch(const Gtk::BuilderError& ex){
      std::cerr << "!! BuilderError: " << ex.what() << std::endl;
  }

  refBuilder->get_widget("window_id", TestWin);
  if(TestWin)
    return app->run(*TestWin);

  else{
    std::cout << "Ошибка загрузки виджета." << std::endl;
    return 1;
  }
}


И как не странно, оно код компилируется и даже работает, без проблем загружает разметку и выдаёт нужное окно.
Проблема появляется, когда я пытаюсь наследовать свой класс и уже ему передать файл разметки. Сам класс пока что практически ничем не отличается, создан исключительно в учебных целях:
class MainWindow : public Gtk::Window{
public:
    virtual ~MainWindow(){
        std::cout << "Окно закрыто." << std::endl;
    }

protected:
    void on_button_clicked(){ //Обработчик сигналов от кнопки
        std::cout << "Hello World" << std::endl;
    }
};


И теперь если в функции main() закоментировать строку "Gtk::Window* TestWin;" и раскоментировать "MainWindow* TestWin;", в попытке создать окно из своего класса, то компилятор выдаёт следующее:
** (program:22060): CRITICAL **: 18:50:50.811: Gtk::Builder::get_widget(): dynamic_cast<> failed.
Ошибка загрузки виджета.

Искренне пытался гуглить, но что то совсем никак не получается понять, что ему от меня надо...
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@jenya92 Автор вопроса
На случай, если кто то столкнётся стакой проблемой, я долго читал официальные мануалы и смог понять в чём косяк. Конструктор необходимо наследовать тоже. Примерно вот так:
MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) : Gtk::Window(cobject);

После этого всё завелось! :)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы