Pull to refresh

Comments 20

Не перестаю узнавать все новые и новые грани использования Qt :)
Вообще насколько я понял D-Bus это не только и не столько Qt, сколько отдельный механизм межпроцессного взаимодействия.
Поэтому собственно
Пытаться понять логику работы с DBus по доке Qt — дело неблагодарное.

Была бы полезна отдельная статья чисто по D-Bus, без привязки к языку.
Да, D-bus отдельная тема. Статье по ней написать можно, но если честно, я сомневаюсь в своих способностях сказать лучше, чем сделали это в вики D-bus--а(ссылка в статье есть) + туториал тамже.
кто-то может обьяснить обстоятельство с «Бонус-левелом»? можно пробовать предположить, что `pong` удаляется по выходу из области видимости, но ведь рано ему удаляться(выход будет только по завершению приложения).
Точно не в этом. Можно сделать что в подобном духе:
Pong * pong = new Pong();
    if( ! QDBusConnection::sessionBus().registerObject("/", pong)){

Но вылет всеравно будет.
я понимаю, что это глупо, но что будет, если
Pong * pong = new Pong(new QObject);
?
я думаю, тут не шаманство, а наше полное непонимание концепции Qt.
вот тут почитай, как все устроено. довольно просто описано. 15 минут: голова в норме

когда почитаешь, поймешь, что родительский объект обязателен. хотя да, товарищи могли сделать более изящно и создать его сами, если он — nullptr. вообще говоря, стоит перечитать пример, с которого ты списал свой. ты далеко не все списал и далеко не все понял, из того, что там было написано. я вот только начал читать и многие вещи становятся очевидными.
Эээ, ссылки нет.
Дело в том, что сам QAbstractDbusAdaptor — наследник QObjetc предполагать, что для нужен родитель очень странно. Тем более, если взять вариант, наследующийся напрямую от Qobject, объявить его итерфейсом, то все заработает и не будет вылетов.
Угу, понял, почитаю чуть позже, может пойму чего они хотели добиться.
И да, мне до чертиков любопытно знать, что ты понял и вызнал.
ну, как минимум, сразу бросается в глаза:
explicit QAbstractButton(QWidget* parent=0); // это выбрал из рандомного файла. помню этот концепт наизусть.
QDBusAbstractAdaptor(QObject *parent);

казалось бы, не такая уж и странная вещь, но у Qt-шников довольно тсрогий стиль. и если в первом случае мы видим, что наличие дефолтного параметра как-бы намекает, что родитель вполне себе может отсутствовать, то во втором — родитель строго нужен.
то, что указатель может быть nullptr — минус конструкции языка и недоработка, собственно программистов.
лень им было ассерт поставить и выбросить логическую ошибку при nullptr?
свой создавать, по факту, плохо: им пришлось бы думать, как после него память освободить. хотя есть, конечно, обходные пути, типа создания совсем уж корневого статического объекта.

именно это отличие заставило меня начать вчитываться в пример. что я там вычитал, могу рассказать завтра. если нужно, в личку(сегодня поезд, потому чтение я отложил пока).
М-да, подстава. Привык что родитель это необязательный элемент, а где не так — так сразу и не припомню. Да, надо будет исходники почитать.

Ну можно и не в личку. Чистого пути.
Прошу прощения сразу за 2 вещи:
— как-то затянулась моя интеграция в среду после приезда и я забыл отписаться сюда
— понимание примеров было все-таки полным (чего все-таки не скажешь про документацию. о ней как раз будет идти речь)

как я уже написал ранее, на мысль меня натолкнуло отсутствие знаения аргумента по-умолчанию. и это оказалось вполне обоснованным. читая документацию, буквально в первом-же абзаце я наткнулся на следующую мысль:

The QDBusAbstractAdaptor class is the starting point for all objects intending to provide interfaces to the external world using D-Bus. This is accomplished by ATTACHING a one or more classes derived from QDBusAbstractAdaptor TO A NORMAL QObject AND THEN REGISTERING THAT QObject with QDBusConnection::registerObject. QDBusAbstractAdaptor objects are intended to be light-weight wrappers, mostly just relaying calls into the real object (its parent) and the signals from it.

собственно, заглавными буквами я обозначил нужную мысль, которая была упущена тобой.
вот еще несколько мыслей об использовании наследников QDbusAbstractAdaptor:
— (могу ошибаться в переводе) нельзя создать больше одного экземпляра одного класса
— каждый экземпляр должен создаваться с помощью оператора new
— ни один экземпляр не должен быть удален пользователем. они удалятся автоматически при удалении родительского обьекта

остальное буду читать как-нибудь позже, когда будет больше свободного времени.
сразу прошу прощения за отсутствие разметки и/или наличие опечаток в тексте.
Если заметить, что родительский элемент обязателен, то последнее два очевидно — родитель сам удалит своего потомка. Первый пункт тоже очевиден — иначе возникнет траблы при подключении к D-Bus, ибо только один интерфейс может быть расположен по тому же пути. Сейчас разбираюсь в коде, похоже это тупо патерн Адаптер для связки Qt-мира и D-bus-мира
не согласен насчет очевидности удаления: с точки зрения логики(да и в коде Qt есть на это намеки, хотя я сильно не вникал), если ты удаляешь обьект, он автоматически вытирает запись о себе в родительском обьекте и удаляет всех своих потомков(порядок может быть обратным).
первый же пункт становится очевидным лишь после понимания того, что система использует Q_CLASSINFO для идентификации обьекта.
Да, действительно, но это уже некий изврат(в данном случае), ИМХО.
Насчет Q_CLASSINFO: а разве это не очевидно?
исключительно после прочтения доки…
Sign up to leave a comment.

Articles