Название: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 10, 2009, 13:13 Код: qobject_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->text(); Код: qobject_cast<mainWindow *>(parent()->parent()->parent())->ui.actTovCat; эти коды размещены в разных исходниках. и хз почему ине работает... инклуд mainWindow.h прописан и там и там... уже третий день голову ломаю, не могу понять какого это не работает. требуется стороннее мнение где я дурак? Название: Re: qobject_cast то работает то нет... Отправлено: spirit от Октябрь 10, 2009, 13:37 валидность указателя каждого парента и самого actTovCat. что-то не так с указателями (нулевой или невалидный).
Название: Re: qobject_cast то работает то нет... Отправлено: lit-uriy от Октябрь 10, 2009, 14:00 вместо написания длинной строки лучше писать в несколько, тогда и проверить можно, произошло приведение типа или нет:
Код
Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 10, 2009, 15:32 Код: mainWindow *w = qobject_cast<mainWindow *>(parent()->parent()->parent()); Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 10, 2009, 16:15 Код: fMyOrg *child = new fMyOrg; но всё же интересно почему оно там спотыкалось! Название: Re: qobject_cast то работает то нет... Отправлено: SASA от Октябрь 10, 2009, 16:59 ИХМО если у вас появляются структуры вида parent()->parent()->parent(), то либо рядом должно быть много проверок и комментариев, либо надо менять архитектуру.
Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 17:20 либо рядом должно быть много проверок и комментариев А в комментариях лучше написать: "FixMe: Сегодня мне было особенно плохо..." ;)либо надо менять архитектуру. +1. Нужно сразу начать менять.Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 17:30 Присоединяюсь, конструкция parent()->parent()->parent() ненадежна и будет разваливаться при каждом добавлении лайаута. Про "архитектуру" громко сказано, можно нормально сделать за 5 минут
http://www.prog.org.ru/topic_10751_0.html Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 17:38 Про "архитектуру" громко сказано, можно нормально сделать за 5 минут Да костылек можно быстренько подставить, вопросов нет.Только если необходимо из внутренних виджетов добираться до mainWindow, то скорее всего что то не то с архитектурой классов и их связями. Дочерние классы получаются зависимыми от класса mainWindow, они должны о нем знать и уметь им пользоваться. Что не есть гуд, для повторного использования кода. По мне уж лучше связывание через connect сделать... Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 17:52 Только если необходимо из внутренних виджетов добираться до mainWindow, то скорее всего что то не то с архитектурой классов и их связями. Дочерние классы получаются зависимыми от класса mainWindow, они должны о нем знать и уметь им пользоваться. Что не есть гуд, для повторного использования кода. Согласен что connect лучше/техничнее, но проблем с архитектурой это не решает. Все равно "кто-то" (кто связывает слот/сигнал) должен "знать все" о mainWindow и его child - зависимость все равно остается прямой/явной. Ну и до повторного использования еще дожить надо :)По мне уж лучше связывание через connect сделать... Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 17:58 Согласен что connect лучше/техничнее, но проблем с архитектурой это не решает. Все равно "кто-то" (кто связывает слот/сигнал) должен "знать все" о mainWindow и его child - зависимость все равно остается прямой/явной. Ну и до повторного использования еще дожить надо :) Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте.А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен. ;) Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 18:16 Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте. Все верно, не должен child переться в parent (и особенно вызывать методы parent напрямую). Но что делать если ему от parent'а нужно что-то получить чтобы продолжить свою работу? И это "что-то" по смыслу в parent. Иногда удается удачно положить, иногда интерфейсная прокладка подойдет, ну а иногда проще признаться - это глухо конкретно и ни на какую общность мы не рассчитываем :)А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен. ;) Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 18:20 Все верно, не должен child переться в parent (и особенно вызывать методы parent напрямую). Но что делать если ему от parent'а нужно что-то получить чтобы продолжить свою работу? И это "что-то" по смыслу в parent. Иногда удается удачно положить, иногда интерфейсная прокладка подойдет, ну а иногда проще признаться - это глухо конкретно и ни на какую общность мы не рассчитываем :) Код Мысль понятна? ;) А кто, что и в какой вложенности будет менять в SetupWidget дело десятое. Пусть сам SetupWidget будет сообщать о изменениях. И mainWindow не нужно ничего знать про внутренности setupWidget. Мы можем что угодно менять в SetupWidget, пока будет не изменен интерфейс mainWindow сможет с ним работать. Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 18:49 Мысль понятна? ;) На простых примерах отлично проходит все что угодно :) А если, напримерА кто, что и в какой вложенности будет менять в SetupWidget дело десятое. Пусть сам SetupWidget будет сообщать о изменениях. И mainWindow не нужно ничего знать про внутренности setupWidget. Мы можем что угодно менять в SetupWidget, пока будет не изменен интерфейс mainWindow сможет с ним работать. Код: struct Settings { Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 18:55 BuildSettings должно знать много всего и место ей вроде в MainWindow. Действительно? BuildSettings должно находиться в ГЛАВНОМ ОКНЕ программы? Хм... :oТы правда так думаешь? А может для setting лучше сделать отдельную сущность, к которой будет доступ и у mainWindow и у SetupWidget? Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 19:08 Действительно? BuildSettings должно находиться в ГЛАВНОМ ОКНЕ программы? Хм... :o В окне или нет, но очень может быть что в классе который намного мощнее SetupWidget. Ты правда так думаешь? А может для setting лучше сделать отдельную сущность, к которой будет доступ и у mainWindow и у SetupWidget? Ну сама Setting на "сущность" не очень тянет - пассивные данные, struct. Здесь по-моему хорошо подойдет "implementation" техника (немногое что мне понравилось в Жабе). После тщательного обдумывания конечно.Так что я бы человека за "архитектуру" не осуждал, это может быть очень непросто и иногда лучше "поступиться принципами" :) Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 19:16 это может быть очень непросто и иногда лучше "поступиться принципами" :) По моему, это девиз Microsoft. ;)[off] IMHO При ООП нельзя сесть за компьютер, открыть ТЗ и как пианист начать строчить что вижу. Для ООП больше подходит процесс длительного проектирования, которое потом выльется в более компактный и эффективный код, с большим количеством повторного использования кода. Нужно выделять сущности, продумывать их взаимодействие (интерфейсы). А иначе, процесс будет превращаться, чем "дальше в лес" тем "больше костылей". [/off] Название: Re: qobject_cast то работает то нет... Отправлено: Rcus от Октябрь 10, 2009, 19:30 Точно, а то что рефакторинг зародился в среде программистов SmallTalk это совпадение ага :)
Начинали с qobject_cast, а пришли к Waterfall vs Agile :) Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 20:08 Точно, а то что рефакторинг зародился в среде программистов SmallTalk это совпадение ага :) Ты имеешь ввиду рефакторинг кода во время разработки?При эволюции системы он скорее всего понадобиться. Но... Если в системе есть датчик, то нужно описать сущность датчик, которая не должна ничего знать о главном окне, о базе данных, куда все показания должны сохраняться и о подобных сущностях. Если в какой то момент разработки из класса датчика нужно вытащить работу с железом и поместить ее в другую сущность "железо", с которой в дальнейшем будет работать датчик, то в этом нет ничего плохого, остальная часть системы как работала с датчиком так и будет работать. Если меняется интерфейс для работы датчиком, то эти изменения коснутся только сущностей, которые на прямую работают с ним. А при правильной архитектуре это будут далеко не все классы системы. Сейчас же сплошь и рядом пишут комбобоксы, которые напрямую лезут к железу, таблицы которые напрямую работают с базами данных и т.д. А когда просишь людей уберите этот GUI и прицепите ncurses, т.к. на машине которая будет стоять рядом с прибором (для мониторинга) не установлены X, они широко раскрывают глаза и удивленно отвечают, что у нас весь функционал размазан по GUI и одно без другого не работает. Становиться грустно. Поэтому, я убежден, что при разработке новой системы проектированию необходимо уделять максимум времени, что бы потом использовать минимум костылей. :) Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 10, 2009, 20:34 что бы потом использовать минимум костылей. :) Ага, значит наличие и необходимость костылей Вы все-таки признаете :) Вы описали классический случай "сделайте версию application с командной строкой без UI" - это всегда хорошая проверка архитектуры на вшивость. Но я не могу согласиться с Вами что все будут (и должны) делать это пока жизнь не заставит. Планировать перед стартом конечно нужно, но никогда всего не предусмотришь, хорошие, гибкие зависимости обычно получаются со второго-третьего раза. Возвращаясь к qobject_cast: очень может быть что "костыля" с взятием указателя MainWidow хватит на несколько лет и никаких проблем не возникнет - например если человек пишет серию плагинов. Зачем же грузить его замысловатой конструкцией с множественным наследованием, чистыми виртуалами и.т.п., что (по моему мнению) правильно и корректно но ... нужно ли оно ему?Ну вот, мы с Вами опять свалились во флуд, умолкаю :) Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 10, 2009, 20:54 Вы описали классический случай "сделайте версию application с командной строкой без UI" - это всегда хорошая проверка архитектуры на вшивость. Не обязательно с командной строкой. Главное, что бы функционал был отделен от GUI, тогда к нему можно и командную строку приделать и Qt/wxWidget/Gtk...Если абстракцию можно выделить в сущность, то ее нужно выделить. Не нужно все что можно пихать в MainWindow, он должен отвечать только за главное окно, включая меню, тулбар и т.д. Также комбобокс должен уметь только вывести список строк и просигнализировать о том какую строку выбрал пользователь, больше он ничего не должен уметь делать! Ну вот, мы с Вами опять свалились во флуд, умолкаю :) Лучше на ты.С флудом согласен, тоже умолкаю. :) Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 09:42 мужики, отсыпьте а?! я тоже так хочу.. :)
развели беседу на тему сущностей и прочей нечисти. аы совсем забыли про то что не каждый программист, а если точнее никакой программист с нуля нифига не знает, он этому всему на практике учится, вспомните учебники по программированию, вы ведь никогда не прочтете главы по работе с БД если не будете знать азов языка! и тут тоже нужно допускать момент что пока мы что то пишем, мы делаем по своему, а в будущем узнаем что то же что мы делали можно делать проще... и что? переделывать кординально код, или писать заново большую прогу? нет я понимаю если есть разделение труда.. обмен опытом постоянный в пределах допустим офиса.. а если такого нет?! вот то-то и оно! изначально моя прога работала по одному, и когда узнаю что что-то можно делать проще, то уже новые модули работают так чтобы проге было лучше и меньше "костылей" было. а уже существующие модули они в процессе их доработки переделываются... но вернёмся к заданному вопросу! суть была такова, во вновь созданный класс передаются некоторые переменные которые известны классу mainWindow. вот и был вопрос, как достать их из mainWindow в child.. сначала делал это с помощью парентов, а потом уже переменные стал при инициализации child'a передавать.. создавать отдельную сущность для хранения переменных не хочу. оно пока не требуется в этой программе. да и всё же был вопрос в том почему не работает qobject_cast. ведь последовательность парентов что в этом классе (не работает каст) что в другом (в котором работает) одинакова! при чем я писал раньше, инклуды у обоих чайлдов одинаковы.. Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 11, 2009, 11:19 мужики, отсыпьте а?! я тоже так хочу.. :) Вчера все закончилось. :)и что? переделывать кординально код, или писать заново большую прогу? Вот и может получиться, что в какой то момент времени придется все переписывать заново.изначально моя прога работала по одному, и когда узнаю что что-то можно делать проще, то уже новые модули работают так чтобы проге было лучше и меньше "костылей" было. а уже существующие модули они в процессе их доработки переделываются... Вот сейчас самое время начать переделывать, такие цепочки парентов как раз об этом говорят.но вернёмся к заданному вопросу! суть была такова, во вновь созданный класс передаются некоторые переменные которые известны классу mainWindow. вот и был вопрос, как достать их из mainWindow в child.. сначала делал это с помощью парентов, а потом уже переменные стал при инициализации child'a передавать.. Если переменные из mainWindow являются константами для child - передавай их при конструировании child, если в процессе работы эти переменные могут меняться и об этом изменении должен узнавать child сделай связь через сигналы. Тогда ты избавишься от жестких связей между объектами mainWindow и child.да и всё же был вопрос в том почему не работает qobject_cast. ведь последовательность парентов что в этом классе (не работает каст) что в другом (в котором работает) одинакова! Попробуй посмотреть, что возвращает каждый из parent() в твоих случаях.при чем я писал раньше, инклуды у обоих чайлдов одинаковы.. Код
Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 11:40 ну так в данный момент отчасти прогу и переделываю.. ибо столкнулся с тем что нужно вести теперь не только локальный склад, но и контроллировать несколько различных складов из одной программы.
ды, вопрос конечно не совсем по разделу но всё же, чтобы не открывать новую тему. можите написать пример как правильно инициализировать транзации в БД? и как можно убить созданный экземпляр QSqlQuery (я чего то забыл как это делается) ЗЫ ну а мож найдётся сегодня к вечеру чего отсыпать? а то очень на ночь надо, пиво уже нре помогатет. Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 11, 2009, 11:58 ды, вопрос конечно не совсем по разделу но всё же, чтобы не открывать новую тему. можите написать пример как правильно инициализировать транзации в БД? bool QSqlDriver::hasFeature ( DriverFeature feature ) const + QSqlDriver::Transactionsbool QSqlDatabase::transaction () bool QSqlDatabase::commit () bool QSqlDatabase::rollback () и как можно убить созданный экземпляр QSqlQuery (я чего то забыл как это делается) Код
Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 12:18 bool QSqlDriver::hasFeature ( DriverFeature feature ) const + QSqlDriver::Transactions а правильно вызывать как? опять же сори просто с ними ещё не сталкивался.. и есть ли в этом механизме проверка успешна ли транзакция или нет..bool QSqlDatabase::transaction () bool QSqlDatabase::commit () bool QSqlDatabase::rollback () Код
delete я так понимаю любой объект убивает? Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 11, 2009, 12:32 а правильно вызывать как? опять же сори просто с ними ещё не сталкивался.. Посмотри в assisten документацию по модулю QtSql. Так есть раздел Transactions с примером использования.В общих чертах: * Начинаешь транзакцию QSqlDatabase::database().transaction() * Выполняешь запросы * Если произошла ошибка, то вызываешь QSqlDatabase::database().rollback(), которая откатит все до состояния перед началом транзакции. * Иначе (все хорошо) фиксируешь все в базе QSqlDatabase::database().commit() и есть ли в этом механизме проверка успешна ли транзакция или нет.. Так эти функции все результат возвращают.Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 12:48 пасиб попытась.. сегодня-завтра помедитирую на эту тему..
будут вопросы отпишусь.. ну или результаты на будущее, может кому пригодятся. Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 21:31 так... теперь снова по теме которую создавал.. ситуация обратная.. нужно чтобы из чайлда передать переменную в mainWindow.. кто-то там говорил на счёт сигналов и слотов? а поподробнее можно как это отслеживать? вызов через:
Код: object_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->setText(dirCount); Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 11, 2009, 21:37 так... теперь снова по теме которую создавал.. ситуация обратная.. нужно чтобы из чайлда передать переменную в mainWindow.. кто-то там говорил на счёт сигналов и слотов? а поподробнее можно как это отслеживать? вызов через: Уберите порнуху (parent()->parent()->parent()) - тогда и поговоримКод: object_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->setText(dirCount); Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 11, 2009, 21:46 давайте... порнуху убрать не сложно.. а что вместо неё класть туда? 0_о
Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 11, 2009, 22:21 давайте... порнуху убрать не сложно.. а что вместо неё класть туда? 0_о То, что было написано в этой теме :)Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 12, 2009, 08:31 читал что написанор в теме, если честно то ниасилил... либо мне нужно точно так же покурить что и люди мне писавшие здесь.. или всё же пояснить страждущему до знаний поконкретнее было написано..
Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 12, 2009, 09:30 читал что написанор в теме, если честно то ниасилил... либо мне нужно точно так же покурить что и люди мне писавшие здесь.. или всё же пояснить страждущему до знаний поконкретнее было написано.. Да ладно, это фундаментальный механизм Qt: Signals & Slots. Разберись с ним. ;)Код Когда изменяется строка в child нужно испустить сигнал emit changedString( tr( "Измененная строка" ) ) и все слоты подключенные к этому сигналу получат измененную строку. Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 12, 2009, 09:39 тьфу блин.. совсем забыл что можно самому сигналы создавать...
пасиб что напомнил! Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 12, 2009, 14:42 итак.. продолжаем обучать меня неразумного... сделал так..
child .h Код: signals: Код: emit changedString(dirCount); .h Код: private slots: Код: void mainWindow::setDirCount(const QString &str) Код: fMyOrg *child = new fMyOrg; как это проверить? и вообще почему может не работать ЗЫ можно быть дураком даже если умный... но хочется как можно меньше в себе оставить эту часть от дурака.. Название: Re: qobject_cast то работает то нет... Отправлено: pastor от Октябрь 12, 2009, 15:01 Про Q_OBJECT незабыл?
Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 12, 2009, 16:32 не забыл..
у меня ведь до этого были сигланы и слоты.. и они коннектятся нормально.. а этот почему то не хочет... вообще есть проверка на то есть сигнал или нет?? точнее есть соединение сигнал\слот или нет..? Название: Re: qobject_cast то работает то нет... Отправлено: uriel от Октябрь 12, 2009, 17:13 Если нет консоли, а нужно прочитать сообщение об ошибке, то можно немного извернуться.
Код
Название: Re: qobject_cast то работает то нет... Отправлено: pastor от Октябрь 12, 2009, 17:52 вообще есть проверка на то есть сигнал или нет?? точнее есть соединение сигнал\слот или нет..? Цитировать bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static] Creates a connection of the given type from the signal in the sender object to the method in the receiver object. Returns true if the connection succeeds; otherwise returns false. Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 12, 2009, 21:21 пасибо, завтра попробую и отпишусь о результате.
Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 13, 2009, 12:19 странно, сигнал нормально соединяется... а вот слот не пашет... точнее не вызывается..
Название: Re: qobject_cast то работает то нет... Отправлено: pastor от Октябрь 13, 2009, 14:26 Выкладывай код, будем смотреть
Название: Re: qobject_cast то работает то нет... Отправлено: SASA от Октябрь 13, 2009, 17:19 Зачитался. ::)
Я не зря писал про коменты. Конечно, код типа parent()->parent()->parent()->.... нужно рефакторить. Но это очень опасное и долгое занятие. Бывают случаи, когда такие костыли работают и трогать их не хочется. Но рядом должен быть комент, который разяснял бы откуда этот костыль взялся и какую дырку он закрывает. Ещё такие костыли я обклабываю кучей ASSERT. И если один из них всплывает я читаю комент и, либо "чиню" костыль, либо рефакторю код. Я не использую юнит тесты (к моему великому сожелению), поэтому рефакоринг занимает у меня МНОГО времени и сил. Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 13, 2009, 19:19 класс mainWindow
.h Код: class fMyOrg; Код: fMyOrg *mainWindow::createFormMyOrg() .h Код: class fMyOrg : public QWidget Код: void fMyOrg::pbAddSkladClicked() думаю что код понятен.. если что обязательно поясню что и где. весь код не выкладываю он большой, только основные куски кода. Название: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 15, 2009, 16:56 так что никто больше помочь не может?? стопорится программа на этом моменте :(
Название: Re: qobject_cast то работает то нет... Отправлено: BRE от Октябрь 15, 2009, 17:07 Странно все это.
fMyOrg::pbAddSkladClicked() точно выполняется? До emit changedString(dirCount) управление точно доходит? Поставь в ключевых местах отладочный вывод (qDebug() << ... ) и проверь. Название: Re: qobject_cast то работает то нет... Отправлено: Igors от Октябрь 15, 2009, 18:11 так что никто больше помочь не может?? стопорится программа на этом моменте :( Могут, но что можно сказать по тому огрызку что Вы показали? Проверьте что fMyOrg имеет Q_OBJECT и moc'нулся. Не поможет - выкладывайте упрощенный пример который можно руками пощупатьНазвание: Re: qobject_cast то работает то нет... Отправлено: Krow от Октябрь 15, 2009, 21:46 Странно все это. блин... спасиб тебе большое... тока вот по прошествии 5 дней понял какой был дурак (в общем как и каждый программист допускающий глупую ошибку..) в общем emit сигнала был не в той процедуре... нужна была.. pbSkladDefaultClicked()fMyOrg::pbAddSkladClicked() точно выполняется? До emit changedString(dirCount) управление точно доходит? Поставь в ключевых местах отладочный вывод (qDebug() << ... ) и проверь. |