LINUX.ORG.RU

Подскажите аналоги Qt signal/slot


0

0

Поясню
	lineEdit = new QLineEdit;
	QObject *object1 = lineEdit;
	QObject *object2 = this;
	connect(object1, SIGNAL(editingFinished()), object2, SLOT(sendEcho()));

Это участок работающего кода. Понятно, что у класса QObject нет ни сигнала editingFinished(),
ни слота sendEcho(), более того, выходит, что при помощи механизма signal/slot
можно НА ЭТАПЕ ИСПОЛНЕНИЯ оперировать любыми методами неизвестного класса,
без необходимости применения какого-либо специального интерфейса.
Единственное требование - чтобы сходились сигнатуры :).

Внимание, вопрос: существуют ли аналогичные механизмы, т.е. позволяющие оперировать методами не зная их сигнатур?

void foo(int, ...);

anonymous
()

Бррр, для signal-slot ты обязан знать сигнатуры. А так в том же gobject есть аналогичный механизм.

krum
()
Ответ на: комментарий от krum

>Бррр, для signal-slot ты обязан знать сигнатуры

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

V_L_A_D ★★
()

>Внимание, вопрос: существуют ли аналогичные механизмы, т.е. позволяющие оперировать методами не зная их сигнатур?

Насколько я знаю, нет, поскольку язык C++ такое не поддерживает:). В Qt подобная функциональность достигается путем использования препроцессора moc.

V_L_A_D ★★
()
Ответ на: комментарий от V_L_A_D

необходимо знать сигнатуры, aka reflection information,
aka RTTI (RunTimeTypeInformation). В чистом C++ этого (пока) нет,
хотя в "C++ committee" работа над этим ведется. Во многих "надстройках"
над C++ это есть. Яркие примеры этого:
- MS COM, идея эта родилась именно в оффтопике, и гараздо раньше,
чем в Qt.
- ROOT, например,
http://root.cern.ch/root/HowtoSignalSlot.html
- и прочие ...

Один из возможных вариантов реализации (чисто теоретический)
как-то попытаться использовать debug inforamation,
ведь GDB это делает!! Если у кого есть ссылки на нечто подобное
как с GDB - дайте знать, пожалуйста.

Valeriy_Onuchin ★★
()
Ответ на: комментарий от Valeriy_Onuchin

ROOT - это же интерпретатор диалекта C++ :) Так что не считается.

krum
()
Ответ на: комментарий от ero-sennin

Поправьте если не прав, но ведь в Boost.Signals сигнал объявляется с помощью шаблонов
boost::signal<void ()> sig;
sig.connect(hello);
Отсюда требуется знания типа на этапе компиляции.

philip
() автор топика
Ответ на: комментарий от philip

И, похоже, та же ботва в libsigc++:
    sigc::signal<void> signal_detected;
    mydetector.signal_detected.connect( sigc::ptr_fun(warn_people) );
А вот ROOT - другое дело :)
    a->Connect("SetValue(Int_t)", "A", b, "SetValue(Int_t)");

philip
() автор топика
Ответ на: комментарий от philip

как автор сего поделия (signal-slots in ROOT) пошел дальше Qt
1. никакой модифиkации C++ (signal: slot: in class declaration).
Для меня до сих пор не понятно зачем они это сделали,
ведь это можно было через C++ коментарии.
2. слотом может быть любой метод любого класса ..
и даже глобальная функция.
3. сигналом также может быть любой метод класса "inherited from
TQObject" (некий аналог QObject) или содержащий RQ_Objbect macro
in class declaration и имеющий внутри вызов Emit. Похоже на Qt,
но позволяет "превращать" методы в сигналы в derived class.
4. слот может вызываться с default аргументом установленным
во время Connection.
На пример:
button->Connect("Pressed()", "TGButton", togglebtn, "Toggle(=1)")
5. все работает, как в compiled code, так и в интерпретаторе.
6. есть вообще экзотическая фича, я называю это "class connection",
которая позволяет соединить некий сигнал для всех
обьектов некоего класса к какому-нибудь слоту.
Примения разнообразные: "exception handler",
"run time method overloading" ..

7. все остальное, почти как в Qt ...
правда посмотрел в Qt4 code ... многое там поменялось


Valeriy_Onuchin ★★
()
Ответ на: комментарий от philip

> Отсюда требуется знания типа на этапе компиляции.

Виноват, невнимательно прочитал пост. Связывание на этапе исполнения видел только в Qt. А чем QtCore не устраивает?

ero-sennin ★★
()

Изойте Objective-C, там можно вызывать в любое время любой метод у любого обьекта (если метод не реализован будет эксепшн), или проверять реализованность метода/группы методов имея только void* (именуемый "id") указательно на обьект. При этом это компилируемый язык :)

fmjs
()
Ответ на: комментарий от ero-sennin

> Изойте Objective-C
Тогда уж можно сразу java

