This forum has been archived. All content is frozen. Please use KDE Discuss instead.

نوشتن برنامه های qt

Tags: None
(comma "," separated)
User avatar
Hosein-mec
Posts
82
Karma
0
تاپیک خیلی خوبیه. لطفا ادامه بدید ...  :D


Image
User avatar
pesarkhobeee
Posts
22
Karma
0
من داشتم در مرحله بعدی یک lable به برنامم اضافه میکردم و قصد اینو داشتم که بعدش یک دکمه هم اضافه کنم که با اجرای کدهای زیر دیدم
پنجره اصلی من جدا اجرا میشه و lable من هم جدا!
حالا سوال اینجاس چه طوری به کیوت بفهمونم که این lable توی پنجره اصلیمه ؟


Code: Select all

#include <QApplication>
#include <QDesktopWidget>
#include <QWidget>
#include <QIcon>
#include "QLabel"

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

  int WIDTH = 250;
  int HEIGHT = 150;

  int screenWidth;
  int screenHeight;

  int x, y;

  QApplication app(argc, argv);

  QWidget window;

  QDesktopWidget *desktop = QApplication::desktop();

  screenWidth = desktop->width();
  screenHeight = desktop->height();

  x = (screenWidth - WIDTH) / 2;
  y = (screenHeight - HEIGHT) / 2;

  window.resize(WIDTH, HEIGHT);
  window.move( x, y );
  window.setWindowTitle("Center");
  window.setToolTip("Center window");
  window.setWindowIcon(QIcon("icon.jpg"));

   QLabel *label = new QLabel ("Hello World!");
   label->show();

  window.show();

  return app.exec();
}


User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
[quote=&quot;pesarkhobeee&quot;]
من داشتم در مرحله بعدی یک lable به برنامم اضافه میکردم و قصد اینو داشتم که بعدش یک دکمه هم اضافه کنم که با اجرای کدهای زیر دیدم
پنجره اصلی من جدا اجرا میشه و lable من هم جدا!
حالا سوال اینجاس چه طوری به کیوت بفهمونم که این lable توی پنجره اصلیمه ؟


Code: Select all

#include <QApplication>
#include <QDesktopWidget>
#include <QWidget>
#include <QIcon>
#include "QLabel"

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

  int WIDTH = 250;
  int HEIGHT = 150;

  int screenWidth;
  int screenHeight;

  int x, y;

  QApplication app(argc, argv);

  QWidget window;

  QDesktopWidget *desktop = QApplication::desktop();

  screenWidth = desktop->width();
  screenHeight = desktop->height();

  x = (screenWidth - WIDTH) / 2;
  y = (screenHeight - HEIGHT) / 2;

  window.resize(WIDTH, HEIGHT);
  window.move( x, y );
  window.setWindowTitle("Center");
  window.setToolTip("Center window");
  window.setWindowIcon(QIcon("icon.jpg"));

   QLabel *label = new QLabel ("Hello World!");
   label->show();

  window.show();

  return app.exec();
}




[/quote]
parent اون label رو همون پنجره‌ی مورد نظر بزار!
اینطوری:
Code: Select all
QLabel *label = new QLabel ("Hello World!", window);


بعد اینکه برای تنظیم کردن اینا روی پنجره‌ی اصلی باید از QLayout و کلاسهای مربوطه استفاده کنی!

یک نکته‌ی مهم توی برنامه‌نویسی Qt:
همونطور که می‌دونی C++ سیستم garbage collector ی که توی JAVA هست، و همه‌ی آبجکتها و حافظه ها رو توی خروج برنامه حذف می‌کنه نداره! و شما خودت باید اینکار رو بکنی!
اما Qt این کار رو میکنه! در صورتی که همه‌ی اجزای برنامه‌ات یک کلاس از نوع QObject باشه (یعنی از این ارث برده باشه) و parentش رو طوری تنظیم کنی، که والد اصلی همه یه QMainWindow باشه!

