Я скучаю с чем-то очевидным с Glade GtkBuilder и соединительными сигналами. Помощь?
-
29-09-2019 - |
Вопрос
Я делаю свой интерфейс с поляной. Работает отлично. Я пишу крошечную маленькую основную функцию, которая называет 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.
Я просто не понимаю. Помощь?
Решение
Вы не пропустите что-то очевидное. Похоже, что 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);
Другие советы
Вы должны использовать свой собственный класс кнопок:
#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
Теперь где-то в вашем главном коде (я положил его в мой основной класс, который имеет публику от GTK :: Окна):
MyButton *sf;
refBuilder_->get_widget_derived("button", sf);
Я нашел это в официальном GTKMM руководство Несколько месяц назад и успешно используя его в моих приложениях GUI.
Надеюсь, это поможет.