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

QMainWindow قسمت چهارم

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

خوب تا این جا رفتیم که برای افزودن منو و تولبار به main window با مفهومی به نام action روبرو هستیم . جلسه قبلی با مفهومش آشنا شدیم حالا بریم سراغ کاربردش.

ایجا منو در یک QMainWindow
برای ایجاد منو بار در کیوتی چندین کلاس درگیر خواهندشد . QMenuBar , QMenu, QAction . هر QMainWindow یی یه QMenuBar فعال داره که این QMenuBar شامل چندین QMenu میشه و هر QMenu شامل چندین QAction . پس QMenuBar حاوی تمامی منوهای یک اپلیکیشن خواهد بود و هر QMenu حاوی چندین Action . 
به صورت پیش فرض هر QMainWindow حاوی یه QMenuBar هستش که از طریق تابع menuBar() شما میتونید به اشاره گری از اون دسترسی پیدا کنید . وقتی که شما به یه QMenuBar دسترسی دارین با استفاده از تابع addMenu عضو کلاس QMenuBar میتونید به این منوبار یه منو اضافه کنید . فرض کنید فایل QNotePad.cpp ما به صورت زیر باشه
کد:
QNotePad::QNotePad() { .... createMenus(); } void QNotePad::createMenus() { QMenu *fileMenu = menuBar()->addMenu("File"); m_newFileAction = fileMenu->addAction("New"); m_openFileAction = fileMenu->addAction("Open"); m_saveFileAction = fileMenu->addAction("Save"); m_exitAction = fileMenu->addAction("Exit"); }
و فایل QNotePad.h به صورت زیر

کد:
#include <QMainWindow> class QPlainTextEdit; class QAction; class QNotePad : public QMainWindow { public: QNotePad(); private: QPlainTextEdit *m_plainTextEdit; QAction *m_newFileAction; QAction *m_openFileAction; QAction *m_saveFileAction; QAction *m_exitAction; void createMenus(); }; #endif // QNOTEPAD_H
بخش های غیر ضروری حذف شدند . راه های مختلفی برای انجام این کاری که من انجام دادم هست که در آخر نتیجه یکی خواهد بود. خوب توی فایل .h من چهار تا اشاره گر به QAction ساختم . این اکشن ها همون طور که گفتم وظیفه انجام کاری رو دارند که ممکنه از چندین راه ، درخواستی برای انجام وظیفه شون براشون صادر بشه. مثلا اولی برای ایجاد یه سند خالی هستش که ممکنه از طریق های زیر صدا زده بشه
۱.ازطریق منوی فایل
۲.ازطریق Ctrl+N
۳.ازطریق تولبار
چون قصد داریم این اکشن ها بعدا در تابعی که ذکر خواهدشد به تولبار هم اضافه بشند اونارو به صورت عضو کلاس تعریف 
کردیم . و حالا تابع createMenus که تابع عضو کلاس QNotePad هست که من خودم برای ساختن منو ها استفاده کردم.

کد:
void QNotePad::createMenus() { QMenu *fileMenu = menuBar()->addMenu("File"); m_newFileAction = fileMenu->addAction("New"); m_openFileAction = fileMenu->addAction("Open"); m_saveFileAction = fileMenu->addAction("Save"); m_exitAction = fileMenu->addAction("Exit"); }
خوب همونطور که گفتم تابع menuBar عضو کلاس QMainWindow اشاره گری به منوبار جاری برمیگردونه . و با استفاده از تابع addMenu عضو کلاس QMenuBar ما یه منو به منوبارمون اضافه میکنیم. پارامتر ارسالی به تابع نام منو رو تعیین میکنه . پارامتر های دیگه ای هم میشه ارسال کرد که فعلا مورد بحث ما نیست.این تابع اشاره گری به منوی ایجاد شده بر میگردونه که ما اونو توی fileMenu نگهش میداریم . 
حال با استفاده از تابع addAction عضو کلاس QMenu به منوی فایل مون اکشن های دلخواهمون رو اضافه میکنیم. باز هم همون شیوه افزودن منو اینجا تکرار شده . یعنی با استفاده از تابع addAction ما به منوی فایلمون یه اکشن اضافه میکنیمو اشاره گرش رو نگه میداریم ( بعدا از این اشاره گر استفاده خواهیم کرد ) . حالا کافیه که با ctrl+r پروژه تون رو ( اگه تو creator هستید در غیر این صورت با توجه به ide ) اجرا کنید تا نتیجه رو ببینید . البته فراموش نکنید که فایل QNotePad.pro شما حاوی خط زیر باشه .