پس یادت نره که اجزایی که میریزی توی صفحه مثل همین برچسب رو بچه‌ی ایشون یا یکی دیگه کنی که آخر کار حذف بشه ;)


Choqok developer
zarei
Registered Member
Posts
17
Karma
0
OS
موقع کامپایل برنامه خطای زیر را می دهد:
window.cpp:7: error: aggregate ‘QWidget window’ has incomplete type and cannot be defined

من از همان کدهایی که قرار داده بودید استفاده کرده ام.
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
[quote=&quot;zarei&quot;]
موقع کامپایل برنامه خطای زیر را می دهد:
window.cpp:7: error: aggregate ‘QWidget window’ has incomplete type and cannot be defined

من از همان کدهایی که قرار داده بودید استفاده کرده ام.
[/quote]
احیانا چطوری اونا رو کامپایل کردین!؟ با QMake؟!
چون اینجا به نظر می‌رسه که هدرفایلهای Qt رو پیدا نکرده! و این یعنی یا توی دستور مربوطه (دستور g++) آدرس داده نشده، یا اینکه اونجا نیستن، یا اینکه نصب نیستن یا اینکه D:


Choqok developer
User avatar
pesarkhobeee
Posts
22
Karma
0
متاسفانه کاری رو که شما فرمودین انجام دادم تو کامپایل به مشکل خوردم!

qt4.cpp: In function ‘int main(int, char**)’:                                                                               
qt4.cpp:36: error: no matching function for call to ‘QLabel::QLabel(const char [13], QWidget&)’                             
/usr/include/qt4/QtGui/qlabel.h:158: note: candidates are: QLabel::QLabel(const QLabel&)                                   
/usr/include/qt4/QtGui/qlabel.h:71: note:                QLabel::QLabel(const QString&, QWidget*, Qt::WindowFlags)
/usr/include/qt4/QtGui/qlabel.h:70: note:                QLabel::QLabel(QWidget*, Qt::WindowFlags)
qt4.cpp:36: warning: unused variable ‘label’
make: *** [qt4.o] Error 1




تو یه مثالی هم دیدم به جای window  از this استفاده کرده بود اونم امتحان کردن بازم ارور داد! :'(
User avatar
pesarkhobeee
Posts
22
Karma
0

یافتم!

Mon Aug 17, 2009 5:55 pm
جواب مشکل پیدا شد البته با کمک دوست خوبم اقای اطهری  
 ;D
کافیه موقع ارجاع قبل از window از & استفاده کنیم
اونم بخاطر این بود که ورودی مشخص کننده والد باید ادرس حافظه باشه نه خود متغیر که از مباحث مربوط به اشاره گر هاست!
هر چه قدر در برنامه نویسی بیشتر پیش میرم به خیانتی که تو دانشگاهها میشه بیشتر پی میبرم :'( واقعا ماها مسلمونیم؟
بماند
موردی هم که گفتم درش از this استفاده کرده بودن جایی بود که کلاس تعریف شده بود و در مثال من اصلا کلا بی معنیه!
بی سوادی دیگه به بزرگی خودتون ببخشین ???

Last edited by Anonymous on Mon Aug 17, 2009 11:44 pm, edited 1 time in total.
User avatar
pesarkhobeee
Posts
22
Karma
0

اموزش Qt قسمت چهارم

Wed Aug 19, 2009 8:50 pm
خوب به لطف خدا پس از برخورد با چند تا مشکل وحل اونها قسمت چهارم اموزش هم اماده شد.
توجه : قبل از خوندن مقاله زیر به این نکته اشاره میکنم که این نوشته ها برداشت های شخصی خودم هست و ممکن هست از نظر فنی توضیحاتم درست نباشه!
در این قسمت ما برناممون رو که تا قسمت قبل پنجرشو ساختیم و تنظیمش کردیم کاملتر میکنیم و بهش یه سری کنترل اضافه میکنیم و بعد اون کنترل ها رو در لایه میزایم تا نظمشون حفظ شه!


