Russian Qt Forum
Ноябрь 23, 2024, 21:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Как преобразовать указатель на QObject в указатель на объект нужного класса?  (Прочитано 57312 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #30 : Октябрь 21, 2008, 16:32 »

Я не понимаю почему ты постоянно используешь объект QApplication в функциях поиска?? Виджеты не являются детьми QApplication, поэто искать виджет по имени через qApp не имеет смысла. Его искать нужно через toplevel виджет, на котором он расположен (если точно не знаешь прямого родителя), или через прямого родителя.
Записан
spirit
Гость
« Ответ #31 : Октябрь 21, 2008, 16:34 »

просто изначально кто-то показал пример с qApp вот и погнал его юзать Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #32 : Октябрь 21, 2008, 17:13 »

Это вопрос сложности синтаксиса языка C/C++, не предназначенного для восприятия простым человеком.

какое вызывает недопонимание функции с константной ссылкой?
что вас смущает?

Понимаете, есть такая вещь - семантика называется. Семантика, говоря кратко - это представление смысла. Любой язык программирования (как система обозначений) через свой синтаксис выражает семантику задачи. И хорошим тоном считается такая запись алгоритма, когда семантика задачи выражена синтаксисом напрямую. Код, написаный по такому принципу, прост для понимания и последующего сопровождения.

Возьмем к пример нашу функцию qPrintable(). Задача этой функции - преобразовать Qt строку QString в стандартную сишную строку. Заметтьте, ни о каких константных указателях речи не идет. Так же как и не идет речи ни о каких адресах объектов для неявного получения ссылки на исходную строку.

Фраза "преобразовать Qt строку QString в стандартную сишную строку", в языке C/C++ с использованием Qt, естественным образом выражается прототипом
Код:
char *qPrintable(QString str)

а если бы в C/C++ изначально бы были типы массивов (как это сделано в паскале), то можно былоб выразить еще понятнее, например
Код:
array of char qPrintable(QString str)

Вот и сравните то, что написано выше, с прототипом вида
Код:
const char * qPrintable ( const QString & str )

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

ЗЫ: Передача QString и других шаровых классов по значению, это дурной тон программирования на Qt

Да это просто щастье, что в Qt есть нормальные строки, а не указатели на байтовые массивы. Теперь осталось, чтобы до разработчиков дошло, что надо программировать не "на языке" а "с использованием языка". Удивительное дело - выразительные средства языка уже позволяют писать программы так, как они представляются в объектах реального мира. Так нет же, всеравно имея такие средства, пишут по старинке, ставя во главу угла опимизацию в ущерб понятности. Можно еще понять, когда дело касается гигабайтных объемов, когда копия данных делается медленно и места мого занимает. Но когда речь идет о текстовых строках, оптимизация работы через указатели со всеми воможными побочными эффектами мне непонятна.

Вон даже у сантехников написано

Цитировать
Побочные эффекты, связанные с использованием указателей - самая большая проблема для компиляторов с языков C/C++. Поэтому, если время исполнения программы для Вас является важным фактором, постарайтесь избегать использования указателей при вычислениях. Индексирование массивов лучше поддается оптимизаци, чем обращение по указателю. Например:

for( int i=0; array; i++ ) foo(array); // рекомендуемый подход

for( T* p=array; *p; p++ ) foo(*p); // старайтесь избегать

http://ru.sun.com/developers/sunstudio/articles/amdopt_ru.html.
« Последнее редактирование: Октябрь 21, 2008, 17:24 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #33 : Октябрь 21, 2008, 17:21 »

Я не понимаю почему ты постоянно используешь объект QApplication в функциях поиска?? Виджеты не являются детьми QApplication, поэто искать виджет по имени через qApp не имеет смысла. Его искать нужно через toplevel виджет, на котором он расположен (если точно не знаешь прямого родителя), или через прямого родителя.

Это в предыдущей теме http://www.prog.org.ru/topic_7830_0.html такой совет дали. Изначально поиск шел от mainwindow. И сейчас я делаю поиск от mainwindow, ибо когда посмотрел дерево от qApp

Цитировать
Object tree
.QGuiEventDispatcherGlib
.NAME plastique, QPlastiqueStyle
.QSessionManager
.QXIMInputContext


понял что ничего нужного это дерево не содержит Улыбающийся.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Rcus
Гость
« Ответ #34 : Октябрь 21, 2008, 17:34 »

Виновен Улыбающийся Только потом понял что приведенный мною пример не работает (виджеты не могут иметь в parent не QWidget*), меня оправдывает только то что для консольных приложений подход с единым предком работает

P.S. А теперь пофлеймим Улыбающийся прототип qPrintable очень информативен на самом деле, "const QString&" означает что функция не изменяет параметр (кстати в Object Pascal/Delphi тоже рекомендуется передавать строки с указанием const чтобы избежать операций со счетчиком ссылок), "const char*" указывает на неизменяемость результата (при возврате по стеку вызовов память выделенная будет освобождена, поскольку результат указывает на внутреннюю структуру временного объекта). Помоему ничего плохого нет в том чтобы показать семантику функции и защитить программиста от ошибок при помощи синтаксиса языка.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #35 : Октябрь 21, 2008, 17:39 »

2 xintrea: про qPrintable написано много, смысла - 0. Вы понимаете разницу между QString str и const QString & str? Перечитайте ещё раз мой предыдцщий пост: в Qt не принято передавать ПО ЗНАЧЕНИЮ данные шаровых типов.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #36 : Октябрь 21, 2008, 17:54 »

начну с того, что в сях вообще нет типа "строка"
я сейчас под впечатлением того длинного поста выше...и цивилизованно выражаться могу лишь сдерживаясь.
предлагаю прекратить этот бредовый флэйм и читать книжки/документацию...читать, читать и снова читать...
в противном случае искать объект по имени будем в /dev/null...
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #37 : Октябрь 21, 2008, 18:24 »

рекурсивно.

Вообще, скачайте исходники Qt. Очень помогает в некоторых ситуациях.

Это уже обсудили выше.

В данный момент интересуют комментарии к

Цитировать
используй findChild() и qobject_cast с шаблоном. имя класса можно получить из метаобъекта

Код:
return static_cast<T>(qt_qFindChild_helper(o, name, reinterpret_cast<T>(0)->staticMetaObject));

Видимо человек знает, как преобразовывать строку с названием типа (именем класса) непосредственно в тип. Если это так, то хочется подробностей.
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #38 : Октябрь 21, 2008, 20:25 »

бля, какое название класса в тип?
Цитировать
T QObject::findChild ( const QString & name = QString() ) const
Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. Omitting the name argument causes all object names to be matched. The search is performed recursively.
If there is more than one child matching the search, the most direct ancestor is returned. If there are several direct ancestors, it is undefined which one will be returned. In that case, findChildren() should be used.
This example returns a child QPushButton of parentWidget named "button1":
         QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
перевести?

тип в данном случае - это Т...и его (тип) мы указываем явно в шаблоне. тяжко посмотреть код qt_qFindChild_helper?
« Последнее редактирование: Октябрь 21, 2008, 20:27 от Константин » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #39 : Октябрь 21, 2008, 21:49 »

какое название класса в тип?

Ну, ведь есть возможность получить из типа строку с названием типа (или класса). Например, это можно сделать через поле name оператора typeid, или через metaObject().className(). Почему бы тогда не иметь возможность обратного действия -  например, подставлять в шаблон тип из строки? Ведь в C++ возможна динамическая типизация.

Понятно, что я размечтался, но хочется иметь инструменты преобразования в обе стороны.


Цитировать
T QObject::findChild ( const QString & name = QString() ) const
Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. Omitting the name argument causes all object names to be matched. The search is performed recursively.
If there is more than one child matching the search, the most direct ancestor is returned. If there are several direct ancestors, it is undefined which one will be returned. In that case, findChildren() should be used.
This example returns a child QPushButton of parentWidget named "button1":
         QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
перевести?

Уже ненадо. Хотя, отправьте пожалусто перевод сюда http://www.crossplatform.ru/documentation/qtdoc4.3/index.php


тип в данном случае - это Т...и его (тип) мы указываем явно в шаблоне. тяжко посмотреть код qt_qFindChild_helper?

Да, тяжко, ибо вы не сказали, что это вообще за функция и где ее брать. Я проверил ее в QtAssistant, такой функции нет. Поэтому подумал, что это функция в какой-то вашей программе, и вы приводите пример вызова. Откуда мне знать, что функция эта оказывается лежит в исходниках Qt в /src/corelib/kernel/qobject.cpp?
« Последнее редактирование: Октябрь 21, 2008, 21:50 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
spirit
Гость
« Ответ #40 : Октябрь 21, 2008, 21:53 »

Цитировать
Откуда мне знать, что функция эта оказывается лежит в исходниках Qt в /src/corelib/kernel/qobject.cpp?

подебажить  Подмигивающий
Записан
ритт
Гость
« Ответ #41 : Октябрь 22, 2008, 01:08 »

grep? поиск венды?

две ветки по изобретению велосипедов и исследованиям примитивов...страница бессмысленнейшего флейма на тему константных указателей...
извиняюсь, но весь этот бред отправляется в "кандидаты". повторяю в стотысячный раз: читать документацию, читать книги по кутэ и плюсам, гуглить и снова читать!

зы. и с таким-то уровнем осведомлённости ещё поносишь разработчиков smb4k? на лоре я предупредил - не удивляйся, если однажды смф тебя не опознает...
« Последнее редактирование: Октябрь 22, 2008, 01:11 от Константин » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #42 : Октябрь 22, 2008, 13:33 »

grep? поиск венды?

две ветки по изобретению велосипедов и исследованиям примитивов...страница бессмысленнейшего флейма на тему константных указателей...
извиняюсь, но весь этот бред отправляется в "кандидаты". повторяю в стотысячный раз: читать документацию, читать книги по кутэ и плюсам, гуглить и снова читать!

В свою очередь порекомендую вам прекращать читать книги по кутэ и плюсам, ибо вы настолько сузили видение языка, что считаете обсуждение "невозможных" с вашей точки зрения или "простых" вещей бредом.

Порекомендую для прочтения следующие книги:

  • Одинцов И.О. Профессиональное программирование. Системный подход. - БХВ-Петербург.
  • Макконнелл С. Совершенный код. - Микрософт пресс.
  • Керниган Б., Пайк Р. Практика программирования. Простота, ясность, общность. - Addison Wesley
  • Бобровский С. Программная инженерия. - СПб. Питер

эти книги так сказать, отрезвляют.

зы. и с таким-то уровнем осведомлённости ещё поносишь разработчиков smb4k? на лоре я предупредил - не удивляйся, если однажды смф тебя не опознает...

Да, я поношу разработчиков smb4k на лоре, ибо мой уровень осведомленности мне это позволяет. Единственное мерило оценки проекта - это работает проект так как нужно (прозрачно для пользователя, без гемора) или нет. Если бы проект действительно так работал, он бы уже давно был неотъемлемой частью KDE, как поддержка ext2/3 в ядре линуха. Пока мы этого не наблюдаем. Значит, не все так гладко и требования юзабельности до сих пор не выполнены, даже такие непритязательные, как и все в линухе. Скажу больше - у меня хоть устанавливай smb4k, хоть деинсталлируй - в kde-шных программах есть возможность обращаться к smb ресурсам. А вот в гимпе, в инкскейпе, в опере, с сетевыми ресурсами не поработаешь. В винде - поработаешь (да-да, в винде в которой нет никакого "системного" уровня, в которой тоже только прозрачное автомонтирование). А в линухе - не поработаешь. Даже при наличие smb4k.
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #43 : Октябрь 22, 2008, 13:48 »

> порекомендую вам прекращать читать ... Порекомендую для прочтения
дык, прекращать читать книги или всё же читать?
если тебе непонятна декларация const char*, прекращай читать про "совершенный код"...

> уже давно был неотъемлемой частью KDE, как поддержка ext2/3 в ядре линуха
угу-угу, сделаем самбу неотъемлемой частью ядра, а гуишку для самбы - неотъемлемой часть КДЕ. понимаешь что говоришь? может ещё вендовый загрузчик сделать основой grub'а или запихнуть вайн в кернел-левел?
в общем, сравниваешь х?й с пальцем.
почему у меня адекватно работает и раб smb://, и самбочка, а у тебя - нет? может мне тоже чего-нибудь почитать? про идеальную настройку лялиха у тебя нет книг?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #44 : Октябрь 22, 2008, 16:25 »

> порекомендую вам прекращать читать ... Порекомендую для прочтения
дык, прекращать читать книги или всё же читать?

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


если тебе непонятна декларация const char*, прекращай читать про "совершенный код"...

Конструкция понятна, да только чтобы ее понять - отвлекаешься от задачи, лезешь в справочник, выясняешь что к чему, пишешь тестовый код чтоб удостовериться, что правильно понял, возвращаешься к задаче. Проблема в том, что конструкция настолько неудобна, что точно и недвусмысленно описать, что при ее использовании происходит, не так то просто. Кстати, давно ищу книжку, в которой бы нормально с точки зрения организации памяти и машинных кодов было написано, что такое указатель, что такое ссылка. В свое время я даже декомпилировал коды примеров чтобы понять, что на самом деле происходит. Давайте, я переборю себя, и загляну в книжку по плюсам. Что видим?


http://i.piccy.kiev.ua/i2/0b/36/744b81b16752baf7139821aa86d8.png

Вы считаете такую путаницу нормальной? Я нет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.173 секунд. Запросов: 23.