کیوتی ساده و آسان برای همه

بازی peggle night با کیوتی

نویسنده :سعید دادخواه
تاریخ:یکشنبه 6 آذر 1390-02:55 ق.ظ

سلام دوستای عزیز

آموزش مرحله به مرحله ساخت بازی peggle nights با استفاده از کیوتی در وبساتم www.signbit.ir شروع شد. حتما باهاش جلو بیاید.

موفق باشید



نوع مطلب : Box2D  عمومی 

داغ کن - کلوب دات کام
نظرات() 

QMainWindow قسمت ششم

نویسنده :سعید دادخواه
تاریخ:یکشنبه 3 بهمن 1389-09:12 ق.ظ

سلام .خوب دوستان امید وارم که تا حالا خسته نشده باشید و اماده مطالب جدید تری از کیوتی باشید
در جلسات قبل یکی از مهمترین موجودیت های یه برنامه با واسط کاربر گرافیکی رو با هم دیدیم . یعنی طراحی منو . در این قسمت قصد داریم یکی دیگه از بخش های لازم و مورد نیاز یه برنامه گرافیکی رو با هم ببینیم .تولبار. در این جلسه همچنین قصد داریم که به action هایی که در جلسات قبلی ایجاد کردیم جان بدهیم .یعنی اینکه کار دلخواه ما رو انجام بدن.

خوب بهتره کد های این جلسه رو ببینید. اول فایل QNotePad.h . بعضی از قسمت ها حذف شدند.

کد:
#ifndef QNOTEPAD_H #define QNOTEPAD_H #include <QMainWindow> class QPlainTextEdit; class QAction; class QNotePad : public QMainWindow { Q_OBJECT; public: QNotePad(); private: . . . void createMenus(); void createToolbars(); void createConnections(); private slots: void newDocument(); void openDocument(); void saveDocument(); };
در فایل QNotePad.cpp بخش های مهم به صورت زیر هستند.
کد:
void QNotePad::createToolbars() { QToolBar *mainToolbar = new QToolBar( this ); mainToolbar->addAction( m_newFileAction ); mainToolbar->addAction( m_openFileAction ); mainToolbar->addAction( m_saveFileAction ); mainToolbar->addAction( m_exitAction ); addToolBar( mainToolbar ); }
خوب برای ساختن یه تولبار باز هم از کلاسی که در کیوتی به این منظور ایجاد شده استفاده میکنیم . و اون کلاس QToolBar هستش که یه شی ازش میسازیم و تنها کار مورد نیاز اضافه کردن اکشن هایی است که قبلا اونارو توی ساختن منو ها ساختیم . با تابع addAction اونارو به تولبار مون اضافه میکنیم . با تابع addToolBar عضو کلاس QMainWindow هم میتونیم یک تولبار رو به main window خودمون اضافه کنیم . 

برای اینکه بتونیم از صدا زده شدن یه اکشن با خبر بشیم سیگنال triggered عضو کلاس QAction باید استفاده بشه . این سیگنال زمانی emit میشه که اکشن ما به یه نحوی صدا زده شده باشه یا با استفاده از منو ها یا با استفاده از تولبار یا ... . پس تابع createConnections ما به صورت زیر در میاد.

کد:
void QNotePad::createConnections() { connect( m_newFileAction, SIGNAL(triggered()), SLOT(newDocument())); connect( m_openFileAction, SIGNAL(triggered()), SLOT(openDocument())); connect( m_saveFileAction, SIGNAL(triggered()), SLOT(saveDocument())); connect( m_exitAction, SIGNAL(triggered()), this, SLOT(close()) ); }
نکته ای که هست در تابع connect اگه گیرنده اسلات کلاس جاری باشه this نیازی به ذکر اون نیست. با تعریف هر یک از این اسلات ها کار دلخواه ما انجام خواهد شد. خوب اینم یه تعریف ساده از اسلات newDocument 

کد:
void QNotePad::newDocument() { m_plainTextEdit->setPlainText(""); }
خوب اسلات های دیگه بیشتر بحث داره که بعدا با هم بحث میکنی