اما سوال اول اینه که کنترل چیه؟
کنترل ها اجزای قابل تعریف برای استفاده در برنامه های گرافیکی هستند به تعبیر ساده تر اجزایی که ما در برنامه هامون میبینیم مثل دکمه ها و منو ها و … کنترل محسوب میشه!
یکی از خوبی های کیوت هم داشتن تعداد وسیعی از کنترل هاست که به راحتی با ترکیب این کنترل ها میتونیم برناممون رو بسازیم .
نکته : در دنیای کیوت به کنترل ، widget (ابزارک) میگن!
ما در این برنامه از دو نوع کنترل یکی برچسب یا Label و دومی دکمه یا Button استفاده میکنیم.
خوب مثل هر چیز دیگه ای برای استفاده از اینها باید اول کتابخانه مربوطشون رو در برنامه درج کنیم.

Code: Select all
#include <QLabel>
#include <QPushButton>


و اما برای تعریفشون در برنامه از خط های زیر استفاده میکنیم:

Code: Select all
QLabel *label = new QLabel (”Hello World!”,&window);
QPushButton *button = new QPushButton(”Enter”, &window);


خوب در خط اول ما کنتری به نام label را از روی کلاس Qlabel میسازیم و مقداری رو که قراره نمایش بده رو Hello World تعریف میکنیم.
در خط دوم هم یک دکمه از روی کلاس QpushButton میسازیم و مقداری که نمایش میده رو تنظیم میکنیم.
در تعریف هر دوی این کنترل ها ما دو ارگومان دادیم که در دومین ارگومان &window ما مشخص میکنیم والد این کنترل کدام پنجرس؟
اگر این را مشخص نکنیم کنترل های ما در پنجرمان نشان داده نمیشوند.
خوب حالا بیایید برنامه قبلی رو با اضافه کردن دستورات فوق تکمیل کنیم.

Image

خوب همونطور که میبینید کنترل های ما با موفقیت ایجاد شدن ولی روی هم افتادن!
برای مدیریت کنترل ها در صفحه پنجرمان کیوت کنترلی در اختیار ما گزاشته به نام Qlayout که میتونید اطلاعات کاملی از این کنترل در این صفحه بدست بیاورید.
http://doc.trolltech.com/4.4/layout.html
اما اگه بخوام توضیح بدم Qlayout یک راه ساده و قوی را برای مرتب کردن خودکار کنترل ها فراهم میکنه!
Qlayout به صورت پیش فرض به سه صورت میتونه کنترل ها رو کنار هم مرتب کنه به صورت عموی و یا افقی و یا ترکیبی از هر دو که در اصلاح شبکه ای میگن در زیر شکلهایی از هر سه روش میارم:

لایه افقی که توسط کلاس QHBoxLayout تغریف میشود:

Image

لایه عمودی که توسط کلاس QVBoxLayout تغریف میشود:

Image

لایه شبکه ای که توسط کلاس QGridLayout تغریف میشود:

Image

خوب حالا ما این قصد رو داریم تا برای مدیریت کنترلها از لایه افقی استفاده کنیم برای این کار اول باید کتابخونه مورد نیازو در برنامه درج کنیم:

Code: Select all
#include <QLayout>


و بعد برای تعریف لایه افقی و ستون های لایه افقی و قرار دادن کنترلها در این ستون ها از دستورات زیر استفاده میکنیم:

Code: Select all
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(button);
window.setLayout(layout);


خوب ما در خط اول یک اشاره گر از نوع QHBoxLayout تعریف کردیم و بعد در خط دوم گفتیم در ستون اول اون کنترل label مون رو قرار بده و در خط بعدی گفتیم که در ستون دوم button رو قرار بده و سپس این لایه ساخته شده رو در خط چهارم به پنجرمون اعمال کردیم که نتیجش :

Image

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

