Вот скачал galculator, он же на C++ и gtkmm.
Мне не понятно каким образом передается событие когда нажал на объект Gtk::GtkToggleButton (открыл ui).
И как можно составить свою функцию чтоб при нажатии на кнопку или на что-то другое она выполнилась.
И в чем разница между GtkApplicationWindow, GtkWindow и GtkOffscreenWindow?
Каждый из этих элементов может иметь только один дочерний виджет?
Получается все как по «принципу матрешки»?
Т.е. чем дальше мы идем, (и чем больше виджетов), то каждый следующий виджет «вкладывается» в предыдущий?
Короче, народ.
Почитал я документацию, и сварганил вот такого Франкенштейна чисто по приколу (в целях обучения).
Прошу не пинать, так как gtkmm учу только 2ю неделю.
«Есть ли тут специалисты по Gtkmm, которые готовы ввязаться в решение моих проблем, какими бы они не оказались, даже окажется, что к Gtkmm они не имеют никакого отношения, или кто-то другой, не знакомый Gtkmm, но тем не менее способный ответить на мои вопросы?»
Задавая вопрос в виде «а есть тут специалисты по ...?», ты отсекаешь: а) специалистов по предмету, которые просто не хотят заранее обещать решить неизвестную задачу — задача может оказаться объёмной, ведь пообещав, придётся либо выполнять, либо терять лицо; б) неспециалистов по предмету, которые тем не менее могут ответить на вопрос — часто он достаточно общий, и знания конкретной технологии для ответа вовсе не обязательно.
Я одно время тыкал gtkmm. Было желание писать гуй на С++. После того ужаса, что я увидел в примерах по Qt, gtkmm мне показался просто идеальным. Хотя потом я перешел на Vala. Касательно твоего вопроса, GtkApplicationWindow, GtkWindow и GtkOffscreenWindow - это принципиально разные вещи, читай документацию по каждой. Кстати, в gtkmm они пишутся по другому: Gtk::ApplicationWindow, Gtk::Window и Gtk::OffscreenWindow. Для начала тебе хватит Gtk::Window. И да, виджеты вкладываются один в другой по приципу матрёшки. Для того, чтобы вложить в один контейнер несколько дочерних, используются специальные контейнеры Gtk::Box, Gtk::Grid и т.д. Для обработки событий ипользуется библиотека sigc++. С ней работать легко. Проще один раз увидеть. Главное здесь - понять, зачем нужен sigc::bind.
Хм, глянул твоего франкенштейна, вижу, эти основы ты уже усвоил. Сделан он конечно против здравого смысла, не говоря уже о HIG, но в качестве первого блина сойдёт. На будущее: изучай Gtk::Builder. В связке с Glade эта вещь сэкономит тебе много времени и сил.
И вообще, на мой взгляд, изучать Gtk можно на любом языке, а потом эти знания применить в другом. Основные принципы универсальны. Я рекомендую для этого Vala или Python, но Gtkmm - тоже годный выбор, как я уже говорил, сам с него начинал.
1) Ты каждый свой вопрос публично задаёшь в соответствующем тех. разделе. Если кто знает и имеет желание подсказать — подсказывает. При этом ответ становится виден всем, что может помочь тем, у кого возникнет тот же вопрос.
2) Ты в Job ищешь специалиста, который за оплату возьмёт обязательство тебе лично отвечать на твои вопросы и решать твои проблемы.
Вот это первый ответ по существу.
Пока еще не понял как добавлять ui-файл в код.
Эту операцию ведь делает Gtk::Builder, верно?
И еще, мне не совсем понятно разбирать код, когда в нем больше 3х исходников. (т.к. на оф. сайте в начале все программки умещаются в 3 файла).
Пока еще не совсем разобрался с классами.
Я так понял когда создаешь свой класс, то он наследует параметры и поля стандратного класса.
Короче, надо читать документацию, хорошо что хоть она на русском, то на англ. я половину бы не понял.
В отличии от GtkWindow это главное окно приложения, тоесть там какая-то интеграция с главным меню, actions, но я не думаю что его использовать обязательно. Я честно говоря всегда писал через GtkWindow и горя не знал, и меню ставил
О GtkOffscreenWindow впервые слышу. Думаю что стоит начать с простого окна пока не понимаешь зачем более сложное.
Получается все как по «принципу матрешки»?
Твой самый главный друг в Gtk - https://developer.gnome.org/gtk3/stable/GtkBox.html (найдешь сам для Gtkmm). В отличии от Qt, где целый зоопарк в Gtk все строится обычно иерархией Box, к счастью они достаточно гибкие. Это контейнер, который ставит компонеты в ряд или в колонку. Путем вложения одного в другой можно строить что угодно.
Есть одно но, если ты строишь например форму для заполнения данных, то возможно попытаешься построить ее путем засовывания множества горизонтальных Box в один вертикальный. Это не даст выравнивания левого столбца с Label по ширине с друг другом. Для этого есть
Сигналы в Gtkmm обрабатываются через sigc, она намного лучше устроена чем сигналы в Qt, которые без специального препроцессора не работают. Тут все чистый С++
sigc::mem_fun связывает метод HelloWorld::on_button_clicked и this в одну функцию, которую если вызвать, то будет вызван метод.
Еще совет, не пиши UI руками. Есть редактор Glade. Он создаст xml файл, который компонент GtkBuilder сможет превращать в окно. Когда Builder загрузит этот XML файл, то прямо из билдера можно будет доставать компоненты. Например достань само окно и вызови show_all()
Gtkmm наверное самый лучший binding из нативных, намного практичнее и безопаснее чем писать все руками на Gtk на С.
Если нативность не критична, рекомендую Python.
Еще есть отличная возможность писать на JavaScript. В данном случае интерпретатор называется gjs и он сразу умеет загружать любые GLib библиотеки через GObjectIntrospection.
Вот люди показывают как написать простой браузер на Gnome+JS+WebKit
Все функции возвращают указатель на слишком общие структуры, которые необходимо кастить в более конкретные через макросы вроде GTK_WINDOW. В них же и происходит проверка, реально ли это GtkWindow. Есть многие случаи когда это можно забыть.
Еще сложно следить за ref/unref и вызывать их руками.
Новый синтаксис выглядит весьма годно, но мне не удалось быстро нагуглить инфу о том, требует ли он по прежнему препроцессор или нет. Действительно ли в этом отношении все по старому?
есть смысл учится на примерах, не понимая принципов работы?
Как раз наоборот. Когда голая теория без примеров, мне гораздо сложнее понять «прицип действия». А когда есть наглядный пример, то все намного легче. Хотя я согласен. Прежде чем приступать к примерам, нужно почитать теорию.