اموزش Qt قسمت پنجم

بعد از یه مدت طولانی تونستم قسمت بعدی اموزشو اماده کنم !
لت اون هم دو چیزه :
یکی در گیر بودن در طراحی چند سایت
و دیگری که مهمترشه اینه که پروژه به جایی رسید که اگه پیش نیازشو رعایت نمیکردیم به مشکل میخوردیم
پیش نیاز کار با Qt هم اشنایی نسبتا خوب به مباحثی هم چون اشاره گر ها و مهم تر از اون مبحث شییء گرایی هست که متاسفانه من در هر دوی این موارد تازه کار بحساب میام و در دانشگاهمون هم هیچ کدوم از موارد فوق رو یاد ندادن ! (اینجاس که میفهمی کم فروشی فقط برای بقال سر کوچه نیس!)
خوب اگه شما مثل من هستین دو پیشنهاد دارم :
اگه میتونید کتاب اموزش سی پلاس پلاس Deitel رو تهیه کنید که گر چه زبان اصله ولی مثل تمام کتابهای Deitel کامله کامله و استاد من در Qt جناب mtux هم این رو پیشنهاد میکنند.
و یا اگه مثل من فعلا امکانشو ندارین و کارت اینترنتتونم تموم شده ! کتاب درس و کنکور سریع سی پلاس پلاس اقای مقسمی از انتشارات گسترش علوم پایه رو توسیه میکنم چون تا حد امکان فشرده و در عین حال جامع هست!(خیلی باهاش حال کردم)
خوب بریم سراغ کار !

برای اینکه بتونیم برناممون رو که در مراحل پیش نوشتیم کاملتر کنیم باید اون رو به استانداردها نزدیک تر کنیم به معنای دقیق تر واقعا از قدرت زبانمون استفاده کنیم و برناممون رو به صورت کلاس بندی شده بنویسیم و برای مدیریت بهتر اون رو در چند فایل تقسیم کنیم .
اونایی که با Qt Creator کار کردن دیدن اون به صورت خود کار پروژمون رو در چند فایل تقسیم میکنه و به صورت شی گرایی کد میزنه!

ما هم به صورت دستی میخواهیم همون کارو کنیم تا با اصول اشنا شیم (از بدی های با IDE کار کردن همینه تا مدتها نمیدونید تو چیا ضعف دارین و ساختار کلی یه برنامه واقعا چه طوریه )
خوب فایلهای برناممون به این شرح هستند:
۱ . main.cpp
فایل اصلی ما محسوب میشه که نقطه اغازین برنامه ما محسوب میشه و فقط تعاریف اصلی برنامه درش هست!
۲٫ hello.cpp
کلاس اصلی ما درون این فایل نوشته میشه و در اصل کار اصلی رو انجام میده!
۳٫ hello.h
فایل header یا در فارسی سر ایند برناممون که توابع و کلاسهای ما در اون تعریف میشه!
۴٫ hello.pro
فایلی که به کامپایرمون میگه تحت چه ترتیبی باید برناممون رو make کنه در قسمتهای قبلی یه توضیح کامل در موردش نوشتم!

خوب حالا که با ساختار اولیه برناممون اشنا شدیم ببینیم هر کدوم از این فایلها چه کدهایی شامل میشوند.
main.cpp

#include <QtGui>
#include “hello.h”

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

hello *Hello = new hello;
Hello->setInterface();
Hello->show();

return app.exec();
}

خوب اولین کد :

#include <QtGui>

به جای تمام include هایی که در قسمت های قبل داشتیم و باعث جلوگیری از سردرگمی در میان انبوه include میشه.

#include “hello.h”

فایل سرایند ما رو include میکنه در اینجا باید به تفاوت <> و “” در دستور include اشاره کنم مورد اول میگه کامپایلر برو از مکان پیشفرض کتابخونه های خودت کتابخونه مورد نظرمو پیدا کن اما دومی میگه فایل مورد نظرم تو پوشه پروژس!

hello *Hello = new hello;

در اینجا اشاره گری (اشاره گر متغیری است که در ان ادرس یک خانه حافظه مینشیند ) به نام Hello از روی کلاس hello مان که در فایل سر ایندمان تعریف و در فایل hello.cpp تشریح کردیم ! میسازیم.

Hello->setInterface();
Hello->show();

وقتی به جای حالت معمولی ما توسط اشاره گر یک نمونه از کلاسمون میسازیم برای دسترسی به توابع و متغیر ها به جای نقطه . باید از <- استفاده کنیم!
در خط اول تابعی که خودم در کلاس hello نوشتم رو صدا کردم که بعدا توضیح میدم چیه! و اما در خط دوم تابع show کلاس hello خودمو صدام کردم اما اگه کلاسمو نگاه کنید چنین تابعی رو پیدا نخواهید کرد اما چون کلاس hello ازQwidget تمام ویژگی هاشو ارث برده میتونیم از توابع اون هم استفاده کنیم.

خوب بریم سراغ فایل بعدی:
hello.h

#ifndef hello_h
#define hello_h

#include <Qwidget>

class QLabel;
class QpushButton;

class hello : public QWidget
{

public:
hello(QWidget *parent = 0);
void setInterface();
private:
QLabel *label;
QPushButton *button;
};

#endif

خوب در فایل سر ایندمان مهمترین کاری که کردیم تعریف کلاس hello با کلمه کلیدی class و سپس تعیین ارث بری ان از کلاس Qwidget توسط : بود.
بعد از تعریف توابع و اشیاء عمومی و خصوصی اون رو مشخص کردیم!تنها چیزی در این تعاریف لازم میدونم توضیح بدم ارگومان تابع زیر هست:

