برنامه‌نویسی گرافیکی آسان با چارچوب Qt-قسمت هشتم

برنامه‌نویسی گرافیکی آسان با چارچوب Qt-قسمت هشتم

در این جلسه می‌خواهیم قلب ماشین حساب را با جاوااکسریپت بنویسیم و در qml آن را فراخوانی کنیم. برای این کار یک فایل جدید به نام calulator.js می‌سازیم.

var curVal = 0 مقدار جواب در این متغیر قرار می‌گیرد
var memory = 0 مقدارحافظه ماشین حساب در این متغیر قرار می‌گیرد
var lastOp = "" آخرین دکمه چهار عمل اصلی که زده می‌شود
var previousOperator = "" دکمه چهار عمل اصلی قبلی که وارد شده است
var digits = "" ارقام وارد شده در این متغیر قرار می‌گیرند
حال نیاز به تابعی داریم که مشخص می‌کند دکمه فشرده شده فعال است یا به عبارتی مجاز است یا خیر.

  

  function disabled(op) {
  

      if (digits == "" && !((op >= "0" && op <= "9") || op == "."))
  

          return true
  

      else if (op == '=' && previousOperator.length != 1)
  

          return true
  

      else if (op == "." && digits.toString().search(/\./) != -1) {
  

          return true
  

      } else if (op == "√" &&  digits.toString().search(/-/) != -1) {
  

          return true
  

      } else {
  

          return false
  

      }
  

  }


سپس نیاز به تابعی داریم که دکمه ورودی را بخواند و مجاز بودن یا خلاف آن را توسط تابع بالا تست نماید و در صورتی که مجاز بود آن را در متغیر مربوطه قرار دهد. در صورتی که دکمه ورودی مربوط به عملگرها باشد آن را در متغیر lastOp قرار دهد.

  

  function digitPressed(op)
  

  {
  

      if (disabled(op))
  

          return
  

      if (digits.toString().length >= display.maxDigits)
  

          return
  

      if (lastOp.toString().length == 1 && ((lastOp >= "0" && lastOp <= "9") || lastOp == ".") ) {
  

          digits = digits + op.toString()
  

          display.appendDigit(op.toString())
  

      } else {
  

          digits = op
  

          display.appendDigit(op.toString())
  

      }
  

      lastOp = op
  

  }

 

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

  

  function operatorPressed(op)
  

  {
  

      if (disabled(op))
  

          return
  

      lastOp = op
  

      if (op == "±") {
  

              digits = Number(digits.valueOf() * -1)
  

              display.setDigit(display.displayNumber(digits))
  

              return
  

          }
  

      if (previousOperator == "+") {
  

          digits = Number(digits.valueOf()) + Number(curVal.valueOf())
  

      } else if (previousOperator == "−") {
  

          digits = Number(curVal.valueOf()) - Number(digits.valueOf())
  

      } else if (previousOperator == "×") {
  

          digits = Number(curVal) * Number(digits.valueOf())
  

      } else if (previousOperator == "÷") {
  

          digits = Number(curVal) / Number(digits.valueOf())
  

      }
  

      if (op == "+" || op == "−" || op == "×" || op == "÷") {
  

          previousOperator = op
  

          curVal = digits.valueOf()
  

          digits = ""
  

          display.displayOperator(previousOperator)
  

          return
  

      }
  

      if (op == "=") {
  

          display.newLine("=", digits.valueOf())
  

      }
  

      curVal = 0
  

      previousOperator = ""
  

      if (op == "1/x") {
  

          digits = (1 / digits.valueOf()).toString()
  

      } else if (op == "x^2") {
  

          digits = (digits.valueOf() * digits.valueOf()).toString()
  

      } else if (op == "Abs") {
  

          digits = (Math.abs(digits.valueOf())).toString()
  

      } else if (op == "Int") {
  

          digits = (Math.floor(digits.valueOf())).toString()
  

      } else if (op == "√") {
  

          digits = Number(Math.sqrt(digits.valueOf()))
  

          display.newLine("√", digits.valueOf())
  

      } else if (op == "mc") {
  

          memory = 0;
  

      } else if (op == "m+") {
  

          memory += digits.valueOf()
  

      } else if (op == "mr") {
  

          digits = memory.toString()
  

      } else if (op == "m-") {
  

          memory = digits.valueOf()
  

      } else if (op == "backspace") {
  

          digits = digits.toString().slice(0, -1)
  

          display.clear()
  

          display.appendDigit(digits)
  

      } else if (op == "Off") {
  

          Qt.quit();
  

      }
  

      // Reset the state on 'C' operator or after
  

      // an error occurred
  

      if (op == "C" || display.isError) {
  

          display.clear()
  

          curVal = 0
  

          memory = 0
  

          lastOp = ""
  

          digits = ""
  

      }
  

  }


توابعی که در این فایل استفاده شده‌اند ولی تعریف نشده‌اند را می‌خواهیم در بدنه خود qml بنویسیم. به همین منظور فایل مورد نظر را ذخیره کنید که این فایل را در فایل qml ماشین حساب import کنیم. برای ‌import کردن فایل جاوااسکریپت در فایل qml ابتدا باید توجه نمایید که فایل جاوااسکریپت اگر در یک دایرکتوری قرار دارد ابتدا دایرکتوری را import کنید. همچنین اگر فایل‌های qml دیگر پروژه در یک دایرکتوری قرار دارند برای دسترسی به آن‌ها باید دایرکتوری آن‌ها import شود. برای مثال فرض کنید که فایل جاوااسکریپت در دایرکتوری content قرار دارد.

  

  Import “content”
  

  import “content/caculator.js”


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

  

  Import “calcuator.js” as CalcEngine


در کد بالا از کلمه کلیدی as استفاده شده است. این کلمه برای گذاشتن اسم مستعار بر روی کتابخانه import شده استفاده می‌شود. در اینجا برای استفاده از calculator.js که با جاوااسکریپت نوشته شده و نه qml برای دستیابی به آن باید از as استفاده کرده و بعد نام مستعاری برای آن قرار داد که از این پس از طریق CalcEngine بتوان به توابع آن دسترسی پیدا کرد.

 

امین  خزاعی

امین خزاعی

امین، برنامه نویس سیستمی و امنیت و ساکن شیراز. عاشق گنو/ لینوکس و نرم افزار آزاد. امین اعتقاد دارد همیشه باید برای توسعه نرم افزارهای آزاد و گسترش فرهنگ آزادی در نرم افزار وقت گذاشت.


0 نظر درباره‌ی این پست نوشته شده است.

ثبت نظر