PDA

View Full Version : سوال: نحوه نمایش فرم دوم در برنامه



returnx
سه شنبه 16 اسفند 1390, 21:40 عصر
من در برنامه ام فرم دومی ساختم و با کد زیر نمایش میدم:

Form2i_form;
i_form.show();اما مشکل اینجاست که فرم 2 نمایش پیدا میکنه اما سریعا بسته میشه...
همین مشکل رو با کلاس Qmessagebox هم داشتم اما متد exec مشکلم حل کرد اما تو کلاس widget ها این متد وجود نداره...
روش های دیگه ای رو هم آزمایش کردم اما هیچ کدوم درست جواب نداد...
کجای کارم اشتباست؟!

حامد مصافی
سه شنبه 16 اسفند 1390, 22:30 عصر
اگر فرم دوم شما از نوع QDialog باشد همان متد exec را به کار ببرید. در غیر اینصورت اولاً بنده به صحت اصول کار شما شک خواهم کرد دوماً paren فرم دوم را به فرم اول ست کنید.

mousamk
چهارشنبه 17 اسفند 1390, 09:03 صبح
اشکالش اینجاس که شما آبجکت فرم دومتون رو تو stack ساختین. متد show هم فرم رو نشون میده و بلافاصله برمیگرده و وقتی به انتهای تابع میرسه، چون تو استک بوده از بین میره، به همین دلیل سریع بسته میشه. راهش اینه که تو heap بسازین، یعنی به این شکل:



Form2* i_form = new Form2(this);
i_form->show();

returnx
چهارشنبه 17 اسفند 1390, 17:40 عصر
اگر فرم دوم شما از نوع QDialog باشد همان متد exec را به کار ببرید. در غیر اینصورت اولاً بنده به صحت اصول کار شما شک خواهم کرد دوماً paren فرم دوم را به فرم اول ست کنید.
فرم دوم من از نوع Widget هست ، متد exec نداریم...
خودمم به صحت اصول کار خودم شک دارم!!

اشکالش اینجاس که شما آبجکت فرم دومتون رو تو stack ساختین. متد show هم فرم رو نشون میده و بلافاصله برمیگرده و وقتی به انتهای تابع میرسه، چون تو استک بوده از بین میره، به همین دلیل سریع بسته میشه. راهش اینه که تو heap بسازین، یعنی به این شکل:
این روشی که شما هم میگید رو قبل از اینکه بگید تست کردم اما جواب نداد ، در این روش بعد از کلیک کردن حتی فرم دومم باز نمیشه و فرم اول هم تمام کنترل هایی که روش هست غیر فعال میشه و فقط دکمه های استاندارد ویندوز کار میکنه یعنی Minimize,Maximize,Close ...
حالا کجای کارم اشتباست نمیدونم!؟

حامد مصافی
چهارشنبه 17 اسفند 1390, 20:53 عصر
همین الان تست کردم درست بود


Form *f = new Form;
f->show();

returnx
چهارشنبه 17 اسفند 1390, 21:43 عصر
همین الان تست کردم درست بود

پس قطعا یکجای کار من میلنگه...

alamate_aoal
پنج شنبه 18 اسفند 1390, 00:23 صبح
با توجه به اینکه شئ i_form از نوع QWidget هست اگر براش parent ست کنید اون شئ بعنوان top-level ویجت در نظر گرفته نمیشه (یعنی بعنوان یک پنجره مستقل در نظر گرفته نمیشه)

اگر میخوای i_form بصورت پنجره مستقل نمایش داده بشه , همونطور که آقای مصافی گفتن براش parent تعیین نکن(صفر باشه) :

Form2 *i_form = new Form2;
i_form->show();


اگر تعیین parent برات مهمه میتونید مقدار Qt::Window رو بعنوان آرگومان دوم برای سازنده ارسال کنی که این مستلزم ویراش و یا سربارگذاری سازنده هست:
Form2 *i_form = new Form2(this, Qt::Window);
i_form->show();

و راحت ترین روش اینکه در سازنده ی Form2 از متد زیر استفاده کنی:
setWindowFlags(Qt::Window);

returnx
پنج شنبه 18 اسفند 1390, 09:16 صبح
بلاخره درست شد ، اما آخرش نفهمیدم مشکل کارم از کجا بود !؟
از کد زیر استفاده کردم در حالی که قبلا هم از این کد استفاده کرده بودم اما جواب نداد!!

form2*i_form=newform2(this);
i_form->show();