hello(QWidget *parent = 0);

در اینجا به عنوان ارگومان کلاسمون اشاره گر parent هست که به صورت پیش فرض مقدارش صفر هست و این ارگومان تعیین میکنه که پنجره ای که کلاسمون میسازه پنجره اصلیه که با صفر مشخص میشه یا فرزند یه پنجره دیگس (اعداد دیگه به عنوان ورودی)!

اما شاید سوال براتون پیش امده باشه این Qwidget که اینهمه ازش استفاده کردیم اصلا چی هست؟
کلاس Qwidget کلاس پایه برای تمام اشیای رابط کاربریمونه!برای اشنایی بیشتر با این کلاس و همچنین توابع و سایر خصوصیاتش به لینک زیر مراجعه بفرمایید:

http://doc.trolltech.com/4.5/qwidget.html

خوب مغز اصلی سراینمونو فهمیدیم ولی اول فایل امده:

#ifndef hello_h

ا اونجایی که من با سواد ناقصم فهمیدم این شرط چک میکنه که ایا برای بار اوله که سرایندمون در برنامه استفاده میشه یا نه اگه برای بار اول باشه هر چیزی بین این
ifndef = if not define
بود اجرا میشه وگر نه که از تکرار جلوگیری میکنه برای اشنایی بیشتر به لینک زیر مراجعه کنید:

http://www.cprogramming.com/reference/preprocessor/ifndef.html

حالا موقشه بریم سراغ فایل بعدیمون:
hello.cpp

#include <QtGui>
#include “hello.h”

hello::hello(QWidget *parent)
:QWidget(parent)
{
label = new QLabel (“Hello World!”);
button = new QpushButton(“Enter”);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(button);
this->setLayout(layout);
}

void hello::setInterface()
{
int WIDTH = 250;
int HEIGHT = 150;
int screenWidth;
int screenHeight;
int x, y;

QDesktopWidget *desktop = QApplication::desktop();
screenWidth = desktop->width();
screenHeight = desktop->height();
x = (screenWidth – WIDTH) / 2;
y = (screenHeight – HEIGHT) / 2;
this->resize(WIDTH, HEIGHT);
this->move( x, y );
this->setWindowTitle(“Center”);
this->setToolTip(“Center window”);
this->setWindowIcon(QIcon(“icon.jpg”));

}

اکثر کدهایی که در اینجا میبینم رو در قسمت های قبل نوشتیم ولی در اینجا اونها رو در یک کلاس مشخص قرار دادیم!
در اینجا برای کلاس hello دو تابع رو تشریح میکنیم یکی تابع hello است که چون هم نام با کلاسمون هست تابع سازنده مان محسوب میشه یعنی اینکه وقتی یک شی ء از روی کلاس میسازیم به صورت خود کار اجرا میشه و احتیاجی به صدا زدنش نیس!
اما تابع دوممون setInterface نام داره و اگه یادتون باشه در فایل main.cpp صداش کردم و اونجا گفتم در موردش بیشتر توضیح میدم ! خوب توضیحش خیلی سادس من تمام کدهایی که پنجره برناممون رو تنظیم میگرد در این تابع کلاسمون قرار دادم که با فر اخوانیش تمام این تغییرات بر روی پنجره مون اعمال میشه تنها تفاوت این کدها با قبلیا اینه که بجای window اینجا از this استفاده کردم اونم بخاطر اینه که کلاسمون خودش از کلاس Qwidget مشتق شده!
خوب اخرین چیزی که در مورد این فایل میخوام توضیح بدم :: چی هست ؟
رای تعریف واقعی تابع عضو باید اعلام کرد که این تابع متعلق به کدام کلاس است . برای این کار نام کلاس مربوطه باید قبل از نام تابع به همراه اپراتور :: (scope resolution operator عملگر تعیین میدان دید ) اورده شود!

و اخرین فایل پروژمون :
hello.pro

SOURCES = hello.cpp
main.cpp

HEADERS = hello.h

خوب با توجه به اینکه قبلا هم در مورد این فایل اشاره کرده بودم و همونطور که میبینید ساختار بسیار ساده و تابلویی داره احتیاج نمیبینم توضیح بدم.
برای کامپایل پروژه هم از همون دستورات قبلی استفاده میکنیم با این تفاوت که حالا که دستی فایل پروژمون (hello.pro) را ساختیم احتیاج نیست دستور qmake -project رو بزنیم و فقط کافیه از دو دستور زیر استفاده کنیم:
qmake hello.pro
make
و برای اجراش هم :
./hello

در اخر باز هم به این نکته اشاره میکنم تمام چیزایی که نوشتم برداشت های شخصی من هست و ممکنه توضیحاتم درست نباشه! از اساتید خواهش میکنم در صورت مشاهده چیز نادرستی همه ی ما رو روشن کنند .(پیشاپیش ممنونم)

همین جا لازم میدونم باز هم از کسی که بنده رو راهنمایی میکنه یعنی جناب mtux تشکر کنم و در اخر نظر شما رو به اخرین لینکی که ایشون در مورد یه برنامه نویس شدن برام فرستادن جلب میکنم:

http://samizdat.mines.edu//howto/HowToBeAProgrammer.html

علی یارتون

3 دیدگاه برای «اموزش Qt قسمت پنجم»

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>