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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Как преобразовать указатель на QObject в указатель на объект нужного класса?  (Прочитано 57273 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

Мда, если вместо
Код:
 QApplication app( argc, argv );
 mainwindow win;
 mainwindowpointer=&win;

Сделать
Код:
 QApplication app( argc, argv );
 mainwindow win;
 mainwindowpointer=&app;

или, что тоже самое, сделать mainwindowpointer=qApp;, то дерево объектов (которое строится начиная с указателя mainwindowpointer) будет вот такое

Код:
Object tree
.QGuiEventDispatcherGlib
.NAME plastique, QPlastiqueStyle
.QSessionManager
.QXIMInputContext


то есть относительно объекта app (или qApp) невозможно найти editnumericlist. Возможно, это и есть ответ на вопрос. НО! Почему тогда работает код

Код:
 // Поиск объекта editor от корня, проходит нормально
 editor *edt;
 edt=qFindChild<editor *>(qApp,"editor");
 edt->set_text_to_textarea("Main text"); // Вызов метода найденного объекта, проходит нормально

?

Ведь в поддереве объекта qApp, как мы выяснили (в распечатке Object tree выше), нет объекта editor!
Записан

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

Сообщений: 754



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

Хорошо, давайте отвлечемся Улыбающийся

еще одно, не по теме, что это за мегафункция
Цитировать
char* fromQStringToChar( const QString& str )

можно ж вот эту заюзать и велосипед не изобретать
Код:
const char * qPrintable ( const QString & str ) 

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

Код:
char *qPrintable(QString str)

то я бы не задумываясь стал использовать эту функцию.


или же через оператор << выводить в дебаг, т.е. так
Код:
qDebug() << "bla-bla-bla: " << 1 << 1.2;

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

Если вы предпочитаете последний способ, то вы очевидно знаете его особенности.

1. Если выводится строка QString, то она будет заключена в кавычки.
2. На месте оператора "<<" обязательно появляется пробел.

Например
Код:
QString name="Vasya";
qDebug() << "Name is " << name;
выведет
Код:
Name is  "Vasya"

(обратите внимание на два пробела в результате)

Таким образом, в выводимой строке получаем неубираемые кавычки, а из-за обязательного пробел на месте оператора "<<" вы не можете вывести строку, в которой что-то будет написано слитно.
Записан

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

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

Code:
char *qPrintable(QString str)

то я бы не задумываясь стал использовать эту функцию.
не понял ход мысли. какое вызывает недопонимание функции с константной ссылкой?
Записан
ритт
Гость
« Ответ #18 : Октябрь 20, 2008, 23:47 »

мдя...
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

Код:
Object tree
.QGuiEventDispatcherGlib
.NAME plastique, QPlastiqueStyle
.QSessionManager
.QXIMInputContext

то есть относительно объекта app (или qApp) невозможно найти editnumericlist. Возможно, это и есть ответ на вопрос. НО! Почему тогда работает код

Код:
 // Поиск объекта editor от корня, проходит нормально
 editor *edt;
 edt=qFindChild<editor *>(qApp,"editor");
 edt->set_text_to_textarea("Main text"); // Вызов метода найденного объекта, проходит нормально

?

Ведь в поддереве объекта qApp, как мы выяснили (в распечатке Object tree выше), нет объекта editor!

Таки никто не знает? Я уж думаю, может дерево объектов не все обрабатывается при распечатке, может там всетаки есть еще объекты? Но проверить не могу из-за неработоспособности dumpObjectInfo() и dumpObjectTree(). У кого эти методы работают, может хотя бы показать дерево от объекта win и от объекта app?
Записан

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

эта конструкция возвращает 0
Код:
editor *edt;
edt=qFindChild<editor *>(qApp,"editor");
edt->set_text_to_textarea("Main text")
для проверки выведите в дебаг переменную или же QPointer заюзайте.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

эта конструкция возвращает 0
Код:
editor *edt;
edt=qFindChild<editor *>(qApp,"editor");
edt->set_text_to_textarea("Main text");
для проверки выведите в дебаг переменную или же QPointer заюзайте.

Удивительно! Конструкция

Код:
edt=qFindChild<editor *>(qApp,"editor")

действительно присваивает адрес 0 указателю edt. Но при этом нормально работает вызов метода

Код:
edt->set_text_to_textarea("Main text");

так как в консоли появляется строка

Код:
In editor method set_text_to_textarea() set text  "Main text"

Как же это так происходит???
Записан

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

гы, крута, вот такая хрень пашет и не падает
Код:
editor *edt = 0;
edt->set_text_to_textarea("Main text");
Смеющийся

че-от, где-то я не замечаю  Непонимающий
« Последнее редактирование: Октябрь 21, 2008, 10:50 от spirit » Записан
Tonal
Гость
« Ответ #23 : Октябрь 21, 2008, 11:15 »

Удивительно! Конструкция
Код:
edt=qFindChild<editor *>(qApp,"editor")
действительно присваивает адрес 0 указателю edt. Но при этом нормально работает вызов метода
Код:
edt->set_text_to_textarea("Main text");
Как же это так происходит???
И что тут удивительного? Это UB - значит можно произойти всё что угодно. Улыбающийся
А если объяснять на пальцах - метод это обычная функция, с дополнительным скрытым аргументам, в котором передаётся this. Если этот аргумент не используется, то всё равно что там передаётся. Улыбающийся
Вот если бы метод был виртуальным, то ты бы сразу получил AV. Улыбающийся
Записан
spirit
Гость
« Ответ #24 : Октябрь 21, 2008, 11:18 »

да уж точно. в методе инфы о классе нет, вот он и срабатывает как статическая функция.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

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

Код:
char *qPrintable(QString str)

то я бы не задумываясь стал использовать эту функцию.

А что вас смущает?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

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

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

А можно подробнее про этот ребус? Что из чего преобразуется?

Желательно, кусочек кода с реализацией функции qt_qFindChild_helper() и функции, в которой используется этот хитрый return (и как ее вызывать).

Особенно интересует третий параметр функции qt_qFindChild_helper(), что это за переменная такая? Какой у нее будет тип? Для чего она нужна? Это переменная-пустышка, через которую только передается тип искомого объекта, который будет подставлен при вызове qFindChild()?

Вы пишите "имя класса можно получить из метаобъекта". Что нам это даст? При поиске через FindChild()/qFindChild() в любом случае нужно заранее знать тип искомого объекта, т.е. просто найти объект по имени не получится (если не пользоваться самодельной функцией поиска). Кроме того, неясно что нам может дать строка с именем класса. Всеравно мы ведь не можем воспользоваться значением полученной строки в шаблоне.
« Последнее редактирование: Октябрь 21, 2008, 18:06 от xintrea » Записан

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

а если в шаблоне задавать QWidget и имя объекта, а не конкретный типя. хотя затем все равно нужно делать приведение к необходимому типу, так что тип в шаблон нужно задавать реальный.
« Последнее редактирование: Октябрь 21, 2008, 16:17 от spirit » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

Код:
    // создаём виджет и три кнопки на нём
    W *w = new W;

    // находит и выводит "QPushButton(0x80904b0, name = "B3")"
    qDebug() << qFindChild<QPushButton *>(w, "B3");
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

findChild() ищет рекурсивно, или только объекты, являющиеся children для обрабатываемого объекта ( в вашем случае qApp) ?

рекурсивно.

Вообще, скачайте исходники Qt. Очень помогает в некоторых ситуациях.
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


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