Russian Qt Forum

Qt => Вопросы новичков => Тема начата: RoulanD от Апрель 27, 2011, 13:56



Название: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 13:56
В общем так. У меня есть QString str="setGeometry(0,0,100,100)"; ну или любая другая функция, как мне её реализовать. Как это действие правильно называется я не знаю, отсюда и название темы. То есть, проще говоря, как команду записанную в строке выполнить в нужном месте.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: GreatSnake от Апрель 27, 2011, 14:00
Мде...
Во-первых, форум не тот.
Во-вторых, внимательно и несколько раз прочитай то, что сам написал. И делай выводы.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 15:24
Прочитал несколько раз, тем не менее вопрос остался.
во 1 - прошу не писать посты типа: "внимательно прочитай" или "не проще просто реализовать функцию" и т.п.
во 2 - предупреждайте в личку или на мыло о переносе темы, это адресовано тому кто переносит и веб разрабам.

GreatSnake
а вы лучше бы стёрли своё во 2-х =)
если смысл вопросы не ясен то не пишите.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: GreatSnake от Апрель 27, 2011, 15:28
Ну сам подумай - сам не знаешь как это называется, нормально объяснить что тебе нужно не можешь и начинаешь обижаться.
Хочешь получать нормальные ответы - ставь нормальные вопросы.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 15:31
Название форума освобождает меня от незнание этого действия.
А вопрос вполне правильно написан.
Разжую: У нас есть строковая запись какой либо функции, нужно её реализовать в нужном месте. Хм тоже самое получилось. Как объяснить проще я не знаю.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Fat-Zer от Апрель 27, 2011, 15:44
что вы спрашиваете действительно очень туманно... если вы спрашиваете, как распарсить строку и вызвать соответствующую функцию? то, дык, только ручками...

или хотя бы на псевдокоди напишите, что вам надо...


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Archa4 от Апрель 27, 2011, 15:48
К сожадению помочь не могу, но может удасться другим получше объяснить (если я все правильно понял).

Допустим есть QString str с содержанием типа "setGeometri(0,0,100,100)".
Как эту строчку подать в программный код, чтобы компилятор её выполнил?
Пример:
QWidget *widget;
widget->setGeometry(0, 0, 100, 100); НО вместо setGeometry(0, 0, 100, 100) подать строчку из QString...


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 15:49
Абсолютно верно.
http://www.prog.org.ru/topic_17653_0.html
По моему в этой теме обсуждали что то похожее, но всё очень туманно, нужно конкретнее.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Fat-Zer от Апрель 27, 2011, 16:00
Тогда средствами с++ такого не добится. К объектам, унаследованным от QObject по их именам - возможно добраться, но к методу по строке - только распарсить.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 16:05
хм... А вы посмотрели тему, линк на которую я дал?


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Fat-Zer от Апрель 27, 2011, 16:09
хм... А вы посмотрели тему, линк на которую я дал?
там как раз вопрос о поиске объекта по имени

ЗЫ: внимательно прочитайте какую-нибудь книжку по C++


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 16:16
ЗЫ: внимательно прочитайте какую-нибудь книжку по C++
Не люблю я такие вещи =) сюда без базового знания С++ не приходят.
А по теме: в Qt просто обязан быть такой класс который предусматривал бы вызов методов по их строковому представлению.
Ладно... Если ещё пару знающих людей напишут что это невозможно то буду искать другие пути =)


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: GreatSnake от Апрель 27, 2011, 16:17
Цитировать
А по теме: в Qt просто обязан быть такой класс который предусматривал бы вызов методов по их строковому представлению.
И кто мешал про это сразу сказать? А то - "как команду записанную в строке выполнить в нужном месте."  ???

См. QMetaObject::invokeMethod(). Но оный работает только с сигналами и слотами.
т.е. setGeometry(0, 0, 100, 100) вызывать не получится, т.к. оный не слот.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Igors от Апрель 27, 2011, 16:26
То есть, проще говоря, как команду записанную в строке выполнить в нужном месте.
Это называется "интепретировать". В некоторых языках это делается просто (т.к. они сами "интерпретаторы"), но в C/С++ нет. Может в Qt есть специальные средства, о которых мне тоже было бы интересно узнать. Во всяком случае удовольствие будет дорогое, так что если нужно сделать просто несколько/немного таких вызовов, то лучше обойтись указателями на ф-ции.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Denjs от Апрель 27, 2011, 16:28
С++ - это компилируемый язык а не интерпретируемый.
Вы не сможете испольнить для объекта функцию из строки, если сами не научите класс эту строку разбирать.

Если брать Qt - то у него есть система метаданных, и вы сможете дергнуть invokeMethod() но он как сказали ранее - работает только с сигналами и слотами.

ещё вы можете погрузить объект типа QWidget в скриптовую среду QtScript (а это уже интерпретируемый язык), и сгенерировать текст скрипта который попытается сделать "setGeometry(0, 0, 100, 100)" - но там тоже - только сигналы и слоты. Либо специальным образом описанная паблик функция.


В общем понимайте разницу между "компиляторами" и"интерпретаторами".
_____________________
Igors, ну как ты мог мою реплику украсть на минуту раньше?!  ??? ;D


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Igors от Апрель 27, 2011, 16:36
Igors, ну как ты мог мою реплику украсть на минуту раньше?!  ??? ;D
Так получилось :) Вспомнилось - давно это было, еще на двойках. Приходит к нам паренек и говорит: "а у меня есть компилято Бейсика!". Как так - вроде не должно, ну покажи. Оказалось "компилятор" там просто сливает интерпретатор (вместе с текстом) в exe файл, а запуск сводится к раскрутке и запуску того же интерпретатора. Ну Васек  :)


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 27, 2011, 17:42
Спасибо за ответ.
Плохо конечно что можно использовать только слоты.
Буду искать альтернативы. Спасибо ещё раз.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Denjs от Апрель 28, 2011, 00:29
Спасибо за ответ.
Плохо конечно что можно использовать только слоты.
Буду искать альтернативы. Спасибо ещё раз.
вы не понимаете. ХОРОШО что можно использовать хотя бы слоты  ;D


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: RoulanD от Апрель 29, 2011, 09:14
я понимаю =) Но просто я думал у них будет какой-нибуть класс который сопоставлял бы строковым представлениям функций сами функции.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Fat-Zer от Апрель 29, 2011, 09:19
я понимаю =) Но просто я думал у них будет какой-нибуть класс который сопоставлял бы строковым представлениям функций сами функции.
а вот это как раз средствами с++ и не возможно сделать...


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: GreatSnake от Апрель 29, 2011, 09:22
я понимаю =) Но просто я думал у них будет какой-нибуть класс который сопоставлял бы строковым представлениям функций сами функции.
QMetaObject этим и занимается. Просто, чтобы связать функции со "строковым представлениям функций" нужно соответствующие методы "обернуть" в SIGNAL/SLOT. А уже moc-compiler добавит нужный код. В компилируемом языке иначе никак.


Название: Re: Незнаю как правильно озаглавить тему
Отправлено: Igors от Апрель 29, 2011, 10:17
а вот это как раз средствами с++ и не возможно сделать...
Ну почему "невозможно". В конце концов, интерпретаторы написаны на том же С/C++. Просто это совсем не то что "есть под рукой и надо использовать"