کد:
QT+= gui core
این خط کتابخانه اصلی کیوتی و کتابخانه gui رو به پروژه تون اضافه میکنه . اینکه ساختار و کاربرد فایل .pro چیه بعدا بیشتر باهم بحث میکنیم .

سعی کنید خودتون منو ها و اکشن های دیگه ای به منوبار اضافه کنید.
شاید سوالات زیادی براتون پیش اومده که مثلا چه طوری یه short key به اکشن نسبت بدم یا چطوری یه اکشن آیکن داشته باشه که همه این ها در آینده بحث خواهد شد ان شا الله



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

QMainWindow قسمت سوم

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

سلام خدمت دوستان عزیز
خوب با مقدمات QMainWindow آشنا شدیم . برای اینکه main window ما دارای منوبار ، تولبار و ... باشه دو راه داریم . یکی استفاده از Qt Designer هستش و دیگری کد نویسی و خوب به طبع کسی که دومی رو بدونه دیگه اولی براش کاری نداره . ما در ادامه قصد داریم با هم ، مرحله به مرحله ، یه ویرایشگر متن خیلی ساده بنویسیم تا از این طریق با قسمت های مختلف یه main window آشنا بشیم .
خوب من یه empty project ساختم (File - > New File Or Project -> Other Project -> Qt empty projet ) به نام QNotePad و بعدش یه فایل main.cpp و یه کلاس QNotePad که از QMainWindow ارث برده بهش اضافه 
کردم.
کد QNotePad.h به صورت زیر خواهد بود

کد:
#ifndef QNOTEPAD_H #define QNOTEPAD_H #include <QMainWindow> class QPlainTextEdit; class QNotePad : public QMainWindow { public: QNotePad(); private: QPlainTextEdit *m_plainTextEdit; }; #endif // QNOTEPAD_H
برای کار با متن های یه خطی از QLineEdit استفاده میکنیم . ولی اگه متن چند خطی شد باید از QTextEdit استفاده بشه . نکته ای که هست اینه که QTextEdit توانایی پذیرش متن های فرمت شده رو داره . یعنی چی یعنی متنی که یه جاش blod شده یا مثلا متنی که رنگ یه جاش با بقیه فرق میکنه . و حتی جالبتر این که شما میتونید یه متنی که با html فرمت شده رو به QTextEdit بدین . اما چون ما میخوایم خیلی ساده کار کنیم از QPlainTextEdit استفاده کردیم که فقط متن های ساده قبول میکنه.