Code: Select all
#include <QApplication>
#include <QDesktopWidget>
#include <QWidget>
#include <QIcon>
#include <QLabel>
#include <QPushButton>
#include <QLayout>
int main(int argc, char *argv[])
{
int WIDTH = 250;
int HEIGHT = 150;
int screenWidth;
int screenHeight;
int x, y;
QApplication app(argc, argv);
QWidget window;
QDesktopWidget *desktop = QApplication::desktop();
screenWidth = desktop->width();
screenHeight = desktop->height();
x = (screenWidth – WIDTH) / 2;
y = (screenHeight – HEIGHT) / 2;
window.resize(WIDTH, HEIGHT);
window.move( x, y );
window.setWindowTitle(”Center”);
window.setToolTip(”Center window”);
window.setWindowIcon(QIcon(”icon.jpg”));
QLabel *label = new QLabel (”Hello World!”,&window);
QPushButton *button = new QPushButton(”Enter”, &window);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(button);
window.setLayout(layout);
window.show();
return app.exec();
}


و اما برای تمرین پشنهاد میکنم با کمک این سایت:
http://zetcode.com/tutorials/qt4tutorial/widgets/
کنترل های مختلف کیوت رو به برنامتون اضافه کنیدو لذت ببرید و در ادامه روشهای مختلف layout رو هم امتحان کنید.
علی یارتون

Last edited by pesarkhobeee on Wed Aug 19, 2009 8:54 pm, edited 1 time in total.
User avatar
pesarkhobeee
Posts
22
Karma
0
متاسفانه تلاش های این چند روز من برای اعمال مکانیزم  signal و slot به برنامم شکست خورده! :-[
Qt Creator خیلی راحت میتونه این کارو کنه ولی من این چند روز هر چی سعی کردم دستی این کارو کنم شکست خوردم خواهش میکنم اگه مقدوره کمی توضیح بدین و اگه شد کدی به مثال من اضافه کنید که با کلیک شدن دکمه متن label عوض شه! ;)
رفرنسایی که در این ازمایشات استفاده کردم اینان:
http://doc.qtsoftware.com/4.5/signalsandslots.html
http://zetcode.com/tutorials/qt4tutoria ... andsignals
User avatar
Yousha
Posts
4
Karma
0
سلام دوستان

وقتی من دستور qmake رو می زنم میگه bash: qmake: command not found
فک کنم میگه نصب نیست و تو مخازن هم نبود
من OpenSUSE 11.1 استفاده می کنم
دوستان راهنمایی کنن ممنون میشم‌:)
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
[quote=&quot;pesarkhobeee&quot;]
متاسفانه تلاش های این چند روز من برای اعمال مکانیزم  signal و slot به برنامم شکست خورده! :-[
Qt Creator خیلی راحت میتونه این کارو کنه ولی من این چند روز هر چی سعی کردم دستی این کارو کنم شکست خوردم خواهش میکنم اگه مقدوره کمی توضیح بدین و اگه شد کدی به مثال من اضافه کنید که با کلیک شدن دکمه متن label عوض شه! ;)
رفرنسایی که در این ازمایشات استفاده کردم اینان:
http://doc.qtsoftware.com/4.5/signalsandslots.html
http://zetcode.com/tutorials/qt4tutoria ... andsignals
[/quote]
خوب، دیگه کم کم بهتره برای خوشکل شدن کار، و راحت تر شدن بعضی کارا مثل همین، پروژه رو توی چند فایل پخش کنی! و همه چیز رو توی main() انجام ندی ;)

اول اینکه تابع connect که برای اینکار استفاده می‌شه یکی از توابع QObject است! و این یعنی که اینجا نمی‌تونی توی main بنویسی:
Code: Select all
connect(button, SIGNAL(clicked()), ....)

البته می‌تونی استفاده کنی! به شیوه‌های دیگه! اما نمی‌تونی خودت یک slot تعریف کنی، و در واقع دستت باز نیست!

خوب چه کنیم!؟

