Мне не хватает чего-то очевидного с полянами gtkbuilder и подключаемых сигналов.Помогите? - PullRequest
2 голосов
/ 04 ноября 2010

Я делаю свой интерфейс с поляной. Работает отлично. Я пишу крошечную основную функцию, которая вызывает gtkbuilder и отображает все в файле glade.

Gtk::Main kit(num, opts);
// Load the GtkBuilder file and instantiate its widgets:
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");

Работает даже лучше. Тогда я получаю свой виджет

Gtk::Button *sf = 0;
builder->get_widget("button", sf);

И что теперь? Каждый пример, который я нашел для подключения обработчика сигналов, не построен gtkbuilder. Если вы создаете экземпляр своего собственного класса для представления / обработки / рендеринга кнопки, к ней легко подключить обработчик сигнала, но я использую gtkbuilder и не вижу, как написать функцию, которую затем можно прикрепить к моему виджету поскольку я не был одним из создателей объекта кнопки, gtkbuilder был.

Я заставлю подкласс gtkbutton написать мою функцию, а затем указать на это? Но мой класс не был создан gtkbuilder.

Я просто не понимаю. Помощь

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Вы не упускаете ничего очевидного. Похоже, что gtkmm не предоставляет C ++ версию функции gtk_builder_connect_signals(), как вы это делаете в C. Я провел небольшой поиск в Google, но не могу понять, почему они его пропустили.

Вы можете напрямую получить доступ к функции C следующим образом:

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");
gtk_builder_connect_signals(builder->gobj(), callback_data);
3 голосов
/ 02 декабря 2010

вы должны использовать свой собственный класс кнопок следующим образом:

#ifndef _MYBUTTON_H_
#define _MYBUTTON_H_

#include <gtkmm.h>
class MyButton : public Gtk::Button { 
  public:
    inline MyButton(BaseObjectType* cobject) : Gtk::Button(cobject) {};
  protected:
    // overwrite virtual void on_pressed() function of Gtk::Button
    void on_pressed() { /* do something */ };
};
#endif

Теперь где-нибудь в вашем основном коде (я поместил его в свой класс Core, который является общедоступным Gtk :: Window):

MyButton *sf;
refBuilder_->get_widget_derived("button", sf);

Я нашел это в официальном руководстве gtkmm несколько месяцев назад и успешно использовал его в своих приложениях с графическим интерфейсом.

Надеюсь, это поможет.

...