> А чем QtCore не устраивает?
QtCore меня полностью устраивает, но отсутствие альтернатив настораживало :).
Теперь есть выбор хотя бы из Qt и ROOT.

philip
() автор топика
Ответ на: комментарий от krum

> Ну так ROOT - это НЕ C++
Ну так и у Qt есть moc-компилер

philip
() автор топика
Ответ на: комментарий от fmjs

Почитал на Wikipedia про Objective-C, достаточно интересный язык. Вот только не понятно, почему он не стал таким распрастранённым, как C++? По возможностям и близости к ООП ObjC значительно обгоняет C++.

krum
()
Ответ на: комментарий от krum

Кстати, в Qt Signal-Slot работает почти так же, как и посылка сообщений в ObjC.

krum
()
Ответ на: комментарий от krum

> Вот только не понятно, почему он не стал таким распрастранённым, как C++?

Видимо по тому, что в Windows уже был общепринят C++. Objective-C между тем является стандартом, при написании GUI софта на OS X. Можно конечно использовать и C++ (через Carbon), и С, и Java если хочется, однако большая часть софта пишется на Objective-C. С ростом популярности OS X, будет расти и популярность ObjC :)

fmjs
()
Ответ на: комментарий от fmjs

Только если вдруг Windows и MacOSX внезапно поменяются местами, в плане распространённости. А так - будет расти популярность кроссплатформенных средств разработки.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> Только если вдруг Windows и MacOSX внезапно поменяются местами, в плане распространённости. А так - будет расти популярность кроссплатформенных средств разработки.

Стоит отметить, что в общем случае, софт, написанные с использованием кросплатформенных средств разработки, на маке смотрится просто отвратно, ввиду того, что маковский интерфейс это не только другие по форме/цвету кнопочки, это и другой стиль расположения компонентов, количества различных контролов там и тут, и то, как должна прога делать то или это, т.е. как это должно выглядеть. Эппловский документ "гуй гайдлайнс" охватывает очень много аспектов, имеет большое количество рекомендаций, "как рисовать гуй, что-бы он на маке смотрелся родным".

Когда вы пишете что-то с использованием той-же QT например, вы очевидно не сможете сделать софт таким, что-бы он был и маковским и виндовым и линуховым по стилю.

Следовательно, остается один выход -- корку пишем общюю, интерфейс у каждого свой. В итоже получаем возврат к истокам - Objective C :)

P.S. А "неродной по внешнему виду" софт на маке пользуется "блюэээ" реакцией у пользователей, и если им не навязали его использование административно, пользоваться им мало кто будет.

fmjs
()
Ответ на: комментарий от fmjs

Кста, недавно пытался поставить Mac OS X на свою тачку, в итоге какое-то железо криво поддерживалось и выводился kernel panic, так даже он красиво выглядел, уже не говоря об инсталляторе.

krum
()
Ответ на: комментарий от Valeriy_Onuchin

Ну "Hello World" весит столько же, сколько и на чистом C. Вопрос возникает при использование runtime библиотеки.

krum
()
Ответ на: комментарий от krum

да и другие проги весят мало, то есть программа с использованием классов весит 23к. Там runtime в виде shared библиотек.
ldd shared_obj/class
libgnustep-base.so.1.13 => /usr/lib/GNUstep/System/Library/Libraries/libgnustep-base.so.1.13 (0x00002ae950079000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00002ae9506e4000)
libobjc.so.1 => /usr/lib/libobjc.so.1 (0x00002ae9508ff000)
libm.so.6 => /lib/libm.so.6 (0x00002ae950b1c000)
libc.so.6 => /lib/libc.so.6 (0x00002ae950d9f000)
libxslt.so.1 => /usr/lib/libxslt.so.1 (0x00002ae9510f0000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00002ae951327000)
libcallback.so.0 => /usr/lib/libcallback.so.0 (0x00002ae951669000)
libavcall.so.0 => /usr/lib/libavcall.so.0 (0x00002ae95186b000)
libdl.so.2 => /lib/libdl.so.2 (0x00002ae951a6c000)
libz.so.1 => /usr/lib/libz.so.1 (0x00002ae951c71000)
/lib64/ld-linux-x86-64.so.2 (0x00002ae94fe5c000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00002ae951e87000)

В общем, пока очень нравится:) Ищу подвохи;)

krum
()
Ответ на: комментарий от krum

struct timeval tv1,tv2;
    gettimeofday(&tv1,NULL);

    for(i=0;i<10000000;++i){

            [frac setNumerator: 1];
        }
    gettimeofday(&tv2,NULL);
    printf("%ld msec ",1000*(tv2.tv_sec -tv1.tv_sec) + (tv2.tv_usec -
 tv1.tv_usec)/1000);
 
выдаёт 288 msec на Athlon X2 3800+. В принципе неплохо.

krum
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.