یک کلاس تعریف می‌کنی با نام مثلا MainWindow و این از QMainWindow مشتق می‌شه! و حالا بجای تعریف آبجکت از QMainWindow توی main از کلاس خودمون استفاده می‌کنیم!

خوب توی کلاس چیکار کنیم!؟
اول باید یک slot تعریف کنی، و بعد با دستور connect که حالا داخل کلاس MainWindow می‌تونی فراخوانی کنی چون یک ساب کلاس از QObject است! سیگنال clicked از button رو وصل می‌کنی به اون slot تعریف شده! و توی slot هرکاری دوست داشتی می‌کنی، از جمله عوض کردن متن label!

من کلیت کار رو گفتم! که خودت بری دنبالش و اینا رو یاد بگیری!
tutorialهای اولیه‌ی Qt از این چیزا دارن که گفتم!
یه سر هم به مستندات کلاس QObject و دستور connect هم بزنی بد نیست!


Choqok developer
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
پیشنهاد میکنم یک پروژه روی یک سرور کنترل سورس مثل Gitorious تعریف کنی! http://gitorious.org/
بعدش هم کسایی که میخوان روی کد تغییرات بدن، رو به پروژه اضافه کنی!
تا بتونیم اونجا روی کد تغییرات بدیم! اینطوری نمیشه من روی کد تو تغییرات بدم!‌چون چیزی نیست D:


البته این ایده یه بدبختی تازه هم برات داره، اونم کار کردن با git یا svn هست =))

میتونیم از یه pastebin هم استفاده کنیم البته!


Choqok developer
User avatar
pesarkhobeee
Posts
22
Karma
0

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

Wed Aug 26, 2009 3:19 pm
بعد از یه مدت طولانی تونستم قسمت بعدی اموزشو اماده کنم !
علت اون هم دو چیزه :
یکی در گیر بودن در طراحی چند سایت
و دیگری که مهمترشه اینه که پروژه به جایی رسید که اگه پیش نیازشو رعایت نمیکردیم به مشکل میخوردیم
پیش نیاز کار با Qt هم اشنایی نسبتا خوب به مباحثی هم چون اشاره گر ها و مهم تر از اون مبحث شییء گرایی هست که متاسفانه من در هر دوی این موارد تازه کار بحساب میام و در دانشگاهمون هم هیچ کدوم از موارد فوق رو یاد ندادن ! (اینجاس که میفهمی کم فروشی فقط برای بقال سر کوچه نیس!)
خوب اگه شما مثل من هستین دو پیشنهاد دارم :
اگه میتونید کتاب اموزش سی پلاس پلاس detail رو تهیه کنید که گر چه زبان اصله ، ولی مثل تمام کتابهای detail کامله کامله و استاد من در Qt جناب mtux هم این رو پیشنهاد میکنند.
و یا اگه مثل من فعلا امکانشو ندارین و کارت اینترنتتونم تموم شده ! کتاب درس و کنکور سریع سی پلاس پلاس اقای مقسمی از انتشارات گسترش علوم پایه رو توسیه میکنم چون تا حد امکان فشرده و در عین حال جامع هست!(خیلی باهاش حال کردم)

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



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

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

main.cpp



Code: Select all



#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();
}





خوب اولین کد :


Code: Select all


#include <QtGui>





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


Code: Select all


#include "hello.h"





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


Code: Select all



   hello *Hello = new hello;





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


Code: Select all



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





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

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

hello.h



Code: Select all


#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 توسط : بود.
بعد از تعریف توابع و اشیاء عمومی و خصوصی اون رو مشخص کردیم!تنها چیزی در این تعاریف لازم میدونم توضیح بدم ارگومان تابع زیر هست:


Code: Select all


hello(QWidget *parent = 0);





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

اما شاید سوال براتون پیش امده باشه این  Qwidget که اینهمه ازش استفاده کردیم اصلا چی هست؟
کلاس  Qwidget کلاس پایه برای تمام اشیای رابط کاربریمونه!برای اشنایی بیشتر با این کلاس  و همچنین توابع و سایر خصوصیاتش به لینک زیر مراجعه بفرمایید:
http://doc.trolltech.com/4.5/qwidget.html

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


