|
|
|
من داشتم در مرحله بعدی یک lable به برنامم اضافه میکردم و قصد اینو داشتم که بعدش یک دکمه هم اضافه کنم که با اجرای کدهای زیر دیدم
پنجره اصلی من جدا اجرا میشه و lable من هم جدا! حالا سوال اینجاس چه طوری به کیوت بفهمونم که این lable توی پنجره اصلیمه ؟
|
Registered Member
|
[quote="pesarkhobeee"]
من داشتم در مرحله بعدی یک lable به برنامم اضافه میکردم و قصد اینو داشتم که بعدش یک دکمه هم اضافه کنم که با اجرای کدهای زیر دیدم پنجره اصلی من جدا اجرا میشه و lable من هم جدا! حالا سوال اینجاس چه طوری به کیوت بفهمونم که این lable توی پنجره اصلیمه ؟
[/quote] parent اون label رو همون پنجرهی مورد نظر بزار! اینطوری:
بعد اینکه برای تنظیم کردن اینا روی پنجرهی اصلی باید از QLayout و کلاسهای مربوطه استفاده کنی! یک نکتهی مهم توی برنامهنویسی Qt: همونطور که میدونی C++ سیستم garbage collector ی که توی JAVA هست، و همهی آبجکتها و حافظه ها رو توی خروج برنامه حذف میکنه نداره! و شما خودت باید اینکار رو بکنی! اما Qt این کار رو میکنه! در صورتی که همهی اجزای برنامهات یک کلاس از نوع QObject باشه (یعنی از این ارث برده باشه) و parentش رو طوری تنظیم کنی، که والد اصلی همه یه QMainWindow باشه! پس یادت نره که اجزایی که میریزی توی صفحه مثل همین برچسب رو بچهی ایشون یا یکی دیگه کنی که آخر کار حذف بشه
Choqok developer
|
Registered Member
|
موقع کامپایل برنامه خطای زیر را می دهد:
من از همان کدهایی که قرار داده بودید استفاده کرده ام. |
Registered Member
|
[quote="zarei"]
موقع کامپایل برنامه خطای زیر را می دهد:
من از همان کدهایی که قرار داده بودید استفاده کرده ام. [/quote] احیانا چطوری اونا رو کامپایل کردین!؟ با QMake؟! چون اینجا به نظر میرسه که هدرفایلهای Qt رو پیدا نکرده! و این یعنی یا توی دستور مربوطه (دستور g++) آدرس داده نشده، یا اینکه اونجا نیستن، یا اینکه نصب نیستن یا اینکه D:
Choqok developer
|
|
متاسفانه کاری رو که شما فرمودین انجام دادم تو کامپایل به مشکل خوردم!
تو یه مثالی هم دیدم به جای window از this استفاده کرده بود اونم امتحان کردن بازم ارور داد! :'( |
|
جواب مشکل پیدا شد البته با کمک دوست خوبم اقای اطهری
;D کافیه موقع ارجاع قبل از window از & استفاده کنیم اونم بخاطر این بود که ورودی مشخص کننده والد باید ادرس حافظه باشه نه خود متغیر که از مباحث مربوط به اشاره گر هاست! هر چه قدر در برنامه نویسی بیشتر پیش میرم به خیانتی که تو دانشگاهها میشه بیشتر پی میبرم :'( واقعا ماها مسلمونیم؟ بماند موردی هم که گفتم درش از this استفاده کرده بودن جایی بود که کلاس تعریف شده بود و در مثال من اصلا کلا بی معنیه! بی سوادی دیگه به بزرگی خودتون ببخشین
Last edited by Anonymous on Mon Aug 17, 2009 11:44 pm, edited 1 time in total.
|
|
خوب به لطف خدا پس از برخورد با چند تا مشکل وحل اونها قسمت چهارم اموزش هم اماده شد.
توجه : قبل از خوندن مقاله زیر به این نکته اشاره میکنم که این نوشته ها برداشت های شخصی خودم هست و ممکن هست از نظر فنی توضیحاتم درست نباشه! در این قسمت ما برناممون رو که تا قسمت قبل پنجرشو ساختیم و تنظیمش کردیم کاملتر میکنیم و بهش یه سری کنترل اضافه میکنیم و بعد اون کنترل ها رو در لایه میزایم تا نظمشون حفظ شه! اما سوال اول اینه که کنترل چیه؟ کنترل ها اجزای قابل تعریف برای استفاده در برنامه های گرافیکی هستند به تعبیر ساده تر اجزایی که ما در برنامه هامون میبینیم مثل دکمه ها و منو ها و … کنترل محسوب میشه! یکی از خوبی های کیوت هم داشتن تعداد وسیعی از کنترل هاست که به راحتی با ترکیب این کنترل ها میتونیم برناممون رو بسازیم . نکته : در دنیای کیوت به کنترل ، widget (ابزارک) میگن! ما در این برنامه از دو نوع کنترل یکی برچسب یا Label و دومی دکمه یا Button استفاده میکنیم. خوب مثل هر چیز دیگه ای برای استفاده از اینها باید اول کتابخانه مربوطشون رو در برنامه درج کنیم.
و اما برای تعریفشون در برنامه از خط های زیر استفاده میکنیم:
خوب در خط اول ما کنتری به نام label را از روی کلاس Qlabel میسازیم و مقداری رو که قراره نمایش بده رو Hello World تعریف میکنیم. در خط دوم هم یک دکمه از روی کلاس QpushButton میسازیم و مقداری که نمایش میده رو تنظیم میکنیم. در تعریف هر دوی این کنترل ها ما دو ارگومان دادیم که در دومین ارگومان &window ما مشخص میکنیم والد این کنترل کدام پنجرس؟ اگر این را مشخص نکنیم کنترل های ما در پنجرمان نشان داده نمیشوند. خوب حالا بیایید برنامه قبلی رو با اضافه کردن دستورات فوق تکمیل کنیم. خوب همونطور که میبینید کنترل های ما با موفقیت ایجاد شدن ولی روی هم افتادن! برای مدیریت کنترل ها در صفحه پنجرمان کیوت کنترلی در اختیار ما گزاشته به نام Qlayout که میتونید اطلاعات کاملی از این کنترل در این صفحه بدست بیاورید. http://doc.trolltech.com/4.4/layout.html اما اگه بخوام توضیح بدم Qlayout یک راه ساده و قوی را برای مرتب کردن خودکار کنترل ها فراهم میکنه! Qlayout به صورت پیش فرض به سه صورت میتونه کنترل ها رو کنار هم مرتب کنه به صورت عموی و یا افقی و یا ترکیبی از هر دو که در اصلاح شبکه ای میگن در زیر شکلهایی از هر سه روش میارم: لایه افقی که توسط کلاس QHBoxLayout تغریف میشود: لایه عمودی که توسط کلاس QVBoxLayout تغریف میشود: لایه شبکه ای که توسط کلاس QGridLayout تغریف میشود: خوب حالا ما این قصد رو داریم تا برای مدیریت کنترلها از لایه افقی استفاده کنیم برای این کار اول باید کتابخونه مورد نیازو در برنامه درج کنیم:
و بعد برای تعریف لایه افقی و ستون های لایه افقی و قرار دادن کنترلها در این ستون ها از دستورات زیر استفاده میکنیم:
خوب ما در خط اول یک اشاره گر از نوع QHBoxLayout تعریف کردیم و بعد در خط دوم گفتیم در ستون اول اون کنترل label مون رو قرار بده و در خط بعدی گفتیم که در ستون دوم button رو قرار بده و سپس این لایه ساخته شده رو در خط چهارم به پنجرمون اعمال کردیم که نتیجش : رو مشاهده میکنیم ! خوب اینم از کل کدهای برنامه ما کی طی این چهار جلسه تکامل پیدا کرده:
و اما برای تمرین پشنهاد میکنم با کمک این سایت: http://zetcode.com/tutorials/qt4tutorial/widgets/ کنترل های مختلف کیوت رو به برنامتون اضافه کنیدو لذت ببرید و در ادامه روشهای مختلف layout رو هم امتحان کنید. علی یارتون
Last edited by pesarkhobeee on Wed Aug 19, 2009 8:54 pm, edited 1 time in total.
|
|
متاسفانه تلاش های این چند روز من برای اعمال مکانیزم signal و slot به برنامم شکست خورده!
Qt Creator خیلی راحت میتونه این کارو کنه ولی من این چند روز هر چی سعی کردم دستی این کارو کنم شکست خوردم خواهش میکنم اگه مقدوره کمی توضیح بدین و اگه شد کدی به مثال من اضافه کنید که با کلیک شدن دکمه متن label عوض شه! رفرنسایی که در این ازمایشات استفاده کردم اینان: http://doc.qtsoftware.com/4.5/signalsandslots.html http://zetcode.com/tutorials/qt4tutoria ... andsignals |
|
سلام دوستان
وقتی من دستور qmake رو می زنم میگه bash: qmake: command not found فک کنم میگه نصب نیست و تو مخازن هم نبود من OpenSUSE 11.1 استفاده می کنم دوستان راهنمایی کنن ممنون میشم:) |
Registered Member
|
[quote="pesarkhobeee"]
متاسفانه تلاش های این چند روز من برای اعمال مکانیزم signal و slot به برنامم شکست خورده! Qt Creator خیلی راحت میتونه این کارو کنه ولی من این چند روز هر چی سعی کردم دستی این کارو کنم شکست خوردم خواهش میکنم اگه مقدوره کمی توضیح بدین و اگه شد کدی به مثال من اضافه کنید که با کلیک شدن دکمه متن label عوض شه! رفرنسایی که در این ازمایشات استفاده کردم اینان: http://doc.qtsoftware.com/4.5/signalsandslots.html http://zetcode.com/tutorials/qt4tutoria ... andsignals [/quote] خوب، دیگه کم کم بهتره برای خوشکل شدن کار، و راحت تر شدن بعضی کارا مثل همین، پروژه رو توی چند فایل پخش کنی! و همه چیز رو توی main() انجام ندی اول اینکه تابع connect که برای اینکار استفاده میشه یکی از توابع QObject است! و این یعنی که اینجا نمیتونی توی main بنویسی:
البته میتونی استفاده کنی! به شیوههای دیگه! اما نمیتونی خودت یک slot تعریف کنی، و در واقع دستت باز نیست! خوب چه کنیم!؟ یک کلاس تعریف میکنی با نام مثلا MainWindow و این از QMainWindow مشتق میشه! و حالا بجای تعریف آبجکت از QMainWindow توی main از کلاس خودمون استفاده میکنیم! خوب توی کلاس چیکار کنیم!؟ اول باید یک slot تعریف کنی، و بعد با دستور connect که حالا داخل کلاس MainWindow میتونی فراخوانی کنی چون یک ساب کلاس از QObject است! سیگنال clicked از button رو وصل میکنی به اون slot تعریف شده! و توی slot هرکاری دوست داشتی میکنی، از جمله عوض کردن متن label! من کلیت کار رو گفتم! که خودت بری دنبالش و اینا رو یاد بگیری! tutorialهای اولیهی Qt از این چیزا دارن که گفتم! یه سر هم به مستندات کلاس QObject و دستور connect هم بزنی بد نیست!
Choqok developer
|
Registered Member
|
پیشنهاد میکنم یک پروژه روی یک سرور کنترل سورس مثل Gitorious تعریف کنی! http://gitorious.org/
بعدش هم کسایی که میخوان روی کد تغییرات بدن، رو به پروژه اضافه کنی! تا بتونیم اونجا روی کد تغییرات بدیم! اینطوری نمیشه من روی کد تو تغییرات بدم!چون چیزی نیست D: البته این ایده یه بدبختی تازه هم برات داره، اونم کار کردن با git یا svn هست =)) میتونیم از یه pastebin هم استفاده کنیم البته!
Choqok developer
|
|
بعد از یه مدت طولانی تونستم قسمت بعدی اموزشو اماده کنم !
علت اون هم دو چیزه : یکی در گیر بودن در طراحی چند سایت و دیگری که مهمترشه اینه که پروژه به جایی رسید که اگه پیش نیازشو رعایت نمیکردیم به مشکل میخوردیم پیش نیاز کار با Qt هم اشنایی نسبتا خوب به مباحثی هم چون اشاره گر ها و مهم تر از اون مبحث شییء گرایی هست که متاسفانه من در هر دوی این موارد تازه کار بحساب میام و در دانشگاهمون هم هیچ کدوم از موارد فوق رو یاد ندادن ! (اینجاس که میفهمی کم فروشی فقط برای بقال سر کوچه نیس!) خوب اگه شما مثل من هستین دو پیشنهاد دارم : اگه میتونید کتاب اموزش سی پلاس پلاس detail رو تهیه کنید که گر چه زبان اصله ، ولی مثل تمام کتابهای detail کامله کامله و استاد من در Qt جناب mtux هم این رو پیشنهاد میکنند. و یا اگه مثل من فعلا امکانشو ندارین و کارت اینترنتتونم تموم شده ! کتاب درس و کنکور سریع سی پلاس پلاس اقای مقسمی از انتشارات گسترش علوم پایه رو توسیه میکنم چون تا حد امکان فشرده و در عین حال جامع هست!(خیلی باهاش حال کردم) خوب بریم سراغ کار ! برای اینکه بتونیم برناممون رو که در مراحل پیش نوشتیم کاملتر کنیم باید اون رو به استانداردها نزدیک تر کنیم به معنای دقیق تر واقعا از قدرت زبانمون استفاده کنیم و برناممون رو به صورت کلاس بندی شده بنویسیم و برای مدیریت بهتر اون رو در چند فایل تقسیم کنیم . اونایی که با Qt Creator کار کردن دیدن اون به صورت خود کار پروژمون رو در چند فایل تقسیم میکنه و به صورت شی گرایی کد میزنه! ما هم به صورت دستی میخواهیم همون کارو کنیم تا با اصول اشنا شیم (از بدی های با IDE کار کردن همینه تا مدتها نمیدونید تو چیا ضعف دارین و ساختار کلی یه برنامه واقعا چه طوریه ) خوب فایلهای برناممون به این شرح هستند: 1 . main.cpp فایل اصلی ما محسوب میشه که نقطه اغازین برنامه ما محسوب میشه و فقط تعاریف اصلی برنامه درش هست! 2. hello.cpp کلاس اصلی ما درون این فایل نوشته میشه و در اصل کار اصلی رو انجام میده! 3. hello.h فایل header یا در فارسی سر ایند برناممون که توابع و کلاسهای ما در اون تعریف میشه! 4. hello.pro فایلی که به کامپایرمون میگه تحت چه ترتیبی باید برناممون رو make کنه در قسمتهای قبلی یه توضیح کامل در موردش نوشتم! خوب حالا که با ساختار اولیه برناممون اشنا شدیم ببینیم هر کدوم از این فایلها چه کدهایی شامل میشوند. main.cpp
خوب اولین کد :
به جای تمام include هایی که در قسمت های قبل داشتیم و باعث جلوگیری از سردرگمی در میان انبوه include میشه.
فایل سرایند ما رو include میکنه در اینجا باید به تفاوت <> و "" در دستور include اشاره کنم مورد اول میگه کامپایلر برو از مکان پیشفرض کتابخونه های خودت کتابخونه مورد نظرمو پیدا کن اما دومی میگه فایل مورد نظرم تو پوشه پروژس!
در اینجا اشاره گری (اشاره گر متغیری است که در ان ادرس یک خانه حافظه مینشیند ) به نام Hello از روی کلاس hello مان که در فایل سر ایندمان تعریف و در فایل hello.cpp تشریح کردیم ! میسازیم.
وقتی به جای حالت معمولی ما توسط اشاره گر یک نمونه از کلاسمون میسازیم برای دسترسی به توابع و متغیر ها به جای نقطه . باید از <- استفاده کنیم! در خط اول تابعی که خودم در کلاس hello نوشتم رو صدا کردم که بعدا توضیح میدم چیه! و اما در خط دوم تابع show کلاس hello خودمو صدام کردم اما اگه کلاسمو نگاه کنید چنین تابعی رو پیدا نخواهید کرد اما چون کلاس hello ازQwidget تمام ویژگی هاشو ارث برده میتونیم از توابع اون هم استفاده کنیم. خوب بریم سراغ فایل بعدی: hello.h
خوب در فایل سر ایندمان مهمترین کاری که کردیم تعریف کلاس hello با کلمه کلیدی class و سپس تعیین ارث بری ان از کلاس Qwidget توسط : بود. بعد از تعریف توابع و اشیاء عمومی و خصوصی اون رو مشخص کردیم!تنها چیزی در این تعاریف لازم میدونم توضیح بدم ارگومان تابع زیر هست:
در اینجا به عنوان ارگومان کلاسمون اشاره گر parent هست که به صورت پیش فرض مقدارش صفر هست و این ارگومان تعیین میکنه که پنجره ای که کلاسمون میسازه پنجره اصلیه که با صفر مشخص میشه یا فرزند یه پنجره دیگس (اعداد دیگه به عنوان ورودی)! اما شاید سوال براتون پیش امده باشه این Qwidget که اینهمه ازش استفاده کردیم اصلا چی هست؟ کلاس Qwidget کلاس پایه برای تمام اشیای رابط کاربریمونه!برای اشنایی بیشتر با این کلاس و همچنین توابع و سایر خصوصیاتش به لینک زیر مراجعه بفرمایید: http://doc.trolltech.com/4.5/qwidget.html خوب مغز اصلی سراینمونو فهمیدیم ولی اول فایل امده:
تا اونجایی که من با سواد ناقصم فهمیدم این شرط چک میکنه که ایا برای بار اوله که سرایندمون در برنامه استفاده میشه یا نه اگه برای بار اول باشه هر چیزی بین این ifndef = if not define بود اجرا میشه وگر نه که از تکرار جلوگیری میکنه برای اشنایی بیشتر به لینک زیر مراجعه کنید: http://www.cprogramming.com/reference/p ... fndef.html حالا موقشه بریم سراغ فایل بعدیمون: hello.cpp
اکثر کدهایی که در اینجا میبینم رو در قسمت های قبل نوشتیم ولی در اینجا اونها رو در یک کلاس مشخص قرار دادیم! در اینجا برای کلاس hello دو تابع رو تشریح میکنیم یکی تابع hello است که چون هم نام با کلاسمون هست تابع سازنده مان محسوب میشه یعنی اینکه وقتی یک شی ء از روی کلاس میسازیم به صورت خود کار اجرا میشه و احتیاجی به صدا زدنش نیس! اما تابع دوممون setInterface نام داره و اگه یادتون باشه در فایل main.cpp صداش کردم و اونجا گفتم در موردش بیشتر توضیح میدم ! خوب توضیحش خیلی سادس من تمام کدهایی که پنجره برناممون رو تنظیم میگرد در این تابع کلاسمون قرار دادم که با فر اخوانیش تمام این تغییرات بر روی پنجره مون اعمال میشه تنها تفاوت این کدها با قبلیا اینه که بجای window اینجا از this استفاده کردم اونم بخاطر اینه که کلاسمون خودش از کلاس Qwidget مشتق شده! خوب اخرین چیزی که در مورد این فایل میخوام توضیح بدم :: چی هست ؟ برای تعریف واقعی تابع عضو باید اعلام کرد که این تابع متعلق به کدام کلاس است . برای این کار نام کلاس مربوطه باید قبل از نام تابع به همراه اپراتور :: (scope resolution operator عملگر تعیین میدان دید ) اورده شود! و اخرین فایل پروژمون : hello.pro
خوب با توجه به اینکه قبلا هم در مورد این فایل اشاره کرده بودم و همونطور که میبینید ساختار بسیار ساده و تابلویی داره احتیاج نمیبینم توضیح بدم. برای کامپایل پروژه هم از همون دستورات قبلی استفاده میکنیم با این تفاوت که حالا که دستی فایل پروژمون (hello.pro) را ساختیم احتیاج نیست دستور qmake -project رو بزنیم و فقط کافیه از دو دستور زیر استفاده کنیم:
و برای اجراش هم :
در اخر باز هم به این نکته اشاره میکنم تمام چیزایی که نوشتم برداشت های شخصی من هست و ممکنه توضیحاتم درست نباشه! از اساتید خواهش میکنم در صورت مشاهده چیز نادرستی همه ی ما رو روشن کنند .(پیشاپیش ممنونم) همین جا لازم میدونم باز هم از کسی که بنده رو راهنمایی میکنه یعنی جناب mtux تشکر کنم و در اخر نظر شما رو به اخرین لینکی که ایشون در مورد یه برنامه نویس شدن برام فرستادن جلب میکنم: http://samizdat.mines.edu//howto/HowToB ... ammer.html علی یارتون |
|
من دو تا سوال دارم اما قبلش لازم میدونم یه اشتباه تو توضیحات قسمت قبل یعنی قسمت پنجم رو تصحیح کنم. در توضیح کد:
اشتباه کردم ! در حقیقت کار این کد اینه که ببینه قبلا کلاسی با نام مثلا hello ایجاد شده یا نه! اگه ایجاد نشده بود اجازه ی ایجاد کلاسو میده! خوب برم سر وقت سوالام: سوال اولم اینه که وقتی به یه label مقدار فارسی میدم نlabel نمیتونی فارسی رو نشون بدم ! برای مقدار فارسی دادن ایا باید کار خاصی کنم؟ دومین مشکل اینه که وقتی با Qt creator برنامه میسازم برای چند بار اول تو کدهاش این کتابخونه رو که خودش میسازه نمیشناسه!
و تا وقتی اینو نشناخته امکان اتوکامپلت کدهای مربوط به GUI رو ندارم! نظری راجع به این مشکل دارم تا از چند بار بستن پروژه خلاص شم؟ |
Registered Member
|
در مورد #ifndef hello_h باید گفت که این دستور چک میکنه که چیزی بنام hello_h قبلا توسط دستور #define hello_h تعریف شده یا نه!
که این خودش دلیلش اینه که وقتی یک هدر فایل مثلا hello.h رو توی دوتا فایل دیگه include میکنیم، که یکی از اون دو تا توی اون یکی include شده! توی دومی، دوبار hello.h وارد شده! و اگر این چک کردن رو حذف کنیم، باعث میشه که کلاس hello دوبار تعریف بشه، و کامپایلر خطا بده! (یه بار تست کن، شاید بهتر متوجه بشی ) و در کل این ربطی به اسم کلاس نداره در مورد فارسی: از این دستور استفاده کن:
در مورد فایل ui هم: برنامهای داریم به نام uic که کارش تولید این هدر فایل (ui_filename.h) از فایل uiای که بوسیلهی Qt Designer تولید کردیم است! یعنی همون فایل filename.ui که فرمتش xml هست! اولین باری که این uic اجرا بشه و هدر فایل رو تولید کنه، اون در دسترس شما و Creator قرار میگیره
Choqok developer
|
Registered users: bartoloni, Bing [Bot], Google [Bot], Sogou [Bot], Yahoo [Bot]