#!/usr/bin/env ruby require "qte" require "qpe" include Qte include Qpe require 'bigdecimal' #require 'bigdecimal/math' #include BigMath class SampleWindow < QMainWindow MAX_DIGIT = 20 # LCD表示桁数 def initialize() super() setCaption(tr("電卓")) @f = QFrame.new(self, 'frame') setCentralWidget(@f) # 部品配置用グリッド 6x4 @v = QGridLayout.new(@f, 6, 4, 10, 10, 'grid') # @v.setRowStretch(0, 1) # @v.setRowStretch(1, 3) # @v.setRowStretch(2, 3) # @v.setRowStretch(3, 3) # @v.setRowStretch(4, 3) # @v.setRowStretch(5, 3) # LCD表示部分 @lcd = QLCDNumber.new(MAX_DIGIT, @f) @lcd.setSegmentStyle( QLCDNumber::Flat ) @lcd.setSmallDecimalPoint( true ) # グリッド1行目(0,0)-(0,3)に配置 @v.addMultiCellWidget(@lcd, 0,0,0,3) # ボタン用フォント @fnt_pb = QFont.new("helvetica",24, QFont::Bold) # ボタン定義 @pb_ac = QPushButton.new('AC', @f) @pb_ac.setFont(@fnt_pb) @v.addWidget(@pb_ac, 1, 3) @pb_7 = QPushButton.new('7', @f) @pb_7.setFont(@fnt_pb) @v.addWidget(@pb_7, 2, 0) @pb_8 = QPushButton.new('8', @f) @pb_8.setFont(@fnt_pb) @v.addWidget(@pb_8, 2, 1) @pb_9 = QPushButton.new('9', @f) @pb_9.setFont(@fnt_pb) @v.addWidget(@pb_9, 2, 2) @pb_div = QPushButton.new('/', @f) @pb_div.setFont(@fnt_pb) @v.addWidget(@pb_div, 2, 3) @pb_4 = QPushButton.new('4', @f) @pb_4.setFont(@fnt_pb) @v.addWidget(@pb_4, 3, 0) @pb_5 = QPushButton.new('5', @f) @pb_5.setFont(@fnt_pb) @v.addWidget(@pb_5, 3, 1) @pb_6 = QPushButton.new('6', @f) @pb_6.setFont(@fnt_pb) @v.addWidget(@pb_6, 3, 2) @pb_mul = QPushButton.new('X', @f) @pb_mul.setFont(@fnt_pb) @v.addWidget(@pb_mul, 3, 3) @pb_1 = QPushButton.new('1', @f) @pb_1.setFont(@fnt_pb) @v.addWidget(@pb_1, 4, 0) @pb_2 = QPushButton.new('2', @f) @pb_2.setFont(@fnt_pb) @v.addWidget(@pb_2, 4, 1) @pb_3 = QPushButton.new('3', @f) @pb_3.setFont(@fnt_pb) @v.addWidget(@pb_3, 4, 2) @pb_sub = QPushButton.new('-', @f) @pb_sub.setFont(@fnt_pb) @v.addWidget(@pb_sub, 4, 3) @pb_0 = QPushButton.new('0', @f) @pb_0.setFont(@fnt_pb) @v.addWidget(@pb_0, 5, 0) @pb_point = QPushButton.new('.', @f) @pb_point.setFont(@fnt_pb) @v.addWidget(@pb_point, 5, 1) @pb_equal = QPushButton.new('=', @f) @pb_equal.setFont(@fnt_pb) @v.addWidget(@pb_equal, 5, 2) @pb_add = QPushButton.new('+', @f) @pb_add.setFont(@fnt_pb) @v.addWidget(@pb_add, 5, 3) connect(@pb_ac, QSIGNAL("clicked()"), self, 'push_ac') connect(@pb_9, QSIGNAL("clicked()"), self, 'push_9') connect(@pb_8, QSIGNAL("clicked()"), self, 'push_8') connect(@pb_7, QSIGNAL("clicked()"), self, 'push_7') connect(@pb_6, QSIGNAL("clicked()"), self, 'push_6') connect(@pb_5, QSIGNAL("clicked()"), self, 'push_5') connect(@pb_4, QSIGNAL("clicked()"), self, 'push_4') connect(@pb_3, QSIGNAL("clicked()"), self, 'push_3') connect(@pb_2, QSIGNAL("clicked()"), self, 'push_2') connect(@pb_1, QSIGNAL("clicked()"), self, 'push_1') connect(@pb_0, QSIGNAL("clicked()"), self, 'push_0') connect(@pb_point, QSIGNAL("clicked()"), self, 'push_point') connect(@pb_equal, QSIGNAL("clicked()"), self, 'push_equal') connect(@pb_div, QSIGNAL("clicked()"), self, 'push_div') connect(@pb_mul, QSIGNAL("clicked()"), self, 'push_mul') connect(@pb_sub, QSIGNAL("clicked()"), self, 'push_sub') connect(@pb_add, QSIGNAL("clicked()"), self, 'push_add') @max = MAX_DIGIT + 2 push_ac end # 文字列をLCDに表示 def display(str) # str = String s = str s = str.split(/\./)[0] if str =~ /\./ if s.size > MAX_DIGIT || str == 'Infinity' @lcd.display('Error') return nil end if str =~ /\./ nstring = str[0, 21] else nstring = str[0, 20] end @lcd.display(nstring) true end # All Clear def push_ac clr_input @ope = nil @stack = nil display(@input) end def clr_input @input = '0' @point = false end # 数字キー入力 def push_num(str) # str= String @stack = nil if !@ope && @stack return if @input.size > MAX_DIGIT case str when '.' if !@point @input << str @point = true end when '0' @input << str if @input != '0' else if @input == '0' @input = str else @input << str end end display(@input) end # 演算子キー入力 def push_ope(str) # str = String if !@stack @stack = BigDecimal(@input, @max) else @ope calc(@ope) display(@stack.to_s('F')) end @ope = str clr_input end # イコールキー入力 def push_equal if @ope calc(@ope) else @stack = BigDecimal(@input, @max) end @ope = nil clr_input display(@stack.to_s('F')) end # @inputと@stackで計算し結果を@stackへ def calc(str) # str = String case str when '/' @stack = @stack / BigDecimal(@input) when '*' @stack = @stack * BigDecimal(@input) when '-' @stack = @stack - BigDecimal(@input) when '+' @stack = @stack + BigDecimal(@input) end end def push_9 push_num('9') end def push_8 push_num('8') end def push_7 push_num('7') end def push_6 push_num('6') end def push_5 push_num('5') end def push_4 push_num('4') end def push_3 push_num('3') end def push_2 push_num('2') end def push_1 push_num('1') end def push_0 push_num('0') end def push_point push_num('.') end def push_div push_ope('/') end def push_mul push_ope('*') end def push_sub push_ope('-') end def push_add push_ope('+') end end $defaultCodec = QTextCodec.codecForName("utf8") app = QPEApplication.new([$0]+ARGV) app.setDefaultCodec($defaultCodec) QApplication.setFont(QFont.new("lcfont",18)) app.showMainWidget(SampleWindow.new) app.exec