Название: Динамически определить тип объекта? Отправлено: alex_beginner от Января 14, 2012, 20:35 Есть функция, принимающая, ну, скажем, QWidget.
Как внутри функции определить, Widget какого типа я в неё передал? Ну т.е. как бы например в object Pascal я написал бы: .................................... if (Widget is QLineEdit) then //Определение типа (Widget as QLineEdit).Делать_то_то() //Преобразование типа.вызов() else if (Widget is QDateEdit) then (Widget as QDateEdit).Делать_что_то_другое(); ..................................... А что здесь писать? Есть тут такое? Название: Re: Динамически определить тип объекта? Отправлено: mutineer от Января 14, 2012, 20:58 Можно сделать Widget.metaObject().className()
Но это фиговое проектирование, так делать не стоит Название: Re: Динамически определить тип объекта? Отправлено: popper от Января 14, 2012, 21:16 qobject_cast
Название: Re: Динамически определить тип объекта? Отправлено: alex_beginner от Января 14, 2012, 21:17 Хорошо - научите, как стоит делать.
Задача такая: я хочу сохранить значения кучи виджетов, а потом их восстановить. Но не хочу для каждой формы делать это линейно, на 2 страницы исходников. Вместо этого я хочу написать функцию, которая бы в цикле (пока ещё не решил, в каком) обойдёт все виджеты, и нужные мне (тоже пока не решил, как определить нужные. Динамическое свойство? В Delphi я использовал свойство контрола Tag) . Но дело в том, что где-то придётся делать setText(), где-то setDate() и т.д. Как мне грамотно написать такую функцию средствами QT? Название: Re: Динамически определить тип объекта? Отправлено: stima от Января 14, 2012, 23:19 Зачем определять тип виджета?, определи тип значения:
Код: pseudo code т.е. сохраняй не просто в кучу, а в определенном структурированном порядке, а потом, просто пройдя по сохраненному выбери нужное и пошли нужному виджету. Название: Re: Динамически определить тип объекта? Отправлено: kambala от Января 14, 2012, 23:49 никогда сам так не делал и не знаю будет ли работать, но попробуй вот как. задай каждому виджету, который ты хочешь сохранить, 2 динамических свойства: чтение значения и запись значения. например:
Код потом в коде сохранения для каждого виджета будешь вызывать Код а при чтении: Код
Название: Re: Динамически определить тип объекта? Отправлено: andrew.k от Января 15, 2012, 00:32 никогда сам так не делал и не знаю будет ли работать, но попробуй вот как. задай каждому виджету, который ты хочешь сохранить, 2 динамических свойства: чтение значения и запись значения. например: Так чтобы задать эти динамические свойства нужно будет написать код, которого собственно ТС хочет избежать.Код
И получается шило на мыло. Чего плохого в таком коде? Код
Аналогично с восстановлением. Правда надо как-то понимать куда восстанавливать данные. Наверное это не очень технологчино (сохранять данные из формы и в нее загружать), но раз человеку надо. Название: Re: Динамически определить тип объекта? Отправлено: mutineer от Января 15, 2012, 01:11 проверка по имени класса тут даже лишняя - можно просто делать qobject_cast. В случае несовпадения типов он вернет нулевой указатель
Название: Re: Динамически определить тип объекта? Отправлено: kambala от Января 15, 2012, 01:16 Чего плохого в таком коде? та же куча ифов, которой ТС хочет избежать :) плюс там могут использоваться свои виджеты, о которых заранее (в момент компиляции) нельзя знать.ну и конечно же никто не сравнивает const char * с помощью == ;) Название: Re: Динамически определить тип объекта? Отправлено: Igors от Января 15, 2012, 01:16 Частенько находятся "неприятные исключения" который разрушают стройный общий механизм :)
Напр QLineEdit может отображать 2-3 знака после запятой, а само значение хранится с большей точностью. Также непонятно - а откуда в UI взялись значения? И что, нет никакой реакции на (единичный) пользовательский ввод, данные не запоминаются в текущих структурах? А если запоминаются то надо и сохранять те структуры, а не UI Название: Re: Динамически определить тип объекта? Отправлено: andrew.k от Января 15, 2012, 01:19 Чего плохого в таком коде? та же куча ифов, которой ТС хочет избежать :) плюс там могут использоваться свои виджеты, о которых заранее (в момент компиляции) нельзя знать.ну и конечно же никто не сравнивает const char * с помощью == ;) Считай, что это опечатка.QString("QLineEdit") ясное дело. Название: Re: Динамически определить тип объекта? Отправлено: alex_beginner от Января 15, 2012, 02:26 Не знаю, хорошо ли, плохо ли - но нафигачил вот такое, и оно работает:
Код: void SaveSettings(QWidget * widget, QString organization,QString application, const char * AddPropName) Код: SaveSettings(this,organization,application,"Save"); Ну а функция восстановления аналогична. Если добавятся новые виджеты - ну, допишу функцию (скопирую блочок if и подправлю). Всё равно она только в одном месте, и только один раз (а из форм вызывается). Название: Re: Динамически определить тип объекта? Отправлено: stima от Января 15, 2012, 03:49 Я лично не вьеду. Зачем так сложно?)
Код: pseudo code п.с. Ну оочень растроило: Цитировать ну, допишу функцию (скопирую блочок if и подправлю) . Это кхм... а если у вас станет 100 обьектов в одном виджеет и 1 в другом, 99 лишних проверок. 99 непонятных строчек кода. Или вам придеться портировать класс, но про функцию вы забудете. Или прийдет другой программист, и вообще не вьедет зачем она(ведь грубо говоря у вас перебор n виджетов ибо вы еще if подобавляете).п.с.с. Я вообще не вьеду зачем урезать класс до QWidget, это типо в прикол показать, что знаеш, что такое findChildren?? и qobject_cast? Название: Re: Динамически определить тип объекта? Отправлено: fuCtor от Января 15, 2012, 11:31 А если вариант не привязываться к типу, а только имени объекта (тобишь должны быть уникальны):
И так, у нас есть у Qwidget N стандартных свойств + у каждого есть свои M, итого N + M свойств. Все сразу предусмотреть не реально, да и не нужно в принципе что-то знать о них. Реализация будет такой: сохранение Код
восстановление Код
Подходит для любого виджета да и объекта в принципе. Название: Re: Динамически определить тип объекта? Отправлено: alex_beginner от Января 15, 2012, 11:48 Цитировать pseudo code class ISavingWidget { static const QString organization; static const QString application; bool needSave; virtual bool saveSettings() { реализация по умолчанию; } virtual bool loadSettings() { реализация по умолчанию; } }; claass MyWidget : public ISaveWidget { private: QLineEdit *e; QDateTime *t; ---- public: bool saveSettings() { if ( !needSave ) return false; // нечего сохранять то что не надо сохранять, поэтому false QSettings s(org, app); .... s.setValue(e->objectName(), e->text); .... } bool loadSettings() { ... } }; void saveSettings(ISaveWidget *w) { if ( w->saveSettings() ) { LOG << "...." } else { .... } } void loadSettings(ISaveWidget *w) { if ( w->loadSettings() ) { ... } else .... } void main() { MyWidget w; saveSettings(&w); --- если надо расширить функционал //или просто w.saveSettings } А тут уже я не очень понял. Почему будет 100 проверок типов, если 100 объектов? Проверок будет столько, сколько различных типов объектов (если десяток наберётся на форму - то хорошо). А ваш примерчик я чего-то не разобрал. Не потому, что он плохой (видимо), а потому что я новичок. Т.е. если правильно понял, вы предлагаете сделать наследников всех этих полей, кнопок и т.д. с встроенной функциональностью сохранения/восстановления? Ну, наверно можно. Т.е. делать свои виджеты, которые добавлять в стандартную панель - так получается - у которых в дизайнере будет галка "Сохранение"? Или как? Можете набросать простенький пример (ну, скажем, 1 форма, там 3 виджета, и сохранение восстановление)? Потому что пока я не понимаю до конца, что предложено. Чего-то не знаю видимо. Когда-то давно писал на "голом" C, а вот C++, так получилось, немного прошёл стороной. Пробел этот ощущаю - ну что делать... Буду учиться. Название: Re: Динамически определить тип объекта? Отправлено: kambala от Января 15, 2012, 13:22 А если вариант не привязываться к типу, а только имени объекта (тобишь должны быть уникальны): а ведь точно, многие вещи там уже являются свойствами, а я выдумывал такие костыли :)И так, у нас есть у Qwidget N стандартных свойств + у каждого есть свои M, итого N + M свойств. Все сразу предусмотреть не реально, да и не нужно в принципе что-то знать о них. Название: Re: Динамически определить тип объекта? Отправлено: popper от Января 15, 2012, 22:25 Предлагаю дополнить (немного изменить) код, который предложил fuCtor
сохранение: Код
восстановление Код
|