فایل QNotePad.cpp من هم به صورت زیر خواهد بود.
کد:
#include "QNotePad.h" #include <QPlainTextEdit> QNotePad::QNotePad() { setWindowTitle(tr("QNotePad")); m_plainTextEdit = new QPlainTextEdit; setCentralWidget(m_plainTextEdit); }
که مثل مثال قبلیه . فقط من QPlainTextEdit رو به صورت اشاره گری عضو کلاس تعریف کردم تا اگه جای دیگه ای در کلاس بهش نیاز داشتم مشکلی نداشته باشم.( البته از تابع centralWidget هم میشد استفاده کرد!)
خوب تا اینجا که مثل قبل بود ولی خوب ما قصد داریم به این برنامه چندین منو و تولبار و status bar اضافه کنیم که به مرور با هم این کارو انجام میدیم.
فقط من یه پیش زمینه ای بگم و کار رو از جلسه بعدی آغاز میکنیم.
در برنامه نویسی و ایجاد یه main window یه چیزی زیاد به گوش میخوره ( منظورم در کیوتی هستش ) که QAction نام داره . QAction چیه ؟ یه مثال شما وقتی میخواید تلویزیون رو روشن کنید دو تا راه دارید یا از remote control استفاده کنید یا به صورت مستقیم با دکمه ای که روی خود تلویزیون هست. هر دوی اینا یه کارو انجام میدن اونم تلویزیون رو روشن میکنند . حالا در مورد خاموش کردن هم همین طور با این تفاوت که یه راه دیگه هم هست که دوشاخو رو از پریز در بیاریم  یا فیوز رو قطع کنیم  . باز هم همه اینها یه کار رو انجام میدند ، تلویزیون رو خاموش میکنند . توی کیوتی نگاه کنید حالا :‌من میخوام یه فایل متنی رو درون این ویرایش گرم باز کنم چند تا راه دارم : یکی اینکه از منوی فایل گزینه open رو بزنم ، یا اگه توی تولبار ایکنش هست ،‌ایکنش رو بزنم ،‌یا از ctrl+o استفاده کنم . باز هم همه اینها یک کار میکنه . به این یک کار توی کیوتی میگند Action . شما یه Action تعریف میکنید ( مثلا اکشن باز کردن یه فایل )‌و بعد جاهای مختلف ازش استفاده میکنید مثلا توی منو یا تولبار .پس اساس تعریف منو و تولبار در کیوتی QAction هست که بعدا باهاش بیشتر اشنا میشیم.

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

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

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 ها بچینید و بعد اون ویدجت رو به عنوان ویدجت 
مرکزی انتخاب کنید
فعلا


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

QMainWindow قسمت اول

نویسنده :سعید دادخواه
تاریخ:چهارشنبه 29 دی 1389-10:44 ب.ظ

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

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

QMainWindow چیست ؟

هر گاه شما قصد داشته باشید که یک برنامه کامل رو طراحی کنید ، هر گاه شما نیاز داشته باشید که برنامه تون شکل استانداردی داشته باشه ، هر گاه برنامه تون نیاز به منو بار و یا تولبار و یا statusbar داره ، در واقع و در اصل شما نیاز به یه main window پیدا کردین . پس main window کامل ترین نوع یک فرم در کیوتی هستش یعنی فرمی که میتونه منوبار و تولبار و ... رو داشته باشه . این ویژگی در QWidget و QDialog وجود نداره . در شکل زیر یه MainWindow رو میبینید.

#include <QApplication>
#include <QMainWindow>
#include <QLabel>
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QMainWindow mainWindow;
  QLabel *label =new QLabel("<center>Central Widget</center>");
  mainWindow.setCentralWidget(label);
  mainWindow.show();
  return a.exec();
}

این یه مثال ساده از QMainWinow هست .

توجه کنید که QLabel توانایی پردازش تگ های html رو داره . یعنی شما میتونید یه متن فرمت شده با html رو توی یه Label نمایش بدین و نکته دیگه تابع setCentralWidget هستش . هر QMainWindow میتونه یه ویدجت مرکزی داشته باشه که در واقع قسمت اصلی یه برنامه است و در کل QMainWindow پخش میشه . مثلا توی برنامه نقاشی ویدجت مرکزی میتونه یه بوم برای نقاشی باشه.

گفتن این نکته خالی از لطف نیست که برنامه های بزرگ معمولا از QMainWindow ارث برده و بنا به نیاز خودشون به اون ویژگی هایی اضافه میکنند که در قسمت های بعدی به اون اشاره میکنیم.