Code: Select all


#ifndef hello_h





تا اونجایی که من با سواد ناقصم فهمیدم این شرط چک میکنه که ایا برای بار اوله که سرایندمون در برنامه استفاده میشه یا نه اگه برای بار اول باشه هر چیزی بین این
ifndef = if not define
بود اجرا میشه وگر نه که از تکرار جلوگیری میکنه برای اشنایی بیشتر به لینک زیر مراجعه کنید:
http://www.cprogramming.com/reference/p ... fndef.html


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

hello.cpp



Code: Select all


#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



Code: Select all


SOURCES = hello.cpp \
main.cpp


HEADERS = hello.h





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


Code: Select all


qmake hello.pro
make





و برای اجراش هم :


Code: Select all


./hello





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

همین جا لازم میدونم باز هم از کسی که بنده رو راهنمایی میکنه یعنی جناب mtux تشکر کنم و در اخر نظر شما رو به اخرین لینکی که ایشون در مورد یه برنامه نویس شدن برام فرستادن جلب میکنم:
http://samizdat.mines.edu//howto/HowToB ... ammer.html

علی یارتون
User avatar
pesarkhobeee
Posts
22
Karma
0
من دو تا سوال دارم اما قبلش لازم میدونم یه اشتباه تو توضیحات قسمت قبل یعنی قسمت پنجم رو تصحیح کنم. در توضیح کد:

Code: Select all
#ifndef hello_h


اشتباه کردم  ! در حقیقت کار این کد اینه که ببینه قبلا کلاسی با نام مثلا hello ایجاد شده یا نه! اگه ایجاد نشده بود اجازه ی ایجاد کلاسو میده!
خوب برم سر وقت سوالام:
سوال اولم اینه که وقتی به یه label مقدار فارسی میدم نlabel نمیتونی فارسی رو نشون بدم ! برای مقدار فارسی دادن ایا باید کار خاصی کنم؟
دومین مشکل اینه که وقتی با Qt creator برنامه میسازم برای چند بار اول تو کدهاش این کتابخونه رو که خودش میسازه نمیشناسه!

Code: Select all
#include "ui_filename.h"


و تا وقتی اینو نشناخته امکان اتوکامپلت کدهای مربوط به GUI رو ندارم! نظری راجع به این مشکل دارم تا از چند بار بستن پروژه خلاص شم؟ :-[
User avatar
momeny
Registered Member
Posts
56
Karma
2
OS
در مورد #ifndef hello_h باید گفت که این دستور چک می‌کنه که چیزی بنام hello_h قبلا توسط دستور #define hello_h تعریف شده یا نه!
که این خودش دلیلش اینه که وقتی یک هدر فایل مثلا hello.h رو توی دوتا فایل دیگه include میکنیم، که یکی از اون دو تا توی اون یکی include شده! توی دومی، دوبار hello.h وارد شده! و اگر این چک کردن رو حذف کنیم، باعث می‌شه که کلاس hello دوبار تعریف بشه، و کامپایلر خطا بده! (یه بار تست کن، شاید بهتر متوجه بشی ;) ) و در کل این ربطی به اسم کلاس نداره ;)

در مورد فارسی:
از این دستور استفاده کن:
Code: Select all
QString::fromUtf8("متن فارسی")


در مورد فایل ui هم:
برنامه‌ای داریم به نام uic که کارش تولید این هدر فایل (ui_filename.h) از فایل uiای که بوسیله‌ی Qt Designer تولید کردیم است! یعنی همون فایل filename.ui که فرمتش xml هست!
اولین باری که این uic اجرا بشه و هدر فایل رو تولید کنه، اون در دسترس شما و Creator قرار میگیره ;)


Choqok developer


Bookmarks



Who is online

Registered users: bartoloni, Bing [Bot], Google [Bot], Sogou [Bot], Yahoo [Bot]