بسم الله الرحمن الرحيم
نكمل الجزء الثاني وذلك بإضافة بعض التعديلات على
البرنامج للرجوع الى الجزء الاول اضغط هنا
نفتح المشروع السابق
من قائمة مشروع project اختر فتح مشروع open project
واذهب الى مسار المشروع وحدد الملف calculator.pro
ثم اضغط فتح open
نبدأ اولا بتعديل الفورم
وذلك بالضغط dialog.ui
الان ومن خلال Qt Designer نبدأ بالتعديل على الفورم
نحدد الـlabel المسمى "+"
ثم نضغط على Break Layout
وذلك لكي نستطيع التعديل على الفورم
الان حدد الـlabel المسمى "+" مرة اخرى واضغط على del
وذلك للتخلص منه
والان اضف comboBox مكان الـlabel
اضغط على comboBox بزر الفارة الايمن واختر من القائمة المنبثقة Edit Items
واضف القائمة التالية
+
-
*
/
^
كما في هذه الصورة

الان حدد كلا من comboBox و الـspacer الذي يعلوه
ثم اضغط Layout Vertically
الان ازل التحديد عن جميع الـWidgets ثم اضغط
Layout in Grid
حتى تصبح النافذة بهذا الشكل

الان احفظ التغييرات واغلق Qt Designer حتى تعود الى QDevelop
الان نبدأ بالتعديل على الكود السابق
سوف نكتب دالة واحدة تقوم بكل العمليات الحسابية
ولنسميها مثلا operation
طبعا سوف نصرح Declar عنها في الملف dialogimpl.h
وذلك باضافة السطر التالي
وهذا هو ملف dialogimpl.h بعد التعديل
الان نقوم بكتابة الدالة operation في الملف dialogimpl.cpp
ناتي الى شرح الدالة السابقة خطوة بخطوة
هنا في السطر الاول عرفنا متغير من نوع int
ثم اسندنا له قيمة index الحالية لـcomboBox
حيث ان comboBox به العناصر الاتية
ثم استخدمت عبارة switch للتحقق من العملية المراد تنفيذها
والان نعدل الاسطر التالية
في السابق كانت
حيث يتم جمع قيمتي sBox1 و sBox2 في حال تغير قيمة ايا منهما
لك سوف نجعل الكود بهذا الشكل
حيث سيتم تنفيذ الدالة operation في حال تغير قيمة sBox1 او
sBox2
ويتوجب علينا اضافة السطر التالي
وذلك لاننا استخدمنا الدالة pow
وهذا هو ملف dialogimpl.cpp بعد اجراء التعديلات السابقة عليه
الان جرب تعمل Build و Debug
البرنامج يعمل بشكل جيد
لكن توجد مشكلة
وهي
اذا حاول المستخدم القسمة على صفر ماذا يحدث؟؟؟
جرب قسمة اي عدد على الصفر
اذا يجب علينا تخطي القسمه على الصفر
كل ما نحتاج فعله هو تعديل الـcase 3 الى
وهذا هو ملف dialogimpl.cpp بشكله النهائي
واي ملاحظة او استفسار انا موجود وبالخدمة
نكمل الجزء الثاني وذلك بإضافة بعض التعديلات على
البرنامج للرجوع الى الجزء الاول اضغط هنا
نفتح المشروع السابق
من قائمة مشروع project اختر فتح مشروع open project
واذهب الى مسار المشروع وحدد الملف calculator.pro
ثم اضغط فتح open
نبدأ اولا بتعديل الفورم
وذلك بالضغط dialog.ui
الان ومن خلال Qt Designer نبدأ بالتعديل على الفورم
نحدد الـlabel المسمى "+"
ثم نضغط على Break Layout
وذلك لكي نستطيع التعديل على الفورم
الان حدد الـlabel المسمى "+" مرة اخرى واضغط على del
وذلك للتخلص منه
والان اضف comboBox مكان الـlabel
اضغط على comboBox بزر الفارة الايمن واختر من القائمة المنبثقة Edit Items
واضف القائمة التالية
+
-
*
/
^
كما في هذه الصورة

الان حدد كلا من comboBox و الـspacer الذي يعلوه
ثم اضغط Layout Vertically
الان ازل التحديد عن جميع الـWidgets ثم اضغط
Layout in Grid
حتى تصبح النافذة بهذا الشكل