داغ کن - کلوب دات کام
نظرات() 

QMainWindow قسمت دوم

نویسنده :سعید دادخواه
تاریخ:پنجشنبه 30 دی 1389-01:28 ق.ظ

ارث بری از کلاس QMainWindow
سلام خدمت دوستان عزیز
در قسمت قبلی با کلاس QMainWindow به طور مختصر آشنا شدیم . خوب ذکر این نکته مهمه که معمولا برنامه های بزرگ تر به شیوه ای که در مثال قبلی دیدیم نوشته نمیشند. بلکه در برنامه های جدی تر و مهم تر ما از کلاس QMainWindow ارث میبریم و ویژگی های مورد نیازمون رو بهش اضافه میکنیم
یه مثال خیلی ساده رو با هم بررسی میکنیم . فرض کنید میخوایم یه کلاس به نام MainWindow (‌ کیو نداره) درست کنیم که از کلاس QMainWindow ارث برده شده باشه . خوب اول ساده ترین قسمت کد رو با هم ببینیم 

کد:
#include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow mainWindow; mainWindow.show(); return a.exec(); }
خوب کد بالا فقط برای ساختن یه شی از کلاس ماست . که خیلی شبیه مثال قبلیه با این تفاوت که هر چیزی که قراره در داخل MainWindow ماقرار بگیره باید به فایل MainWindow.cpp و سازنده اون منتقل بشه و در main ما تنها یه شی از اون میسازیم و با تابع show() نمایشش میدیم.

فایل MainWindow.h ما به شکل زیر خواهد بود

کد:
#include <QMainWindow> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); };
خوب همون طور که از کد پیداست ما از کلاس QMainWindow ارث بردیم. Q_OBJECT رو هم که توی moc گفتیم . اگه کلاس شما حاوی سیگنال و اسلاتی باشه که خودتون تعریف میکنید این ماکرو حتما باید ذکر بشه. اما عادت خوبیه حتی اگه شما سیگنال و اسلات خودتون رو هم تعریف نکردید ولی این ماکرو رو توی فایل .h تون قرار بدین.( شاید تجربه کرده باشید که چرا میگم خوب عادتیه )

کد:
#include "mainwindow.h" #include <QLabel> MainWindow::MainWindow() { setWindowTitle(tr("MyFirstMainWindow")); resize(400, 400); QLabel* label = new QLabel(tr("Central Widget")); setCentralWidget(label); label->setAlignment(Qt::AlignCenter); }
فرض کنید سازنده ی این کلاس هم به صورت بالا باشه .
تابع اول چیه ؟ window title عنوان بالای پنجره شما رو تعیین میکنه مثلا اگه از مرور گر firefox استفاده میکنید window title شما یه چیزی شبیه Mozila FireFox هستش که در کنار دکمه های بستن و ... هستش. برای تعیین window title یه main window از این تابع استفاده میکنیم . این تابع عضو کلاس QMainWindow هستش و چون شما به صورت public از این کلاس ارث بردین مسلما بهش دسترسی دارین.
چیزی که توی این تابع به چشم میخوره استفاده از یه تابع دیگه به نام tr هستش . این تابع خیلی کاربردیه . چرا ؟ با عادت به این کار که هر رشته ای که تو برنامه تون هست رو داخل این تابع قرار بدین ، به صورت ضمنی دارین رشته هاتونو برای ترجمه به زبان های دیگه تعیین میکنید. یعنی چی ؟ خوب اگه شما بخواید برنامه ای که نوشتید رو به زبان های مختلف توسعش بدین کار ساده ای نخواهد بود چون یک به یک باید اونا رو جایگزین کنید یا مثل بعضی از برنامه ها از فایل های خارجی استفاده کنید . اما در کیوتی با تعیین رشته هایی که باید ترجمه شوند و استفاده از برنامه linguist که بعدا آموزشش رو باهم میبینیم میتونید به راحتی برنامه تون رو به هر زبانی تر جمه کنید 
تابع بعدی که استفاده شده resize هستش که برای تغییر عرض و ارتفاع یه ویندو هستش . به ترتیب عرض و ارتفاع رو به عنوان پارامتر به این تابع ارسال میکنیم . بعد از انجام این دستور ، پنجره ما عرض 400 و ارتفاع ۴۰۰ خواهد داشت.
تو خط بعدی کد من اومدم یه QLineEdit رو روی heap گرفتم تا به main window خودم اضافه کنم . چرا با new این کارو انجام دادم ؟‌چون که اگه روی استک میگرفتم خوب بعد از اینکه سازنده تموم میشد به طبع QLineEdit ساخته شده هم از بین میرفت. 
تابع setCentralWidget هم که قبلا توضیحشو دادیم .فقط یه نکته یادم رفت بگم اینکه با اجرای این تابع ، main window پدر ویدجتی میشه که به عنوان پارامتر به این تابع ارسال شده یعنی اونو مدیریت میکنه و در 
زمان مقتضی پاکش میکنه.
برای اینکه متن لاین ادیت هم در وسط نمایش داده بشه از تابع setAlignment استفاده کردیم . 
نکته آخر این که اگه شما بخواین ویدجت مرکزی تون یه کم پیچیده تر و در عین حال مرتب باشه میتونید این کارو بکنید که ابتدا یه شی از QWidget بسازید بعدش روی این ویدجت هر چی دلتون خواست ویدجت های دیگه مثل QLineEdit , QPushButton و.. با استفاده از layout ها بچینید و بعد اون ویدجت رو به عنوان ویدجت 
مرکزی انتخاب کنید
فعلا