خسته نباشید




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

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

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

سلام امروز به مقاله ای برخورد کردم که برام بسیار جالب بود گفتم برای شما هم شاید جالب باشه .

آندروید چیست ؟

آندروید سیستم عاملی برای موبایل هست که در ابتدا توسط شرکتی با همین نام گسترش داده شد و در سال 2005 توسط گوگل خریداری شد . آندروید بر اساس نسخه ای تغییر یافته از کرنل لینوکس گسترش یافته است

اطلاعات بیشتر در ویکی پدیا

 

برنامه نویسی با استفاده از کیوتی برای موبایل هایی که قاعدتا توسط نوکیا تولید شده بسیار لذت بخشه ، این لذت بیشتر خواهد شد وقتی که بدونید برنامه نویسی برای آندروید توسط کیوتی و در واقع ساپرت آندروید توسط کیوتی هم در راهه0 یعنی شما در آینده ای نزدیک میتونید به راحتی برنامه ها تونو که با کیوتی نوشتید با آندروید اجرا کنید.

تصویر مردی که میبینید تصویر Bogdan Vatra است

 که در واقع مغز متفکر و عامل اصلی این انتقال خواهد بود.بهتره با هاش یه مصاحبه داشته باشیم

 

 سوال )چه انگیزه و عاملی باعث شد که شما به فکر این کار بیفتید؟

جواب من عاشق کیوتی هستم و عاشق آندروید ، انگیزه از این بالاتر میخواهید ؟نوکیا پروژه ای به نام LightHouse رو آغاز کرده که این انتقال رو خیلی راحت میکنه...

 

سوال ) شرمنده بابت این سوال احمقانه ولی LightHouse چیه ؟

جواب ) LightHouse  پروژه ای هست که انتقال کیوتی رو آسون میکنه . نکته ای که هست اینه که شما فقط نیازه که یه پلاگین برای انتقال محتویاتتون بر روی صحفه دستگاه درست کنید .

 

سوال ) آیا انتقال شما به صورت کامل انجام شده ؟

من هنوز opengl و بسیاری از توابع مالتی مدیا رو انتقال ندادم . در حال حاضر هم هنوز on-screen keyboard  پشتیبانی نمیشه

 

سوال ) به عنوان یه توسعه دهنده من باید چکار کنم تا بتونم آندروید رو هم پشتیبانی کنم ؟

فایل های انتقال منو دانلود کنید و کامپایل کنید . اما شما هنوز نمیتونید نتیجه کار رو تولید ( release ) کنید چون LightHouse هنوز در مرحله آزمایشه. شما باید صبر کنید تا LightHouse به کیوتی به صورت رسمی اضافه بشه. بعدش نوبت به پروژه من میرسه.

 

سوال ) میتونید زمانشو تقریبا بیان کنید ؟

نه ! این بیشتر به نوکیا بستگی داره تا من !

 

سوال ) با توجه به این که گوگل برای نوکیا یه رقیب حساب میشه ، واکنش نوکیا به این پروژه چی بود ؟

اونا تا همین چند روز پیش اطلاعی از این پروژه نداشتند اما وقتی متوجه شدند خیلی خوشحال شدند .

 

سوال ) خوب ما کجا میتونیم در باره این پروژه بیشتر اطلاعات بدست بیاریم

پروژه توی Google Code هستش که آدرس زیر شما رو به اون میرسونه :

http://code.google.com/p/android-lighthouse/

برداشتی آزاد از مقاله

Qt on Android - the Bogdan Vatra interview


 



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

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

بررسی مقادیر وارد شده توسط کاربر

نویسنده :سعید دادخواه
تاریخ:دوشنبه 27 دی 1389-07:38 ب.ظ

سلام


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