الان احفظ التغييرات واغلق Qt Designer حتى تعود الى QDevelop
الان نبدأ بالتعديل على الكود السابق
سوف نكتب دالة واحدة تقوم بكل العمليات الحسابية
ولنسميها مثلا operation
طبعا سوف نصرح Declar عنها في الملف dialogimpl.h
وذلك باضافة السطر التالي
كود:
void operation();
كود:
#ifndef DIALOGIMPL_H #define DIALOGIMPL_H // #include "ui_dialog.h" // class DialogImpl : public QDialog, public Ui::Dialog { Q_OBJECT public: DialogImpl( QWidget * parent = 0, Qt::WFlags f = 0 ); private slots: void on_sBox1_valueChanged(int value); void on_sBox2_valueChanged(int value); void operation(); }; #endif
كود:
void DialogImpl::operation() { int opType; opType = comboBox->currentIndex(); switch (opType) { case 0: lcdNumber->display(QString::number(sBox1->value() + sBox2->value())); break; case 1: lcdNumber->display(QString::number(sBox1->value() - sBox2->value())); break; case 2: lcdNumber->display(QString::number(sBox1->value() * sBox2->value())); break; case 3: lcdNumber->display(QString::number(sBox1->value() / sBox2->value())); break; case 4: lcdNumber->display(QString::number(pow(sBox1->value() , sBox2->value()))); break; } }
كود:
int opType; opType = comboBox->currentIndex();
ثم اسندنا له قيمة index الحالية لـcomboBox
حيث ان comboBox به العناصر الاتية
كود:
index text 0 + 1 - 2 * 3 / 4 ^
كود:
switch (opType) { case 0: lcdNumber->display(QString::number(sBox1->value() + sBox2->value())); break; case 1: lcdNumber->display(QString::number(sBox1->value() - sBox2->value())); break; case 2: lcdNumber->display(QString::number(sBox1->value() * sBox2->value())); break; case 3: lcdNumber->display(QString::number(sBox1->value() / sBox2->value())); break; case 4: lcdNumber->display(QString::number(pow(sBox1->value() , sBox2->value()))); break; }
في السابق كانت
كود:
void DialogImpl::on_sBox1_valueChanged(int value) { lcdNumber->display(QString::number(value + sBox2->value())); } void DialogImpl::on_sBox2_valueChanged(int value) { lcdNumber->display(QString::number(value + sBox1->value())); }
لك سوف نجعل الكود بهذا الشكل
كود:
void DialogImpl::on_sBox1_valueChanged(int value) { operation(); } void DialogImpl::on_sBox2_valueChanged(int value) { operation(); }
sBox2
ويتوجب علينا اضافة السطر التالي
كود:
#include <math.h>
وهذا هو ملف dialogimpl.cpp بعد اجراء التعديلات السابقة عليه
كود:
#include "dialogimpl.h" #include <math.h> // DialogImpl::DialogImpl( QWidget * parent, Qt::WFlags f) : QDialog(parent, f) { setupUi(this); } // void DialogImpl::on_sBox1_valueChanged(int value) { operation(); } void DialogImpl::on_sBox2_valueChanged(int value) { operation(); } void DialogImpl::operation() { int opType; opType = comboBox->currentIndex(); // opType = comboBox->currentText(); switch (opType) { case 0: lcdNumber->display(QString::number(sBox1->value() + sBox2->value())); break; case 1: lcdNumber->display(QString::number(sBox1->value() - sBox2->value())); break; case 2: lcdNumber->display(QString::number(sBox1->value() * sBox2->value())); break; case 3: lcdNumber->display(QString::number(sBox1->value() / sBox2->value())); break; case 4: lcdNumber->display(QString::number(pow(sBox1->value() , sBox2->value()))); break; } } //

البرنامج يعمل بشكل جيد
لكن توجد مشكلة
وهي
اذا حاول المستخدم القسمة على صفر ماذا يحدث؟؟؟
جرب قسمة اي عدد على الصفر
اذا يجب علينا تخطي القسمه على الصفر
كل ما نحتاج فعله هو تعديل الـcase 3 الى
كود:
if (sBox2->value()!=0) { lcdNumber->display(QString::number(sBox1->value() / sBox2->value())); } else { lcdNumber->display("Error"); }
كود:
#include "dialogimpl.h" #include <math.h> // DialogImpl::DialogImpl( QWidget * parent, Qt::WFlags f) : QDialog(parent, f) { setupUi(this); } // void DialogImpl::on_sBox1_valueChanged(int value) { operation(); } void DialogImpl::on_sBox2_valueChanged(int value) { operation(); } void DialogImpl::operation() { int opType; opType = comboBox->currentIndex(); // opType = comboBox->currentText(); switch (opType) { case 0: lcdNumber->display(QString::number(sBox1->value() + sBox2->value())); break; case 1: lcdNumber->display(QString::number(sBox1->value() - sBox2->value())); break; case 2: lcdNumber->display(QString::number(sBox1->value() * sBox2->value())); break; case 3: if (sBox2->value()!=0) { lcdNumber->display(QString::number(sBox1->value() / sBox2->value())); } else { lcdNumber->display("Error"); } break; case 4: lcdNumber->display(QString::number(pow(sBox1->value() , sBox2->value()))); break; } } //
تعليق