داغ کن - کلوب دات کام
نظرات() 

Qt Resources Compiler rcc

نویسنده :سعید دادخواه
تاریخ:یکشنبه 26 دی 1389-09:06 ب.ظ

سلام
شاید هیچ برنامه با واسط کاربری گرافیکی پیدا نشه که از منابعی مثل تصاویر و فایل های گرافیکی توش استفاده نشده . مثل آیکن های تولبار و منو بار یا فیلم ابتدای یک بازی یا عکس درباره ما و خیلی چیزای دیگه . این فایل ها به دو صورت میتونند تو برنامه استفاده بشند . یا به صورت خارجی یعنی اینکه مثلا تمام تصاویر توی یه پوشه کنار فایل اجرایی برنامه باشند هرجایی که نیاز بود از همون فایل ها استفاده کنه . یا اینکه این فایل ها در درون فایل اجرایی به صورت مستقیم قرار داده بشند .که در این صورت دیگه نیاز نیست تصاویر و منابع برنامه در دسترس همگان باشه . با استفاده از rcc ما میتونیم منابعمون رو به فایل اجرایی منتقل کنیم تا نیاز نباشه که به صورت خارجی وجود داشته باشند. در زمان طراحی فایلی با پسوند qrc به پروژه اضافه میشه که حاوی لیست تمامی فایلهایی است که باید به عنوان resource ( منبع ) به پروژه اضافه بشند.پس rcc اطلاعات لازم رو از این فایل بدست میاره. در واقع فایل qrc  لیستی شامل آدرس تمامی منابع موجود در یه پروژه رو در بر داره.مثلا در تصویر زیر یه فایل qrc در QtCreator باز شده است
qt resource

آموزش کامل نحوه استفاده از resource editor موجود در Creator و نحوه دستیابی به فایل های اضافه شده به یک فایل resource موجود در پروژه بعدا بحث خواهد شد.


نوع مطلب : عمومی 

داغ کن - کلوب دات کام
نظرات() 

مدیریت حافظه در سلسله مراتب اشیا

نویسنده :سعید دادخواه
تاریخ:یکشنبه 26 دی 1389-04:53 ب.ظ

سلام دوستان