نکته ای که هست اینه که ممکنه کاربر مقداری رو وارد بکنه که از دید ما و برنامه ما یه مقدار invalid یا غیر معتبر باشه مثلا توی مثال قبلی اگر کاربر به جای اینکه یه عدد رو وارد بکنه یه سری حروف وارد بکنه مسلما برای ما داده های معتبری نخواهد بود . برای اینکه کاربر رو محدود بکنیم که تنها اون چیزی رو که مد نظرماست ; اون محدوده ای از اعدا د که مد نظر ماست ; اون رشته ای که با الگوی خاصش مدنظر ماست (مثل ایمیل ) رو وارد بکنه در کیوتی از کلاس های Validator استفاده میکنیم . 

QIntValidator:
برای بررسی اینکه ایا مقدار ورودی کاربر یه عدد دهدهی هست از این کلاس و شی ساخته شده از این کلاس استفاده میکنیم . به این صورت که :

QIntValidator* decValidatornew QIntValidator(0, 255, decEdit);
decEdit->setValidator(decValidator);

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

سومین متغیر هم تعیین کننده پدر این validator هستش.طبق مطالبی که قبلا گفته شد در این صورت تا مادامی که شی پدر یعنی decEdit که یه QLineEdit هستش زنده هست ارزیاب اون هم یعنی decValidator زنده است. تابع setValidator هم برای تعیین یه validator برای یه QLineEdit هستش . بعد از این مرحله decValidator چشم میدوزه به مقادیر ورودی در decEdit هر موقع مقادیر وارد شده  از شرط ما تخطی کردند مقدار جدید در decEdit وارد نخواهد شد.

QRegExpValidator:

با استفاده از این کلاس و قدرت regular expression ها شما به راحتی میتونید چک کنید ( برای مثال )‌که آیا آدرس ایمیل وارد شده از طرف کاربر مجاز هست; آیا عدد باینری وارد شده توسط کاربر مجاز هست ; آیا عدد هگزای وارد شده توسط کاربر مجاز هست یا نه ; و صد ها مثال دیگه .
اما مفهوم regular expression چیه : regular expressions یا عبارات باقاعده مجموعه قوانینی هستند که با استفاده از اونا شما میتونید الگویی که رشته میتونه داشته باشه رو تعیین کنید . برای مثال ببینید آیا الگوی ایمیل به صورت زیر هست یا نه 

(یک یا بیشتر حرف یا رقم).(یک یا بیشتر حرف یا رقم)@(صفر یا بیشتر حرف یا رقم)(یک حرف)
البته ممکنه برخی قواعد رو من رعایت نکرده باشم ولی میخواستم با مفهوم آشنا بشیم. ما با reg exps این الگو رو تعریف میکنم و فرضا به QLineEdit دستور میدیم تنها براساس این الگو میتونی کاراکتر بگیری ولاغیر .یعنی مثلا حق نداری در ابتدا یه رقم بگیری و ...
البته regular expressions یکم پیچیده هستند و  تسلط بر مبحث عبارات با قاعده زمان میبره که میتونید به
 این آدرس برای یادگیری اونا مراجعه کنید

QRegExpValidator* hexValidator =new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,2}"), hexEdit);
hexEdit->setValidator(hexValidator);
مثل مثال قبلی ما یه شی از کلاس QRegExpValidator ساختم و در سازنده شی ای از کلاس QRegExp رو براش فرستادیم . چون مبحث regular expression ها بسیار پر کاربرد هستش درکیوتی برای کاربا آنها یک کلاس تعریف شده به نام QRegExp . الگویی که ما قصد داریم مقادیر ورودی بر اساس اونا باشه با سازنده کلاس QRegExp ارسال میشه که در انیجا الگویی برای تشخیص اعداد هگزا دسیمال هستش.
مثلا مفهوم متن الگوی ما در این مثال یعنی اینکه ورودی باید حداقل یک کاراکتر صفر تا نه یا A تا  F  یا a تا f و حداکثر دو کاراکتر با همان ویژگی ها باشه که قابل پذیرش باشه

