إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

تصميم حاسبة بسيطة مع Qt الجزء الثاني

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • تصميم حاسبة بسيطة مع Qt الجزء الثاني

    بسم الله الرحمن الرحيم

    نكمل الجزء الثاني وذلك بإضافة بعض التعديلات على
    البرنامج للرجوع الى الجزء الاول اضغط هنا

    نفتح المشروع السابق

    من قائمة مشروع 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();
    وهذا هو ملف dialogimpl.h بعد التعديل

    كود:
    #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
    الان نقوم بكتابة الدالة operation في الملف dialogimpl.cpp

    كود:
    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();
    هنا في السطر الاول عرفنا متغير من نوع int
    ثم اسندنا له قيمة index الحالية لـcomboBox
    حيث ان comboBox به العناصر الاتية
    كود:
    index                text
    0                    +
    1                    -
    2                    *
    3                    /
    4                    ^
    ثم استخدمت عبارة switch للتحقق من العملية المراد تنفيذها
    كود:
    	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()));
    }
    حيث يتم جمع قيمتي sBox1 و sBox2 في حال تغير قيمة ايا منهما

    لك سوف نجعل الكود بهذا الشكل
    كود:
    void DialogImpl::on_sBox1_valueChanged(int value)
    {
        operation();
    }
    
    void DialogImpl::on_sBox2_valueChanged(int value)
    {
        operation();
    }
    حيث سيتم تنفيذ الدالة operation في حال تغير قيمة sBox1 او
    sBox2

    ويتوجب علينا اضافة السطر التالي
    كود:
    #include <math.h>
    وذلك لاننا استخدمنا الدالة pow

    وهذا هو ملف 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;
    	}
    }
    //
    الان جرب تعمل Build و Debug



    البرنامج يعمل بشكل جيد

    لكن توجد مشكلة

    وهي

    اذا حاول المستخدم القسمة على صفر ماذا يحدث؟؟؟

    جرب قسمة اي عدد على الصفر

    اذا يجب علينا تخطي القسمه على الصفر

    كل ما نحتاج فعله هو تعديل الـcase 3 الى
    كود:
    		if (sBox2->value()!=0)
    		{
    		lcdNumber->display(QString::number(sBox1->value() / sBox2->value()));	
    		}
    		else
    		{
    			lcdNumber->display("Error");
    		}
    وهذا هو ملف 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:
    		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;
    	}
    }
    //
    واي ملاحظة او استفسار انا موجود وبالخدمة

  • #2
    يا سلام .. ايه الشرح ده يا عم .. شرح راائع..

    بارك الله فيك وجعله في ميزان حسناتك ..

    تحياتي ^_^
    GCS

    تعليق


    • #3
      اخي Cpu

      اهلا وسهلا بك

      اسعدني مرورك ^_^

      تعليق


      • #4
        مشكور آخى ^_^
        مافيش راجل يعملنا درس بايثون و Glade لآلة حاسبة

        تعليق


        • #5
          السلام عليكم
          بارك الله فيك اخي صالح
          درس جميل ^_^

          تعليق


          • #6
            بـارك الله فيك علي مجموعه الدروس تلك التي تتحفنا بهـا

            تعليق


            • #7
              مبدع ماشاء الله عليك
              الله يعطيك العافية...

              تعليق


              • #8
                مشكورين شباب على مروركم الجميل

                تعليق


                • #9
                  الأخ الكريم / geo_saleh

                  فيه سؤال بودى أسأله لحضرتك ؛ حتى تتم الفائدة .

                  حتى الآن لم أنفذ هذا التطبيق ؛ وإن شاء الله سأقوم بتطبيقه فى أسرع وقت

                  السؤال هو بعد عمل Build& Debug
                  أكيد سيحتفظ البرنامج بالعمل ؛ كماهو الحال فى الفيجوال بيزك دوت نت ؛ وأنا من مبرمجى الفيجوال بيزك دوت نت ؛ ومن السهل بالفيجوال بيزك عمل

                  آلات حاسبة متقدمة

                  ولكن الحال فى الفيجوال بيزك دوت نت ؛ أن الواحد يقوم بتحويل المشروع بأحد البرامج إلى صيغة exe

                  فبأى صيغة نهائية يكون بها البرنامج النهائى .... حتى تكون الإستفادة الحقيقية منه
                  وهل يمكنك رفع هذه الآله الحاسبة البسيطة على النت حتى نقوم بتحميلها ومعاينتها

                  مع موفور شكرى .


                  just a User innately
                  اللهم اهدنا إلى الطيب من القول ؛ واهدنا إلى صراط الحميد

                  تعليق


                  • #10
                    اهلا وسهلا بك اخي سمير نورت الموضوع

                    بالطبع اكيد بعد ما تعمل Build& Debug

                    راح تحصل على ملف تنفيذي

                    اذهب الى مسار المشروع وراح تحصل مجلد اسمه bin

                    وداخله راح يكون هناك ملف قابل للتنفيذ بنفس اسم المشروع
                    الملفات المرفقة

                    تعليق


                    • #11
                      المشاركة الأصلية بواسطة geo_saleh مشاهدة المشاركة
                      اهلا وسهلا بك اخي سمير نورت الموضوع

                      بالطبع اكيد بعد ما تعمل Build& Debug

                      راح تحصل على ملف تنفيذي

                      اذهب الى مسار المشروع وراح تحصل مجلد اسمه bin

                      وداخله راح يكون هناك ملف قابل للتنفيذ بنفس اسم المشروع
                      عاجز عن شكرك يا أبو صالح

                      وشاكر لك فضلك فى رفع الملف .....

                      بس ياريت توضح لنا هيتعمل له كومبايلينج ازّاى ؟


                      just a User innately
                      اللهم اهدنا إلى الطيب من القول ؛ واهدنا إلى صراط الحميد

                      تعليق


                      • #12
                        samdeb:/home/sam/Desktop# ./calculator
                        bash: ./calculator: Permission denied
                        samdeb:/home/sam/Desktop#



                        samdeb:/home/sam/Desktop# sh calculator
                        calculator: calculator: cannot execute binary file


                        just a User innately
                        اللهم اهدنا إلى الطيب من القول ؛ واهدنا إلى صراط الحميد

                        تعليق


                        • #13
                          حول صلاحية الملف الى ملف قابل للتنفيذ

                          تعليق


                          • #14
                            كله تمام

                            ممنون لك


                            samdeb:/home/sam/Desktop# chmod a+x calculator
                            samdeb:/home/sam/Desktop# ./calculator
                            samdeb:/home/sam/Desktop#


                            just a User innately
                            اللهم اهدنا إلى الطيب من القول ؛ واهدنا إلى صراط الحميد

                            تعليق


                            • #15
                              اشتغل معك البرنامج

                              تعليق

                              يعمل...
                              X