همون طور که میدونید سی پلاس پلاس مدیریت حافظه رو به عهده برنامه نوس گذاشته است یعنی اینکه وقتی شما به عملگر new یه شی ی رو ایجاد میکنید این شی از بین نمیره تا یا برنامه به انتها برسه یا از عملگر delete برای حذف اون استفادن کنیم
اما در کیوتی این امکان وجود داره که شما در شرایط های خاصی مدیریت حافظه رو به عهده کیوتی بذارین . بذارید بیشتر توضیح بدم . اشیای کلاس هایی که از QObject ارث میبرند میتونند یه چیزی شبیه به یه ساختار درخت مانند تشکلیل بدند .  همون طور که دیدیم اشیا ممکن است فرزند داشته باشند . اگرپدر ( همون شی ای که فرزند داره ) delete بشه تمام فرزندان اون هم در کیوتی به صورت خودکار حذف میشند. این بچه ها تازه میاند و بچه ها شونو حذف میکنند و همین طور تا آخر
پس اگر ریشه اون درخت فرضی از  بین بره کیوتی به صورت خودکار بقیه درخت رو حذف میکنه. این ویژگی بسیار خوب هست چون شما رو از دردسر اینکه اشیا رو چگونه مدیریت کنید و کی از بین ببرینشون راحت میکنه.
اما برای اینکه این مدیریت حافظه توسط کیوتی اعمال بشه باید تمام بچه ها و بچه های بچه ها و بچه های .... روی heap گرفته شده باشند .یعنی با عملگر new ساخته شده باشند در غیر این صورت زمانی که مدت عمر یه شی یا یه متغیر تمام شد خود به خود طبق ویژگی های سی پلاس پلاس از بین خواهد رفت.این مشکل کیوتی کار های تاز کار هست . اشیا رو روی استک میگیرند و خوب بعد از اینکه مثلا سازنده کلاس به انتها رسید کامپایلر اشیای ایجاد شده روی سstack رو از بین میبره  و به همین دلیل هست که مثلا فرم یه لحظه کوتاه نمایش داده میشه و ازبین میره.
فعلا


نوع مطلب : عمومی 

داغ کن - کلوب دات کام
نظرات() 

ساختن ویدجت دلخواه

نویسنده :سعید دادخواه
تاریخ:یکشنبه 26 دی 1389-03:35 ب.ظ

سلام خدمت دوستان

در این قسمت قصد داریم که با نحوه ساختن یه ویدجت به دلخواه خودمون آشنا بشیم. آموزش این قسمت همراه با یه فایل ویدیویی هست !
خوب برای اینکه ما بتونیم خودمون یه فرم دلخواه طراحی کنیم ( یه ویدجت جدید خلق کنیم )‌باید از کلاس QWidget ارث برده و باتوجه به نیاز خودمون اونو تغییر بدیم

ادامه مطلب

نوع مطلب : ویدجت های Qt 

داغ کن - کلوب دات کام
نظرات() 

Signals and Slots part Two

نویسنده :سعید دادخواه
تاریخ:یکشنبه 26 دی 1389-12:05 ق.ظ

در مورد سیگنال و اسلات نکات زیر مهم هستند 

اولا اینکه سیگنال ها میتونند وقتی  emit میشند (فریاد زده میشند )یه مقداری رو هم بفرستند . مثلا در مورد لاین ادیت سیگنالی هست با عنوان textChanged . این سیگنال وقتی فرستاده میشه که متن درو ن یه جعبه متن تغییر کنه خوب ما که فقط بدون متن این جعبه متن تغییر کرد دردی ازمون دوا نمیشه ما نیاز به این داریم که بدونیم متن جدید چیه 
مسلما.
ادامه مطلب رو ببینید

ادامه مطلب

نوع مطلب : عمومی 

داغ کن - کلوب دات کام
نظرات() 

Signals and Slots part one

نویسنده :سعید دادخواه
تاریخ:شنبه 25 دی 1389-11:28 ب.ظ

سلام خدمت دوستان عزیز

یکی از مفاهیم کلیدی در مورد برنامه نویسی در کیوتی مبحث سیگنال و سلات هستش . این مفاهیم در واقع ابزار های ارتباط اشیاء یک برنامه با هم هستند.
ادامه مطلب رو از دست ندین

ادامه مطلب

نوع مطلب : عمومی 

داغ کن - کلوب دات کام
نظرات() 


شبکه اجتماعی فارسی کلوب | Buy Mobile Traffic | سایت سوالات