نه خسته !


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

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

مثال : برنامه مبدل مبنا

نویسنده :سعید دادخواه
تاریخ:دوشنبه 27 دی 1389-06:58 ب.ظ

سلام دوستان

مثال امروز ما در مورد یک برنامه بسیار ساده است که یه عدد دهدهی رو از ورودی میگیره و مقدار های مبنای ۱۶ و ۲ اونو نشون میده . به تصویر نگاه کنید.اگرم کاربر به جای عدد حروف رو وارد کنه برنامه بهش گیر میده


در این مثال از تابع 
int QString::toInt ( bool * ok = 0, int base = 10 ) const
شده که برای تبدیل یک رشته به یک عدد استفاده میشه. اشاره گری که به یه متغیر بولی نیاز داره برا اینه که اگه فرضا در رشته ما عدد نبود و چیزای دیگه بود مقدار ok برابر با false بشه

و همچنین از  تابع

QString QString::number ( long n, int base = 10 ) [static]

 
استفاده شده که برای تبدیل یک عدد به یک رشته به کار میرود در ضمن این تابع استاتیک هست.






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

چگونه با کمک رسان کیوتی کار کنیم

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

سلام

به گفته بسیاری از بزرگان قسمت کمک رسان کیوتی که با استفاده از QAssistant قابل دسترسی هست یکی از بهترین reference ها و help هایی است که تاحالا نوشته شده . علاوه بر این Assistant بسیار مرجع خوبی برای یادگیری کیوتی هست.
در این مقاله قصد داریم با نحوه کار کردن باAssistant آشنا بشیم البته به صورت ویدیویی.



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

Qt Resources Compiler rcc

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

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

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


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

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

Meta-object Compiler moc

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

مفهوم سیگنال و اسلات موجود در کیوتی یه مفهوم محض سی پلاس پلاس نیست یعنی سی پلاس پلاس استاندارد چیزی به نام سیگنال و اسلات نداره بلکه این مفاهیم توسط کیوتی به سی پلاس پلاس اضافه شده است .به همین دلیل برنامه ای به نام moc(meta object compiler ) برای تبدیل سیگنال و اسلات ها به سی پلاس پلاس استاندارد استفاده میشه.moc  برای هر کلاسی که از QObject ارث برده باشه یه فایل سی ++ اضافه ایجاد میکنه 


Property system
هر کلاسی در کیوتی میتونه مجموعه ای از ویژگی ها رو داشته باشه ( property ) که میتونند مورد بررسی و ست کردن قرار بگیرند. برای مثال QLabel دارای ویژگی text هست که مقدار این ویژگی متنی است که لیبل نمایش میدهد . برای هر ویژگی دو تابع وجود داره یکی برای برگرداندن مقدار فعلی اون ویژگی و دیگری برای ست کردن مقدار جدید برای اون ویژگی. مثلا در مورد QLabel تابع text() مقدار فعلی رشته موجود در اون لیبل رو بر میگردونه و setText()مقداری جدید به اون نسبت میده. این خصوصیت مربوط به کلاس هایی است که از QObject ارث برده میشوند و ما با تابع   QObject::property() میتونیم کلیه ویژگی های یه کلاس رو برگردونیم و با تابع QObject::setProperty() میتونیم مقدار یه property رو ست کنیم . نکته بسیار مهم و کلیدی و دلیل انعطاف این سیستم این هست که تابع اول لیستی از QString ها رو به ما برمیگردونه و تابع دوم هم یه QString از ما انتظار داره برای تعیین property . حسنی که این روش داره اینه که شما هرچقدر که دلتون خواست میتونید property به کلاستون اضافه کنید بدون اینکه کد های قبلی تغییر کنند . درست مثل property editor موجود در QtDesigner 

