در قسمت قبلی و جلسه دوم از آموزش کیوت / سی++ سیگنال و اسلات و مدیریت رخداد در کیوت را به صورتی ساده در یک برنامه بررسی کردیم؛ در آن برنامه با استفاده از دو رویداد در دو شیء مختلف یک تابع را اجرا کردیم که در هنگام تغییر متن و کلیک بر روی آنان، تابع فوق اجرا میشد. در این قسمت به معرفی برخی کلاسهای ساده و ابتدایی در کیوت را در یک برنامه و در عمل معرفی میکنیم که با استفاده از آنان میتوان برخی کارهای ابتدایی جهت گرفتن ورودی و خروجی و جریانهای رشتهای یا متنی و … را ایجاد و مدیریت کرد.
در جلسات قبلی از کیو-میک برای ساخت پروژههای کیوت استفاده کردیم. یکی دیگر از روشهای مدیریت پروژههای کیوت استفاده از سی-میک است. سی-میک ابزار توسعه نرمافزار آزاد و چندسکویی است که برای مدیریت و کامپایل پروژههای سی++ و سی کاربرد دارد. معمولا در گنو/لینوکس از جیسیسی که کامپایلر و مترجم پیشفرض در اکثر توزیعها است استفاده میشود؛ با این حال میتوان از کامپایلر سی-لنگ «Clang» نیز استفاده کرد. سی-لنگ در بیاسدی و اواس ده به طور پیشفرض نصب است.
یکی از مواردی که در اکثر زبانهای برنامهنویسی امروزی کاربرد فراوانی دارد؛ استفاده از دستوراتی است که برای نمایش رشته در خروجی کاربرد دارند. در جلسه قبل کلاس کیو-دیباگ «QDebug» را معرفی کردیم که همانند سی-اوت «std::cout» در سی++ عمل میکرد؛ با این تفاوت که کیو-دیباگ همانطور که از نامش پیداست کاربردی فراتر از نمایش رشته در خروجی خط فرمان داشته و اجازه نمایش پیغامها و رشتههای دلخواه را به اشکال و حالات مختلف فراهم میکند. در این قسمت به معرفی نحوه ارسال خروجی به خطر فرمان به روش کیوت خواهیم پرداخت که استفاده از این روش برای چاپ و درج و ذخیره رشته در فایلهای متنی کاربرد دارد.
روشی که در کیوت کاربرد فراوانی دارد و برای ایجاد جریان رشتهای و سپس انتساب جریان رشتهای مذکور به خروجی به کار میرود؛ با استفاده از کلاس «QTextStream» انجام میشود. در سی++ خالص «++Plain C» ابتدا از کتابخانههای «STD» استفاده میکردیم و سپس با نوشتن عبارت سی-اوت «std::cout» رشتهای را در خط فرمان چاپ میکردیم. ولی در کیوت ابتدا کلاس «QTextStream» را با استفاده از کلمه کلیدی «Include» وارد پروژه میکنیم. بعد از آنکه کتابخانه فوق از طریق سرآیند مورد نظر وارد پروژه مورد نظر شد؛ میتوانیم شیءی دلخواه را با نامی دلخواه را از کلاس فوق ایجاد کنیم. بعد از آن اگر رشتهای را به این جریان نسبت دهیم؛ آن رشته در خروجی قرار خواهد گرفت.
ابتدا از روش سی++ خالص استفاده کرده و سپس نوشتن پروژهای دیگر با استفاده از کیوت و رابط گرافیکی به روش کیوت، تفاوت بین این دو را بهتر درک خواهیم کرد. روش استاندارد و مرسوم در سی++ خالص نیز با استفاده از کتابخانههایی است که توسط «iostream» و «using namespace std» یکسری کلاس را وارد پروژه کردهایم. در سی++ خالص به راحتی میتوان دستورات زیر را نوشت تا یک خروجی تولید شده و در خط فرمان چاپ شود. برای اینکار دستور زیر را توسط یک برنامه ویرایشگر متن بنویسید و در مکانی در دیسک سخت ذخیره کنید؛ سپس آن را با استفاده از خط فرمان کامپایل کنید.
با این حال میتوان از محیط توسعه کیوت نیز برای نوشتن کد به زبان سی++ خالص استفاده کرد. برای اینکار برنامه محیط توسعه کیوت را اجرا کرده؛ و بر روی ایجاد پروژه جدید کلیک کنید. گفتنی است که در کیوت علاوه بر امکان نوشتن کد به زبان سی++، میتوانید از زبان سی خالص نیز استفاده کنید.
در پنجرهای که مشابه تصویر بالا است از قسمت سمت چپ گزینه پروژه-غیر-کویت «Non-Qt Project» را انتخاب کرده و از گزینههای نمایش داده شده در سمت راست پنجره فوق، گزینه سی++ خالص «++Plain C» را انتخاب کنید. اما این گزینه برای این جلسه مورد نظر ما نیست. اگر سی-میک «CMake» در سیستم شما نصب است؛ میتوانید گزینه یکی مانده با آخر «Non-Qt Project + CMake» را انتخاب کنید. در تصویر فوق از گزینه یکی مانده به آخر استفاده کردهایم. بعد از انتخاب مسیر پروژه و مقصد پروژه برای قرار گرفتن برنامه کامپایل شده در پنجرههای بعدی، پروژه با موفقیت ساخته خواهد شد. البته قبل از اینکه کار ساخت پروژه تمام شود در پنجره آخر بر روی دکمه اجرای سی-میک «Run CMake» کلیک کنید تا یک بار برای اولین بار سی-میک اجرا شود و پروژه را کامپایل کند؛ سپس روی دکمه پایان «Finish» کلیک نمایید.
بعد از اینکه پروژه ساخته شد؛ به فایلهای ساخته شده توسط محیط توسعه کیوت نگاهی میاندازیم. در این پروژه به جای فایلی که برای پروژه کیو-میک «QMake» بود، از یک فایل متنی ساده «txt» برای مدیرت و تنظیم پروژه با نام «CMakeLists.txt» استفاده شده است. فایل دیگری نیز با نام «main.cpp» ساخته شدهاست که برای درج کد در فایل اصلی ایجاد شده است. سی-میک نیز همانند کیو-میک ابزاری برای مدیرت و کامپایل پروژههای سی++ است، با این تفاوت که کیو-میک توسط خود کیوت ساخته شده است و برای کیوت استفاده میشود؛ همچنین سی-میک در اکثر پروژههای سی++ و سی به همراه کتابخانههای جیتیکی+ و غیره نیز قابل استفاده است. سی-میک خود یک کامپایلر نبوده و از کامپایلرهای دیگری مانند جیسیسی «gcc» و سی-لنگ «clang» استفاده میکند. فایل مذکور برای تنظیم پروژه سی-میک دارای مقادیر زیر است که به صورت خودکار توسط محیط توسعه کیوت ساخته شدهاست.
project(plain-cpp) cmake_minimum_required(VERSION 2.8) aux_source_directory(. SRC_LIST) add_executable(${PROJECT_NAME} ${SRC_LIST})
در این فایل، خط اول برای تعیین نام پروژه است و خط دوم تعیین میکند که این پروژه برای کامپایل به چه نسخهای از سی-میک نیاز دارد. در آن حداقل شماره نسخهای که قادر به کامپایل کد فوق است مشخص شده است. به طور نمونه اگر شماره ۲/۸ برای نسخه سی-میک در تنظیمات نوشته شود؛ سی-میک نسخه ۲/۸ به بالا قادر به کامپایل کد فوق هستند. همچنین خطوط سوم و چهارم نیز آدرس پروژه و چگونگی ایجاد فایل خروجی را مشخص کردهاند. بعد از اینکه فایل فوق را ملاحظه کردید؛ وارد فایل «main.cpp» شده و کدهای ساده زیر را در آن کپی کنید.
#include <iostream> #include <strings.h> using namespace std; int main() { string name; cout << "Enter Your name here: " << endl; cin >> name; cout << "Hi, " << name << endl; return 0; }
در این حالت بهتر است برنامه به جای نمایش در خروجی خود محیط توسعه کیوت، در نرمافزار خط فرمان سیستم مانند گنوم ترمینال یا کیدیای کنسول اجرا شود. برای اینکار به تنظیمات نرمافزار محیط توسعه کیوت رفته و در قسمت «Environment»، نرمافزار کنسول و خط فرمان مورد نظر خود را به گزینه کنسول دلخواه تغییر دهید. یکی از گزینههایی که در اکثر توزیعها نصب است؛ اکس-ترم «x-term» است که میتواند گزینه مذکور را به آن تغییر دهید. بعد از تنظیم نرمافزار خط فرمان دلخواه خود، سپس به قسمت تنظیمات پروژه «Projects» از سمت چپ نرمافزار محیط توسعه کیوت رفته و از بخش اجرا «Run»، تیک کنار اجرا در ترمینال را بزنید تا برنامه در خز فرمان اجرا شود. تنظیمات پروژه با کلیک بر روی نقشک پروژه «Project» در سمت چپ، گشوده خواهد شد.
سپس اگر کد فوق اجرا شود؛ برنامه در خط فرمان اجرا شده و منتظر ورود نام کاربر میماند؛ سپس بعد از وارد کردن نام کاربر، پیغامی به همراه سلام به کاربر نمایش داده شده «Hi, User» و منتظر فشردن کلیدی برای خروج می ماند.
سپس بیایید برنامه فوق را کمی تغییر دهیم؛ یعنی با استفاده از سی-میک یک برنامه کیوت بنویسیم که در آن یک کلاس نیز تعریف کردهایم. در این کلاس یک تابع برای محاسبه محیط مستطیل و همچنین چند تابع برای نمایش و گرفتن مقادیر مورد نیاز ار کاربر را در کلاس فوق تعریف خواهیم کرد. کلاس فوق را با نام محیط خواهیم ساخت و در آن چند تابع با نامهای نمایش-محیط «Print Area»، اخذ مقادیر عرض «set-width» و طول «set-height» مستطیل و محاسبه محیط مستطیل «Area Calculator» را تعریف خواهیم کرد.
این مثال را برای فراگیری نحوه استفاده از سی-میک بررسی میکنیم؛ تا نحوه استفاده از سی-میک به جای کیو-میک را نیز فرا گیریم. گفتنی است که اکثر پروژههای مطرح و برنامههای کیدیای توسط سی-میک مدیریت و کامپایل میشوند. سی-میک ابزاری است که در اکثر سیستمعاملها قابل نصب و استفاده است و علاوه بر گنو/لینوکس در سیستمعاملهای ویندوز، اواس ده و بیاسدی نیز نصب میشود. همانطور که ذکر شد، نرمافزار سی-میک توانایی استفاده از کامپایلرهای مختلف مانند سی-لنگ و جیسیسی را نیز در خود دارد.
اگر از نرمافزار محیط توسعه کیوت استفاده میکنید با دنبال کردن روش فوق به راحتی قادر به ساخت یک پروژه به وسیله سی-میک خواهید بود، در غیر این صورت میتوانید از ایکلیپس یا نرمافزار توسعه کیدیای «KDevelop» استفاده کنید. نرمافزار توسعه نرمافزار در کیدیای به صورت پیشفرض از سی-میک استفاده کرده و تنظیمات بیشتری برای استفاده از آن داراست. نسخه فعلی این نرمافزار نسخه ۴٫۷٫۱ است که هنوز از چارچوبکاری نسخه ۴ کیدیای استفاده میکند با این حال میتوان از چارچوبکاری ۵ «KF5» نیز در آن استفاده کرد. مهاجرت به نسخه ۵ چارچوبکاری کیدیای در نسخه آزمایشی و در حال توسعه قابل دسترسی توسط گیت «Git» انجام شده و در آینده به صورت پایدار منتشر خواهد شد.
مانند روش گفته شده برای مثال ساده نوشته شده به زبان سی++ خالص، یک پروژه جدید با استفاده از سی-میک ایجاد کنید؛ نام این پروژه را مثلا «helloworld» قرار میدهیم. این پروژه قرار است یک پروژه ساده در سطح پروژههای سلام دنیا برای به دست آوردن محیط مستطیل باشد. در آن دو کادر و دو برچسب در کنار یک کادر برای نتیجه و یک دکمه برای محاسبه محیط مستطیل قرار دارند.
ابتدا باید پروژه را برای نوشتن دستورات کیوت ۵ آماده کنیم. در داخل سی-میک باید کتابخانههای کیوت ۵ شناخته شدهباشند. برای تنظیم پروژه فوق دستورات زیر را در تنظیمات سی-میک که در فایل «CMakeLists.txt» است ریخته و ذخیره کنید.
cmake_minimum_required(VERSION 2.8.11) project(testproject) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) # Find the QtWidgets library find_package(Qt5Widgets) find_package(Qt5Core) # Tell CMake to create the helloworld executable aux_source_directory(. SRC_LIST) set(INCLUDE_DIR main.cpp areacalc.cpp areacalc.h) include_directories (${INCLUDE_DIR}) add_executable(helloworld ${SRC_LIST} ${HEADER_FILES} ${QT_MOC}) # Use the Widgets module from Qt 5. target_link_libraries(helloworld Qt5::Widgets)
در فایل فوق تنظیمات جدید افزوده شدهاست که برای شناسایی کتابخانههای ساده کیوت ۵ به کار رفتهاند. در بالا دو کتابخانه کویت-کور «Qt5Core» و کیوت-ویدجت «QtWidget» افزوده شدهاند.
کدهای زیر را در داخل فایل سی++ «main.cpp» ریخته و بر روی نقشک مثلث شکل سبز رنگ سمت چپ کلیک کنید تا برنامه کامپایل و اجرا شود. در کد فوق که یک کد ساده است؛ یک پنجره با عنوان سلام دنیا و نقشک آدمک خندان نمایش داده میشود. بعد از آن اگر کد را اجرا کنید پنجره نمایش داده شده و شما توانستهاید برنامه خود را توسط سی-میک کامپایل کنید.
#include <qt/QtCore/QtCore> #include <qt/QtWidgets/QtWidgets> #include <qt/QtCore/QDebug> #include <qt/QtGui/QIcon> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *widget; widget = new QWidget(); widget->setWindowTitle("سلام دنیا!"); widget->setWindowIcon(QIcon::fromTheme("face-smile")); widget->show(); return app.exec(); }
خروجی برنامه ما در زمانی که کامپایل میشود؛ اگر توسط سی-میک یا توسط کیو-میک کامپایل شود؛ تفاوتی در خروجی برنامهها و نحوه کار آنان وجود ندارد. با اینحال در نوشتن کدها همانطور که ملاحظه میشود، باید به شکل دیگری کتابخانهها را در کد خود وارد کنید. مثلا کتابخانه ویدجت در شاخه کیوت است و باید ذکر شود. مثلا کلاس «QIcon» در شاخه کلاسهای «GUI» در کتابخانهها و سرآیندهای کیوت هستند؛ برای آنکه بدانید هر کلاس زیر مجموعه چه شاخهای از کتابخانههای کیوت است به صفحه مربوط به آن کلاس در ویکی اسناد و راهنمای کیوت مراجعه کنید. بعد از آنکه تنظیمات سی-میک را تغییر دادیم؛ دیگر نام پروژه از «helloworld» به «testproject» تغییر یافته است.
برای آنکه برنامه فوق بتواند دو مشخصه طول و عرض مستطیل را از کاربر دریافت کند؛ باید دو عدد ویدجت کادر-متن «LineEdit» در داخل برنامه به همراه دو برچسب و یک دکمه «QPushButton» قرار دهیم. قبل از آن از یک لایه افقی و یک لایه عمودی نیز برای چینش کنترلها استفاده خواهیم کرد. ابتدا بیایید ظاهر برنامه را در داخل فایل سی++ «main.cpp» به شکل دلخواه درآوریم. در این برنامه ما از یک نقشک زیبا منتسب به ماشین حساب استفاده کرده و کنترلها را به شکلی زیبا در آن قرار خواهیم داد. برای اینکار از کد زیر استفاده کردهایم.
#include <qt/QtCore/QtCore> #include <qt/QtWidgets/QtWidgets> #include <qt/QtCore/QDebug> #include <qt/QtGui/QIcon> int main(int argc, char *argv[]) { //setup application QApplication app(argc, argv); //setup windows widget QWidget *widget; widget = new QWidget(); widget->setWindowTitle("Area Calculator"); widget->setWindowIcon(QIcon::fromTheme("kcalc")); //setpu layout QHBoxLayout *hLayout; QVBoxLayout *vLayout; vLayout = new QVBoxLayout; hLayout = new QHBoxLayout; //Labels for Tag QLabel *lblHeight; lblHeight = new QLabel(widget); QLabel *lblWidth; lblWidth = new QLabel(widget); QLineEdit *leHeight; QLineEdit *leWidth; leHeight = new QLineEdit(widget); leWidth = new QLineEdit(widget); //add widgets to VLayout lblHeight->setText("Height: "); hLayout->addWidget(lblHeight); hLayout->addWidget(leHeight); lblWidth->setText("Width: "); hLayout->addWidget(lblWidth); hLayout->addWidget(leWidth); //set push buton QPushButton *pbCalc; pbCalc = new QPushButton(widget); pbCalc->setText("Calculate"); //add layout and button to VLayout vLayout->addLayout(hLayout); vLayout->addWidget(pbCalc); //set mainlayout to widget widget->setLayout(vLayout); widget->show(); //execute app return app.exec(); }
در کد فوق چند کنترل تعریف شده و در آن لایههای افقی و عمودی چیده شدهاند. ترتیب قرار گیری و ساخت کنترلها یا ویدجتها نیز در آن مهم است؛ یعنی ابتدا باید یک برچسب برای طول ایجاد کنید و بعد از آن کادر ورود متن برای طول را قرار دهید؛ سپس همین کار را برای برچسب و کادر ورود متن انجام داده و آنها را در لایهای افقی قرار دهید. سپس یک لایه عمودی ایجاد کرده؛ لایه افقی را به آن اضافه میکنیم. بعد از آن دکمه را نیز به لایه عمودی اضافه کرده و لایه اصلی ویدجت را به لایه عمودی تغییر میدهیم. حال بعد از نوشتن دستور فوق اگر کد را کامپایل و اجرا کنید با برنامهای مشابه برنامه زیر مواجه خواهید شد.
اگر بخواهیم کلاسی را تعریف کنیم که در آن محاسبات مربوط به محاسبه محیط مستطیل انجام شود؛ باید ابتدا یک فایل سرآیند و یک فایل سورس سی++ بنویسیم. برای تعریف کلاس در فایل سرآیند از کلمه کلیدی «class» استفاده میکنیم. برای ساخت کلاس در قسمتی که فایلهای پروژه نمایش داده شدهاست؛ در بالای لیست روی عبارت پروژه «Project» کلیک کرده و آن را به گزینه «File System» تغییر دهید؛ زیرا گزینه پروژه در سی-میک به خوبی کیو-میک کار نمیکند. بعد از آن در فضای خالی کلیک کرده و بر روی گزینه «Show Container Folder» کلیک کنید تا وارد پوشه پروژه شوید؛ پوشه فوق در مدیر پرونده پیشفرض شما باز خواهد شد. در آنجا دو فایل با نامهای «areacalc.h» و «areacalc.cpp» بسازید. سپس وارد فایل سرآیند شده و کدهای زیر را در آن وارد کنید.
// AREA_CALC #define AREACALC_H #include <qt/QtCore/QTextStream> #include <qt/QtCore/QString> class AreaCalc { protected: double Area; // Area of a box float Height; // Height of a box float Width; // Width of a box public: QString displayArea(); void setHeight(float Hight); void setWidth(float Width); float calculateArea(float y, float x); };
فایل سورس کلاس فوق را نیز به کدهای زیر تغییر دهید؛ در این کلاس ما از چند تابع ساده جهت مقدار دهی به متغیرها مورد استفاده و نمایش و چاپ برخی مقادیر در خروجی استفاده کردهایم که تمامی موارد فوق در جلسات قبلی آموزش داده شدهاست. مورد QTextStream» را نیز که در اوایل مطلب آن را معرفی کردیم؛ نیز در کد نمایش محیط به کار رفتهاست که نحوه استفاده از آن مشابه با نحوه استفاده از سی-اوت «std::cout» در سی++ خالص دارد.
#include "areacalc.h" QString AreaCalc::displayArea(){ this->Area = calculateArea(this->Height, this->Width); //qDebug(QString::number(this->Height)); //qDebug(QString::number(this->Width)); QString strArea = QString::number(this->Area); //convert float to string QTextStream out(stdout); //prfloat on terminal out << strArea; return strArea; //function outout } void AreaCalc::setHeight(float funcHeight){ this->Height = funcHeight; qDebug("Height was set"); } void AreaCalc::setWidth(float funcWidth){ this->Width = funcWidth; qDebug("Width was set"); } float AreaCalc::calculateArea(float y, float x){ double resultArea; resultArea = (x + y) * 2; qDebug("Area Calculated!"); return resultArea; }
در کدهای قبلی ما تمامی اجزا و کنترلها را در داخل فایل اصلی ساختیم که کاری مناسبی نیست؛ برای استفاده از یک پنجره در کیوت بهتر است از یک کلاس منشعب از کلاس «QWidget» استفاده کنیم. سپس کلاس فوق را در داخل فایل اصلی فراخوانی و استفاده کنیم. پس همانطور که ذکر شد برای آنکه کد را به صورت درستی بنویسیم؛ باید تمامی کدها را به یک کلاس انتقال دهیم. همانند ساخت کلاس محاسبه محیط «AreaCalc» که در بالا ساختیم؛ دو عدد فایل برای سورس و سرآیند در این کلاس خواهیم ساخت. فایل سرآیند را با نام «widget.h» ساخته و در آن کدهای زیر را قرار دهید.
#ifndef WIDGET_H #define WIDGET_H #include <QtWidgets/QtWidgets> #include <QtCore/QDebug> #include <QtGui/QIcon> #include <QtCore/QObject> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: QHBoxLayout *hLayout; QLabel *lblResult; QVBoxLayout *vLayout; QPushButton *pbCalc; QLineEdit *leHeight; QLineEdit *leWidth; private slots: void pbCalc_click(); }; #endif // BUTTON_H
نکته: در تمامی کلاسهایی که از کلاسهای کیوت منشعب میشوند؛ باید از ماکرو کیوت-آبجکت «Q_OBJECT» استفاده کرد.
سپس تغییراتی را نیز در فایل سی-میک ایجاد میکنیم. این تغییرات برای شناخت بهتر کتابخانههای کیوت است. فایل تنظیمات سی-میک را با تنظیمات و محتویات نوشته شده در کادر زیر جایگزین کنید.
cmake_minimum_required(VERSION 2.8.11) project(testproject) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) # Find the QtWidgets library find_package(Qt5Widgets) find_package(Qt5Core) find_package(Qt5Declarative) include_directories(${Qt5Widgets_INCLUDES}) add_definitions(${Qt5Widgets_DEFINITIONS}) # Tell CMake to create the helloworld executable aux_source_directory(. SRC_LIST) set(INCLUDE_DIR main.cpp areacalc.cpp areacalc.h widget.cpp widget.h) include_directories (${INCLUDE_DIR}) add_executable(helloworld ${SRC_LIST} ${HEADER_FILES} ${QT_MOC}) # Use the Widgets module from Qt 5. target_link_libraries(helloworld Qt5::Widgets)
مقادیر فایل اصلی «main.cpp» را نیز به مقادیر زیر تغییر دهید. همانطور که ذکر کردیم؛ به جای استفاده از فایل اصلی برای نوشتن دستورات آنها را به یک کلاسی با نام ویدجت انتقال داده و آن کلاس را در فایل اصلی تعریف کرده و با استفاده از آن پنجره را نمایش میدهیم. به دلیل آنکه کلاس ویدجت نوشته شده توسط ما از کلاس ویدجت در کیوت منشعب شده است، شیء ,ما با نام پنجره «window» ساخته شده و تمامی ویژگیهای یک شیء کیو-ویدجت را در خود دارد.
#include <QtCore/QtCore> #include <QtWidgets/QtWidgets> #include "widget.h" int main(int argc, char *argv[]) { //setup application QApplication app(argc, argv); //execute app //show Windows Widget window; window.show(); return app.exec(); }
فایل سورس کلاس را را نیز با نام «widget.cpp» ایجاد کرده و مقادیر زیر را در آن وارد کنید. در این کلاس قسمت اصلی در همین فایل قرار دارد.
#include "widget.h" #include "areacalc.h" Widget::Widget(QWidget *parent) : QWidget(parent){ //setup windows widget this->setWindowTitle("Area Calculator"); this->setWindowIcon(QIcon::fromTheme("kcalc")); //setpu layout vLayout = new QVBoxLayout; hLayout = new QHBoxLayout; //Labels for Tag QLabel *lblHeight; lblHeight = new QLabel(this); QLabel *lblWidth; lblWidth = new QLabel(this); leHeight = new QLineEdit(this); leWidth = new QLineEdit(this); //add widgets to VLayout lblHeight->setText("Height: "); hLayout->addWidget(lblHeight); hLayout->addWidget(leHeight); lblWidth->setText("Width: "); hLayout->addWidget(lblWidth); hLayout->addWidget(leWidth); //set push buton pbCalc = new QPushButton(this); pbCalc->setText("Calculate"); //Label for result lblResult = new QLabel(this); lblResult->setText("00"); QFont serifFont("Times, Droid Serif", 24, QFont::Bold); lblResult->setFont(serifFont); //add layout and button to VLayout vLayout->addLayout(hLayout); vLayout->addWidget(pbCalc); vLayout->addWidget(lblResult); //set mainlayout to widget this->setLayout(vLayout); //connect button QObject::connect(pbCalc, SIGNAL(clicked()), this, SLOT(pbCalc_click())); } Widget::~Widget() { } void Widget::pbCalc_click(){ qDebug("Button was clicked"); float floatHeight; float floatWidth; floatHeight = leHeight->text().toFloat(); floatWidth = leWidth->text().toFloat(); AreaCalc areaCalc; areaCalc.setHeight(floatHeight); areaCalc.setWidth(floatWidth); QString strResult; strResult = areaCalc.displayArea(); lblResult->setText(strResult); }
بعد از اینکه تمامی فایلها را ایجاد کرده و تغییرات بعدی را نیز در آنان اعمال کردید؛ برنامه به صورت کامل قابل اجرا است. برای اجرای برنامه ابتدا روی نقشک چکش در سمت چپ برنامه محیط توسعه کیوت کلیک کنید؛ سپس بعد از موفقیت آمیز بودن کامپایل پروژه، آن را با کلیک بر نقشک مثلث شکل سبز رنگ سمت چپ برنامه اجرا کنید. بعد از اجرای برنامه، تصویری مانند زیر مشاهده خواهد شد که با نوشتن مقادیر دلخواه در دو کادر متنی و کلیک بر روی دکمه محاسبه «Calculate»، محیط مستطیل محاسبه خواهد شد.
تبریک میگویم؛ شما توانستید یک پروژه کامل و ساده کیوت / سی++ را توسط سی-میک کامپایل و اجرا نمایید. بعد از این به راحتی میتوانید اکثر کدهای خود را با استفاده از سی-میک کامپایل و مدیریت کنید. اگر نخواستنید که از محیط توسعه کیوت استفاده کنید؛ میتوانید از محیط توسعه دیگری نیز برای نوشتن پروژه خود استفاده کنید. مانند محیط توسعه ایکلیپس یا نتبینز یا حتی محیط توسعه کیدیای که «KDevelop» نام دارد.
اجازه دهید تا نگاهی کوتاه به آنچه نوشت شدهاست داشته باشیم؛ در کدهایی که در فایل اصلی «main.cpp» نوشته شدهاست، تنها از یک تابع اصلی به همراه تعریف کلاس «QApplication» به عنوان یک شیء و با نام «app» استفاده کردهایم. در این فایل کلاس ویدجت «Widget» را نیز که توسط خودمان نوشتهایم را تعریف و با تابع نمایش یا «show»، نمایش دادهایم.
در فایل سرآیند ویدجت یک کلاس را تعریف کردهایم که منشعب «Derived» شده از کلاس «QWidget» است؛ هر گاه کلاسی از کلاس دیگر منشعب میشود، تمامی متغیرها و توابع اگر دوباره تعریف نشده باشند؛ دست نخورده از کلاسی که منشعب شده است وارد کلاس جاری میشود. پس از این انشعاب، کلاس ویدجت نوشته شده توسط ما نیز همان ویژگیهای ویدجت کیوت «QWidget» را دارد. در این فایل تابعی را برای اجرا بعد از کلیک موشی روی دکمه تعریف کردهایم و تمامی ویدجتها یا کنترلهای مورد استفاده در برنامه مانند برچسبها و دکمه و کادر متنی را تعریف کردهایم. در داخل فایل سورس ویدجت «widget.cpp» نیز دستوراتی را برای نمایش کنترلها و تعریف لایهها و استفاده از آنان نوشتهایم که توضیحات مختصری نیز در کد نوشته شده است.
محاسبه محیط مستطیل را نیز به یک کلاس جداگانه سپردهایم. در این کلاس سه متغیر برای محیط، طول و عرض به همراه سه تابع برای گرفتن طول و عرض و محاسبه و نمایش محیط به کار رفته است. بعد از آنکه کلاس فوق را تنظیم کردیم؛ آن را در داخل کلاس ویدجت تعریف کرده و با استفاده از آن محیط را محاسبه و نمایش دادهایم.
در آخر اگر کدهای نوشته شده برایتان گنگ است کدهای قرار گرفته در پیوندهای زیر را بارگیری کنید و با استفاده از برنامه محیط توسعه کیوت پروژه دریافتی را کامپایل و اجرا کنید. برای باز کردن پروژه در محیط توسعه کیوت، در برنامه بر روی گزینه گشودن پروژه «Open Project» کلیک کرده و شاخه پروژه را به آن معرفی کنید. برای آن که کد فوق اجرا شود باید سی-میک در سیستم شما نصب باشد، به علاوه اینکه نسخه کیوت نصب شده در سیستم شما نیز باید نسخه ۵/۰ و بالاتر باشد. در هر صورت، اگر در اجرای برنامه دچار مشکل شدید؛ بهتر است به راهنمای نصب کیوت ۵ و سی-میک در توزیع خود رفته و این دو را نصب کنید. کدهای بالا همگی سالم هستند و این موضوع در خروجی برنامهها نیز در تصاویر کاملا واضح بوده و کدها کاملا تست شدهاند. همچنین تضمینی برای اجرای کدهای بالا در سیستمعامل مک و ویندوز وجود ندارد و ممکن است به تنظیمات دیگری برای سی-میک «CMake» نیاز داشته باشید.
کد پروژه اول که یک برنامه ساده سی++ با استفاده از سی-میک بود در این آرشیو زیپ «Zip» قرار گرفته است. همچنین کد پروژه دوم که یک برنامه کیوت برای محاسبه محیط مستطیل با استفاده از طول و عرض بود را نیز در به صورت آرشیو زیپ در گوگل درایو قرار دادهام. شما میتوانید این دو پروژه را از این پیوند و این پیوند به صورت غیر مستقیم بارگیری کنید.