Название: Работа нескольких форм. Отправлено: Mish_ka от Март 23, 2011, 17:52 Подскажите пожалуйста, догнать сам не могу.
Есть форма1 и форма2 из main.cpp, вызываю функцию на форме1 (по открытию формы2), при этом форма1 скрытая. код майна: Код
код функции вызова формы2 - суть функции запустить форму 2, запустить таймер, по истечении которого на форме 2 должна стать кнопка btn активной, по кнопке btn должна закрыться вторая форма т отобразиться первая. Код
функция showbtnfrm2() - вызывает глобальную функцию с формы2 Код
функция btnGoON() - на форме2 делает кнопку активной Код
на кнопку висит конект Код
функция hideMe() - на форме2 вызывает глобальную функцию hideTwo() на форме1 Код
функция hideTwo() - на форме1 должна убивать вторую форму и показывать первую Код
В такой комбинации вылетает крах проги. Если закоментить первую строку то вторая форма убивается нормально, а первая соответственно не показывается=). голову уже сломал ??? Название: Re: Работа нескольких форм. Отправлено: Denjs от Март 23, 2011, 19:09 во первых никак нельзя "delete frmTwo;"
можно "frmTwo->deleterlater();" Иначе рискуете сегфолт схватить из глубоких недр Qt. Во вторых - чего то у вас слишком много фрагментов. Полностью код опубликуйте? Мне вот уже не нравится что вы "из main.cpp, вызываю функцию на форме1" потому что делать что то с формой вне eventLoop - меня это лично как-то сильно коробит. Тем более - боюсь что вы и от таймера чего-то ждете вне цикла событий... имхо, не люблю я такое, да и не понятно что у вас там и как именно. Давайте весь код. и проблему опишите "локальнее" - в одном абзаце лаконично, а то я, признаться, так ничего и не понял что вам в этом всем не нравится. Название: Re: Работа нескольких форм. Отправлено: Mish_ka от Март 23, 2011, 19:28 Проблема:
Хочу чтобы из первой формы вызывалась вторая при этом первая форма скрыта, и считает время для активации кнопки закрытия второй формы Закрытие второй формы и отображение первой. У меня в приведённом ниже коде не получается только отобразить первую форму (проблемная строчка помечена). Полный код: майн Код
первая форма Код
вторая форма Код
Название: Re: Работа нескольких форм. Отправлено: Denjs от Март 24, 2011, 00:57 во первых, я бы
QTimer *timer; и startBaner *frmSB; - определил как свойства класса iTMan. Зачем они просто так висят?... весь ООП портят) Во вторых - у вас нифига не инициируется iTMan *frmIT (который тоже надо бы в свойства класса перенести); про запутанность соединений я промолчу... В третьих я так понимаю вы показали форму, тсчитали время, и ждете пока пользователь нажмет кнопку? Ну.. он её нажимает.. и? void startBaner::hideMe() вызывается? void iTMan::hideStartBaner() вызывается? а в момент "connect(uiSB.btnGo, SIGNAL(clicked()), this, SLOT(hideMe()));" - вы никаких warning в консоль не получаете по поводу невозможности подключиться? а iTMan *frmIT точно инициировали? Название: Re: Работа нескольких форм. Отправлено: Mish_ka от Март 24, 2011, 09:15 Нет ни каких Варингов не сыпиться.
*frmIT инициируется так как вызов происходит: Код
трабла уже в функции hideStartBaner(); Код
если нет строчки this->setVisible(true); то вторая форма убивается, а приложение продолжает висеть в процессах. Вопрос как в данной ситуации показать не видимую первую форму Название: Re: Работа нескольких форм. Отправлено: Denjs от Март 24, 2011, 11:35 тогда прикрепляйте ваши файлы вашего проекта в архиве и просите что бы кто-то для вас - собрал у себя вашу программу и прогнал под отлдачиком у себя.
имхо. Название: Re: Работа нескольких форм. Отправлено: Mish_ka от Март 24, 2011, 12:50 Вот исходники
+ видео =) http://narod.ru/disk/8295651001/24.03.2011%2018-37-59.rar.html Название: Re: Работа нескольких форм. Отправлено: m4n71k0r от Март 24, 2011, 16:11 Извиняюсь, а дро...{передёргивать} память таким вот образом модно стало?
Создали формы и делайте видимыми/невидимыми. Upd: http://doc.qt.nokia.com/4.7/qsplashscreen.html (http://doc.qt.nokia.com/4.7/qsplashscreen.html) Название: Re: Работа нескольких форм. Отправлено: Mish_ka от Март 24, 2011, 16:48 Если не заметили то при заданных условиях ваш сплэш (qsplashscreen) не катит...
Просто я думал что это не есть дрочево =) я с VB там проще, есть прога, в ней есть формы. Me.frmForm.show - показывает Me.frmForm.hide - скрывает вызываются из любого места. Подскажите тогда как делать такие манипуляции и не дрочить память =) Название: Re: Работа нескольких форм. Отправлено: m4n71k0r от Март 24, 2011, 21:42 two_forms_and_timer.pro
Код
banner_form.hpp Код
main_form.hpp Код
core.cpp Код
Извиняюсь, местами нарушил принципы ООП (в частности, не полностью выполнил инкапсуляцию). Удачи. И определитесь, на каком языке программирования Вы будете писать профессионально. Upd: Можно просто создать Ваш класс диалогового окна. Ещё неплохо бы сделать обработчик события нажатия кнопки и по нажатию генерировать сигнал от формы, что кнопка нажата. Таким образом все объекты баннера будут скрыты и на выходе будет лишь сигнал о нажатии кнопки, который будет оповещать главную форму, что нужно появиться...А я бы просто сделал модальное окно и не заморачивался бы с невидимостью главной формы. У модального окна убрать все кнопки из заголовка и закрывать только по нажатию кнопки. Как вариант. Название: Re: Работа нескольких форм. Отправлено: Denjs от Март 24, 2011, 23:33 Вот исходники Ещё раз напомню вам про то что вы нигде не инициируете переменную frm1.<...> Цитировать *frmIT инициируется так как вызов происходит: Послушайте, вы хотите мне сказать, что если просиходит вызов, но вы нигде не иниуиировали переменную - то она сама чем-то инициировалась? позвольте тогда спросить - на что именно она указывает?!Запустите программу под отладчиком, посомтрите значение переменной frm1 внутри From2::zakritEtuFormu() а потом на значение указателя this внутри Form2forM::PokazatFormu1_skritFormu2(). - это все в коде который вы приложили. Если произошел вызов метода по ссылке для неинициированной переменной - то значит вам просто "повезло" - и это частный соучай повеления частного компилятора в частном случае. В общем случае вы должны были схватить сегфолт при самой такой попытке вызова. Что бы объснить вам почему такое возможно - надо будет подробно и далеко залазить в дебри того, как С\С++ компиляторы хранять в памяти данные и методы классов. А вы сомневаюсь, что готовы к такому. Пока вы не инициировали переменную - у неё случайное значение. нельзя ею пользоваться. Просто запомните это и переписывайте ваш код. Название: Re: Работа нескольких форм. Отправлено: Mish_ka от Март 30, 2011, 18:23 |