خلاصه مطلب این که moc برای هر کلاسی که از QObject ارث برده شده نیاز هست .  قبل از اینکه کامپایلر سی ++ دست به کار بشه باید این کامپایلر تمام فایل هایی که ویژگی ذکر شده رو دارند رو بررسی کنه و کدی تولید کنه که در فایلی به نام moc_nameoffile.cpp برای مثال ذخیره بشه.


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

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

ابزار ها و امکانات مکمل کیوتی

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

سلام

Qt اسمی کوچک و دنیایی بزرگ!
همراه کتابخانه های کیوتی مجموعه ای از ابزار هایی تعبیه شده که کار برنامه نویسی با کیوتی را برای شما ساده تر و دلپذیر تر میکنه دراین مقاله قصد داریم با آنها آشنا بشیم

ادامه مطلب

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

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

کتابخانه های کیوتی

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

سلام 

ممکنه یه سوال مهم مطرح بشه و اون اینه که آیا کیوتی فقط قابل استفاده برای ساخت یه user interface ساده است ؟ ایا کیوتی فقط شکل نمایش برنامه ما رو به کاربر دلپذیر تر میکنه ؟ یا نه ; قابلیت های دیگه ای هم به ما میده
موضوع بحث ما هم این بار در مورد این موضوع مهم هستش که ممکنه دید شما رو نسبت به کیوتی عوض کنه .
ادامه مطلب رو از دست ندین

ادامه مطلب

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

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

کلاس های پایه در کیوتی

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

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

موضوع امروز کلاس های پایه در کیوتی هستند
کلاس هایی که از QObject ارث میبرند:
هم مبحث مدیریت حافظه خودکار و هم مبحث signal / slot نیاز مند این هست که کلاس های درگیر در این پروسه ها از QObject ارث برده باشند.تمام ویدجت های کیوتی مثل QLineEdit از کلاس QWidget ارث برده اند و این کلاس هم از کلاس QObject پس کلیه کلاس های ویدجت قابل استفاده در مکانیزم signal , slot و memory management هستند.
کلاس های مربوط به layout هم مثل QH/VBoxLayout و  QGridLayout هم از کلاس QObject ارث برده اند.پس این کلاس ها هم در دو مکانیزم بالا میتونند شرکت کنند. کلاس هایی مثل QThread برای برنامه نویسی چند خطی و کلاس QTcpSocket برای برنامه نویسی شبکه با کیوتی هم از کلاس QObject ارث برده اند. به همین دلیل قابل استفاده برای مکانیزم signal , slot هستند.
کلاس هایی که از QObject ارث نمی برند:
اما خوب مسلما همه کلاس ها نیازمند مکانیزم سیگنال و اسلات و مدیریت حافظه خودکار نیستند . پس همه کلاس ها لزوما از QObejct ارث نمی برند.برای مثال یکی از مهمترین اونا کلاس QString هستش که برای کار بارشته در کیوتی تعبیه شده است.که امکان کار با کلیه زبان های موجود در دنیای کامپیوتر رو میده. یعنی شما میتونید توی یه QString یه متن فارسی رو ذخیره و نگهداری کنید.
کلاس های دیگه ای مثل کلاس QColor برای کار با رنگها , کلاس QImage  برای کار با تصاویر و خیلی از کلاس های دیگه  کلاس هایی هستند که از کلاس QObjectم ارث نبرده اند.مدیریت اشیا در این کلاس ها به صورت value-based
 هستش.
ادامه مطلب رو از دست ندین

ادامه مطلب

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

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

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

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

سلام دوستان

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


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

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

نوشتن اسلات دلخواه

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

سلام

در این قسمت ما قصد داریم خودمون به دلخواه یه اسلات تعریف کنیم  . فیلم ویدیویی و کد ها گویای مطلب هستند



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

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


  • تعداد صفحات :2
  • 1  
  • 2  
شبکه اجتماعی فارسی کلوب | Buy Website Traffic | Buy Targeted Website Traffic