Виджеты GTK не появляются при их добавлении вне main (Какое-то странное поведение Gtk)

Модератор: Модераторы разделов

Аватара пользователя
joebraker
Сообщения: 98
ОС: OpenSuse 10.3

Виджеты GTK не появляются при их добавлении вне main

Сообщение joebraker »

Проблема такая:
имеется простая gtk прога, использующая glade. Понадобилось уже в самой программе добавить виджет (напр. кнопка) в уже существующий Viewport (в glade-файле). Все отлично, пока это происходит в теле функции main. Как только я пытаюсь сделать это в другой функции function виджет не добавляется. В чем тут дело: я что-то не понимаю или это просто баг?

Прикрепленный файл - архив - содержит glade-файл, исходники maincorrect.cpp (работает, но без функции), mainincorrect.cpp (с функцией, но не работает), compilecorrect, compileincorrect - скрипты для компилирования вышеуказанных исходников и correct, incorrect - откомпилированные бинарники.

Мои личные данные :):
ос - 2.6.23-gentoo-r8
компилятор gcc-4.1.2
gtkmm-1.2
libglademm-2.4
glade-3.4.5

Листинг неработающей программы:

Код:

#include <libglademm/xml.h> #include <gtkmm.h> #include <iostream> using namespace std; Gtk::Window* function(void); int main (int argc, char **argv) { Gtk::Main kit(argc, argv); Gtk::Window* pWindow = function(); /* Glib::RefPtr<Gnome::Glade::Xml> refXml; #ifdef GLIBMM_EXCEPTIONS_ENABLED try { refXml = Gnome::Glade::Xml::create("main.glade"); } catch(const Gnome::Glade::XmlError& ex) { std::cerr << ex.what() << std::endl; } #else std::auto_ptr<Gnome::Glade::XmlError> error; refXml = Gnome::Glade::Xml::create("main.glade", "", "", error); if(error.get()) { std::cerr << error->what() << std::endl; } #endif Gtk::Window* pWindow; refXml->get_widget("main_window", pWindow ); Gtk::Viewport* pViewport1 = 0; refXml->get_widget("viewport1", pViewport1); Gtk::Button but("butt"); pViewport1 -> add(but); but.show(); */ kit.run(*pWindow); return 0; } Gtk::Window* function(void) { Glib::RefPtr<Gnome::Glade::Xml> refXml; #ifdef GLIBMM_EXCEPTIONS_ENABLED try { refXml = Gnome::Glade::Xml::create("main.glade"); } catch(const Gnome::Glade::XmlError& ex) { std::cerr << ex.what() << std::endl; } #else std::auto_ptr<Gnome::Glade::XmlError> error; refXml = Gnome::Glade::Xml::create("main.glade", "", "", error); if(error.get()) { std::cerr << error->what() << std::endl; } #endif Gtk::Window* pWindow; refXml->get_widget("main_window", pWindow ); Gtk::Viewport* pViewport1 = 0; refXml->get_widget("viewport1", pViewport1); Gtk::Button but("butt"); pViewport1 -> add(but); but.show(); return pWindow; }
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Виджеты GTK не появляются при их добавлении вне main

Сообщение d_n_k »

возможно баг связан с уничтожением переменной refXml, или где-то не увеличивается счетчик ссылок.

зы: проверить никак не могу
все сказанное есть имхо...
Спасибо сказали:
andy128k
Сообщения: 28
ОС: GNU/Linux

Re: Виджеты GTK не появляются при их добавлении вне main

Сообщение andy128k »

Кнопка добавляется и удаляется когда завершается function.

Код: Выделить всё

Gtk::Button* but = Gtk::manage(new Gtk::Button("butt"));
pViewport1 -> add(*but);
but->show();


Нашёл тут http://www.gtkmm.org/docs/gtkmm-2.4/docs/t...managed-widgets
Спасибо сказали:
Аватара пользователя
joebraker
Сообщения: 98
ОС: OpenSuse 10.3

Re: Виджеты GTK не появляются при их добавлении вне main

Сообщение joebraker »

Супер!
Спасибо огромное!
Да, так бы я не догадался, конечно. А я уж было засомневался в качестве библиотеки.
Спасибо сказали: