ورود

View Full Version : منظور از properties در راهنمای کیت چیست؟



hosseinam1370
دوشنبه 24 فروردین 1394, 15:24 عصر
دوستان در این لینک :
http://doc.qt.io/qt-5/qlabel.html

منظور از properties چیه؟و با کمک این آیتم ، ما میتونیم چیکار کنیم و چطور ازش استفاده کنیم.


با تشکر .

ravaei
دوشنبه 24 فروردین 1394, 17:56 عصر
درود ، هر کلاسی از کتابخونه gui.h ، یک سری خصوصیت مشترک داره و یک سری خصوصیت مخصوص به خودش که اون هارو تو properties مینویسه ... برای مثال تو این لینکی که شما
قرار دادید Qlabel رو مثال زده :

Qlabel مثل بقیه کلاس های این کتابخونه خصوصیات مشترکی داره مثل geometry و یک سری هم خصوصیات مثل text یا pixmap کث میتونی اینارو set کنی مثلا:



QLabel *new_l = new QLabel(newTab);
new_l->setGeometry(10,10,10,10);
new_l->setText("salam");



الان تو این مثال settext تابعی هست که هر widget که دارای text هست (قابلیت نشون دادن text داره ) این رو داره ولی setgeometry تابعی هست که اکثر widget ها این رو دارن

اگه دقت کنی زیر properties یه همچین چیزی نوشته :



6 properties inherited from QFrame (http://doc.qt.io/qt-5/qframe.html#properties)
59 properties inherited from QWidget (http://doc.qt.io/qt-5/qwidget.html#properties)
1 property inherited from QObject (http://doc.qt.io/qt-5/qobject.html#properties)

یعنی 6 تا خصوصیت مشترک با Qframe داره 59 تا خصوصیت از Qwidget و 1 خصوصیت از QObject به ارث برده ...

hosseinam1370
دوشنبه 24 فروردین 1394, 23:05 عصر
دوسته عزیز میشه زحمت بکشی فرق خواص و توابع عمومی همین کلاسی که گذاشتم (مثلا qlabel) رو بگی؟یعنی چه فرقی دارن و چه دلیلی داشت این کار رو بکنند؟!!

الان مثلا منظور این از خصوصیات چیه : margin : int ، چیو میخاد بهم بفهمونه؟!! (از لحاظ گرامری میگم) و چطوری استفاده میشه؟

منبع فارسی واسه یادگیری کیوت نداریم دیگه ، پیدا کردن اطلاعات همراه با مشکل هست.

با تشکر.

ravaei
دوشنبه 24 فروردین 1394, 23:57 عصر
یه سری مفهوم اولیه در کل زبان هایی که به صورت شی گرا طراحی شدن مشترکه ... هر کلاس دارای یک سری اجزاست : که توابع ، خواص ، سازنده و مخرب از مهمترین اجزای یک کلاسن.

همین کلاس Qlabel رو مثال میزنیم :

1. خواص (property) : یکی از خواص این کلاس که شما هم بهش اشاره کردید margin : int هستش که به ما میگه خصوصیتی به نام margin (اندازه حاشیهء label ) وجود داره که از نوع int هستش یعنی اگه بحوایم مقدارشو بگیریم به ما int برمیگردونه ... مثل : int x =ui->label->margin();

2.تابع (function) : خوب حالا ما که همیشه نمی خوایم این متغیر (margin) رو همیشه مقدارش رو بدونیم ، شاید بخوایم مقدار دهی کنیم...! برای این کار تابعی به نام ()setmargin وجود داره اولا داخل پرانتز نوشته int این یعنی این که باید یک مقداری از نوع integer بهش بدیم ثانیا از نوع void هستش یعنی یک کاریرو برامون انجام میده (طول و عرض label رو به اندازه ای که شما وارد کردید یعنی همون مقدار int که دادید کم و زیاد میکنه )

3.سازنده(constructor) : وقتی ما میایم و یک نمونه از کلاس Qlabel رو new میکنیم :

QLabel *new_l = new QLabel(this);

یعنی چی؟ اگه دقت کنید میبینید که اولین تابع عمومی این رو نوشته :

QLabel(QWidget * parent = 0, Qt::WindowFlags f = 0)

و میبینید که نمونه ای از WindowFlags و QWidget داخل ()Qlabel قرار داده ، یا همچنین تابع دوم که این دو همنام خودش هستن به این ها میگن سازنده و وقتی داخل تابع سازنده مقادیری رو پیشفرض داده ، (این جا هر دو مقدار برار 0 هستش ) یعنی اگه مقداری ندی اشکالی نداره خودش یه مقداری میده بهش ، (حالا چی میده بماند باید ببینی 0 واسه اون متغیر چه مفهومی رو پیاده سازی میکنه !) ... من هم مقدار this رو به سازنده پاس دادم .

حالا Qwidget چیه ؟ یعنی فرم (اینجا به معنیه اینه که "کدوم فرم؟؟؟") من گفتم this یعنی Qlabel رو با اون خصوصیاتی که دادم (توابع که بالا گفتم) قرار بده تو همین فرمم window flags رو هم تغییر ندادم مقدار پیشفرض رو قرار داد.

4- مخرب : اگه کنار سازنده علامت مُد باشه یعنی این تابع مخرب هستش ... این میگه که در حین از بین رفتن این Qlabel چه اتفاقی بیوفته ؟
(در اینجا مخرب کاری انجام نمیده!!!)

به سازنده لحظه تولد و به مخرب مرگ شي هم میگن !!

اگه اشتباه نکنم فکر کنم همینجوریه ... بحث سنگین شد صلوات ختم کنید :لبخند:

returnx
سه شنبه 25 فروردین 1394, 10:25 صبح
برای تکمیل صحبت های دوستمون باید بگم ، منظور از properties همان خصوصیات یک کلاس هست ، در واقع این یکی از مفاهیم شی گرایی هست ، برای درک بیشتر این نوع برنامه نویسی کافیه ، به دنیای اطرافت نگاه کنی ، پر از اشیاست ، اشیای دور و بر ما ، یک سری ویژگی دارند که ما به آنها میگیم خاصیت! برای مثال مانیتور رو به روی صورتت ، یک عرض و یک ارتفاع داره ،این عرض و ارتفاع میشه خواص مانیتور ، حالا اگر بخوایم یک کلاس برای مانیتور بسازیم حتما باید وجود این خواص را براش قید کنیم.البته بهتره که سلسله مراتب وراثت را هم رعایت کنیم.
اما اون توابع ای را که میبینید و سوال اصلی هست به اون توابع میگن Accessors! برای ساختن یک خاصیت ، ما در کلاس یک متغیر قید می کنیم که وظیفش نگه داشتن مقدار خاصی است که بیان کننده ی مقدار آن خاصیت هست ، مثلا برای نگه داشتن عرض میتونیم از یک متغیر از نوع int با نام width استفاده کنیم ، بدیهی اگر متغییر ما public باشه و از کلاسمون یک شی بسازیم ، خیلی راحت میتونیم بهش هر مقداری بدیم ، حتی مقادیر غیر مجاز ! مثلا یک عدد منفی ! در حالی که در مفاهیم فیزیکی ارتفاع منفی نداریم! اینجاست که کار خراب میشه و اگر این کلاس تابعی برای محاسبه ی مساحت داشته باشه حتما دچار خطا میشه ! برای جلوگیری از این مشکل راه حلی ارائه داده شده ، کافیست متغیر مربوطه را به صورت Private تعریف کنید و بعد با استفاده از یک تابع public برای نوشتن (Set ) و یک تابع public برای خواندن (Get) استفاده کنید به این صورت :
class test
{
private:
int m_width;

public:
void set_width(int width)
{
if (width >=0 )
{
m_width=width;
}
else
{
throw new exception(//ANY)
}
}
int width()
{
return m_width;
}
};
با این راه کار ما مطمئن میشیم همیشه مقادیر مجاز در متغیر های ما نوشته میشه ، به این توابع که به کمک آنها به متغیر هامون دسترسی پیدا می کنیم میگیم Accessor، Accessor ها در زبان هایی مثل C#‎‎‎‎‎ بخشی از زبان شده اند و با بلاک های Set و Get این کار را انجام میدیم...
البته برای مثال بالا بهتره از نوع unsigned int بجای int استفاده کنیم...

ravaei
سه شنبه 25 فروردین 1394, 12:42 عصر
کپسوله سازی که شما مطرح کردید یک حالت عام هستش ، همونطور که گفتید تو #C برای این کار دستور ()get و ()set هستش ... تو ++c میتونیم به جای اینکه خودمون Error طراحی کنیم از دستور ()assert استفاده کنیم ... میتونیم کد بالا رو اینجوری تغییر بدیم :


#include "cassert"


private:


int m_width;

public:


int test::set_width(int width)
{
assert(width>=10);
m_width=width;


return m_width;
}

hosseinam1370
سه شنبه 25 فروردین 1394, 14:51 عصر
ممنون از دوستان که وقت میگزارید.

دوستان منظور از :: در دستور زیر چیه؟
Qt::WindowFlags f = 0



مگه دوتا دونقطه برای معرفی یه تابع برای یه کلاس نیست؟علاوه بر اون کاربردش کجا میتونه باشه؟!!

فکر کنم یجا خوندم برای تعیین حوزه هم هست.

البته منظور qt و windowFlags هم لطف کنید دیگه.

برای کنسول std::cout هم استفاده میکردیم ، ولی دقیقا کار این :: رو نفهمیدم که اینجا چیکار میکنه.


با تشکر.

hosseinam1370
سه شنبه 25 فروردین 1394, 17:08 عصر
یه لطف دیگه کنید و بگی منظور const در اینجا چیه !!


Qt::Alignment alignment() const

با تشکر.

ravaei
سه شنبه 25 فروردین 1394, 20:29 عصر
ممنون از دوستان که وقت میگزارید.

دوستان منظور از :: در دستور زیر چیه؟
Qt::WindowFlags f = 0



مگه دوتا دونقطه برای معرفی یه تابع برای یه کلاس نیست؟علاوه بر اون کاربردش کجا میتونه باشه؟!!

فکر کنم یجا خوندم برای تعیین حوزه هم هست.

البته منظور qt و windowFlags هم لطف کنید دیگه.

برای کنسول std::cout هم استفاده میکردیم ، ولی دقیقا کار این :: رو نفهمیدم که اینجا چیکار میکنه.


با تشکر.

اول به این توجه کن :


setWindowFlags(Qt::WindowStaysOnTopHint);


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


//.h

class test
{


public:
test();
int set_width(int width);


static int a ;
int b;


}


و این ...



#include <test.h>


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);


test::a;
test::b; //<--------- ERROR
}


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

خوب Qt یه کلاسه که اکثر خاصیت ها توش هست مثلا همین طور که میبینی مقدار window flag یه Qlabel رو میتونی از تو کلاس Qt گیرش بیاری (اولین خط کدی که نوشتم رو ببینید)

window flag هم یعنی عمقش (من میگم عمق میتونی برتریت اسمشو بزاری ) مثلا وقتی مینویسی :


setWindowFlags(Qt::WindowStaysOnTopHint);


یعنی این window که توش این کد نوشته شده همیشه top hint باشه یعنی هیچ چیزی روش نیاد ... حالا واسه Qlabel چیکار میکنه امتحان باید کرد من تاحالا بهش مقداری ندادم ...
اگه اشتباه نکنم واسه اینه که آبجکت دیگه ای روش نیاد مثل window ...

ravaei
سه شنبه 25 فروردین 1394, 20:38 عصر
یه لطف دیگه کنید و بگی منظور const در اینجا چیه !!


Qt::Alignment alignment() const

با تشکر.

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

به نظر من شما شروع به انجام یک پروژه کنید ، این قواعد به مرور زمان دستتون میاد .

hosseinam1370
سه شنبه 25 فروردین 1394, 21:57 عصر
ممنون دوسته عزیز.

کیوت خیلی توابع زیادی داره، نمیدونم از کجاش شروع کنم.

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

با تشکر.

hosseinam1370
چهارشنبه 26 فروردین 1394, 09:18 صبح
دوستان ، منظور از ستاره در اینجا چیه؟!! یعنی چطوری میشه ازش استفاده کرد؟ همون متغییر داینامیک هست؟
البته منظور از تابع buddy رو بگید ممنون میشم.

QWidget * buddy() const

با تشکر.

returnx
چهارشنبه 26 فروردین 1394, 11:38 صبح
ممنون از دوستان که وقت میگزارید.

دوستان منظور از :: در دستور زیر چیه؟
Qt::WindowFlags f = 0



مگه دوتا دونقطه برای معرفی یه تابع برای یه کلاس نیست؟علاوه بر اون کاربردش کجا میتونه باشه؟!!

فکر کنم یجا خوندم برای تعیین حوزه هم هست.

البته منظور qt و windowFlags هم لطف کنید دیگه.

برای کنسول std::cout هم استفاده میکردیم ، ولی دقیقا کار این :: رو نفهمیدم که اینجا چیکار میکنه.


با تشکر.

متاسفانه توضیحی که دوستمون در مورد متغیر های static دادن ربطی به این سوال نداشت ، نوع windowflags (مستندات (http://doc.qt.io/qt-5/qt.html#WindowType-enum)) در Qt به صورت Enum تعریف شده و طبق قواعد زبان C++‎‎‎‎‎‎‎‎‎‎‎‎ شما برای استفاده از یک مقدار Enum می بایست از :: استفاده کنید.
سوال هایی که میپرسید دقیقا در مورد قواعد زبان C++‎‎‎‎‎‎‎‎‎‎‎‎ هست و نه Qt ، برای همین بهتره شما سعی کنید با زبان C++‎‎‎‎‎‎‎‎‎‎‎‎ بیشتر آشنا شید تا بتونید خیلی راحت تر از فریم ورک Qt استفاده کنید.

کپسوله سازی که شما مطرح کردید یک حالت عام هستش ، همونطور که گفتید تو #C برای این کار دستور ()get و ()set هستش ...
متوجه منظورتون نشدم! ارتباطش با کپسوله سازی چی بود؟
تعریف کپسوله سازی از دیدگاه مهندسی نرم افزار : (ویکی پدیا)

کپسوله‌سازی (به انگلیسی (http://fa.wikipedia.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86_%D8%A7%D9%86%DA%AF%D9%84% DB%8C%D8%B3%DB%8C): Encapsulation) مخفی‌سازی، یا لفافه‌بندی، در علم رایانه (http://fa.wikipedia.org/wiki/%D8%B9%D9%84%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86% D9%87) مخفی سازی مکانیزم داخلی و ساختار داده‌های اجزای نرم‌افزار (http://fa.wikipedia.org/wiki/%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A 7%D8%B1) در پشت یک رابط کاربر (http://fa.wikipedia.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7_%DA%A9%D8%A7%D8%B1%D8%A8% D8%B1) است. بدین طریق کاربر یک نرم‌افزار (http://fa.wikipedia.org/wiki/%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A 7%D8%B1) فقط نیاز دارد که بداند آن قطعه نرم‌افزاری چه می‌کند و نمی‌تواند آنها را منوط به چگونگی اجرای آنها بکند.
عمل مخفی‌سازی باعث می‌شود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.


و در ادامه از دیدگاه شی گرایی :

مخفی‌سازی

مقالهٔ اصلی: کپسوله سازی (علم رایانه) (http://fa.wikipedia.org/wiki/%DA%A9%D9%BE%D8%B3%D9%88%D9%84%D9%87_%D8%B3%D8%A7% D8%B2%DB%8C_%28%D8%B9%D9%84%D9%85_%D8%B1%D8%A7%DB% 8C%D8%A7%D9%86%D9%87%29)
کپسوله سازی، مخفی‌سازی (Encapsulation)، یا لفافه‌بندی، به این مفهوم اشاره دارد که باید بعضی خصوصیات یا رفتارهای شیء را از دید دیگران پنهان کرد. فرض کنید شما به عنوان یک راننده می‌خواهید اتومبیل شخصی تان را روشن کنید و به محل کارتان عزیمت کنید سوییچ را بر می‌دارید، استارت می‌زنید و با فشار آوردن به پدال‌های گاز و ترمز و چرخش فرمان و ... به محل کارتان خواهید رسید. در طول این مسیر در اتومبیل شما به عنوان یک شیء اعمال مختلفی در حال انجام بود. مثلاً لنت ترمز (http://fa.wikipedia.org/wiki/%D9%84%D9%86%D8%AA_%D8%AA%D8%B1%D9%85%D8%B2) به دیسک چرخ برخورد می‌کرد و باعث کم شدن سرعت می‌شد یا شمع‌ها شروع به جرقه زدن در زمانی بخصوصی می‌کردند. حال فرض کنید که عمل مخفی سازی وجود نداشت و شما مجبور بودید که جرقه زدن شمعها را کنترل می‌کردید و به سیستم سوخت رسانی در موقع لزوم دستور می‌دادید که سوخت را بداخل سیلندرها ارسال کند و... یا هیچ‌گاه به مقصد نمی‌رسیدید! یا سالم نمی‌رسیدید!
عمل مخفی سازی باعث می‌شود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.


در واقع کپسوله سازی به این اشاره می کنه که شما به عنوان یک کاربر حال یک شی مثل موبایل و یا یک شی در برنامه نویسی مثل QPushButton نیاز نیست از جزئیات کار با خبر شید که چطور شی مورد نظر کار می کنه فقط کافیست یاد بگیرید از یک شی چطور استفاده کنید!

ravaei
چهارشنبه 26 فروردین 1394, 14:53 عصر
متاسفانه توضیحی که دوستمون در مورد متغیر های static دادن ربطی به این سوال نداشت ، نوع windowflags (مستندات (http://doc.qt.io/qt-5/qt.html#WindowType-enum)) در Qt به صورت Enum تعریف شده و طبق قواعد زبان C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ شما برای استفاده از یک مقدار Enum می بایست از :: استفاده کنید.
سوال هایی که میپرسید دقیقا در مورد قواعد زبان C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ هست و نه Qt ، برای همین بهتره شما سعی کنید با زبان C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ بیشتر آشنا شید تا بتونید خیلی راحت تر از فریم ورک Qt استفاده کنید.

متوجه منظورتون نشدم! ارتباطش با کپسوله سازی چی بود؟
تعریف کپسوله سازی از دیدگاه مهندسی نرم افزار : (ویکی پدیا)

و در ادامه از دیدگاه شی گرایی :

در واقع کپسوله سازی به این اشاره می کنه که شما به عنوان یک کاربر حال یک شی مثل موبایل و یا یک شی در برنامه نویسی مثل QPushButton نیاز نیست از جزئیات کار با خبر شید که چطور شی مورد نظر کار می کنه فقط کافیست یاد بگیرید از یک شی چطور استفاده کنید!


من نمیگم کپسوله سازی شما اشتباهه منظور من طریقه handle کردن ارور در حین کپسوله سازی هستش حالتیه که با یک شرط بازهء متغییر مورد نظرتون رو کنترل میکنید و بعد پیغامی به استفاده کننده از اون تابع میدید ...
++C دستوری به نام assert داره و اصولی اینه که از این دستور استفاده بشه .

توضیحی هم که من در رابطه با فیلد های static دادم یک حالتی برای استفاده کردن از :: در سی پلاس بود ، تو مثالی هم که زدم مشخصه .

موفق باشید.

returnx
چهارشنبه 26 فروردین 1394, 16:50 عصر
من نمیگم کپسوله سازی شما اشتباهه منظور من طریقه handle کردن ارور در حین کپسوله سازی هستش حالتیه که با یک شرط بازهء متغییر مورد نظرتون رو کنترل میکنید و بعد پیغامی به استفاده کننده از اون تابع میدید ...
++C دستوری به نام assert داره و اصولی اینه که از این دستور استفاده بشه .
بله ، من هم میدونم که C++‎‎‎‎‎‎ ماکرویی به اسم assert داره! assert برای هدفی دیگه ایجاد شده ، assert برای جلوگیری از خطاهای برنامه نویس ایجاد شده ، در حالی که هدف من اطلاع به برنامه نویس نبود...
از assert در زمان debugging استفاده میشه،نمیدونم ، این اصلی که میگید از کجا اومده!

Therefore, this macro is designed to capture programming errors, not user or run-time errors, since it is generally disabled after a program exits its debugging phase.