Go言語とQtを使って、下記のような計算フォームを作成してみる。

arubaitokyuuyo


package main

import (
	"os"
	"strconv"

	"github.com/therecipe/qt/widgets"
)

//packageスコープ内に変数を定義しておくと、mainの中、外でも変数を使うことができる
var jikyuuInput *widgets.QLineEdit
var jikanInput *widgets.QLineEdit
var goukeiInput *widgets.QLineEdit

func main() {

	app := widgets.NewQApplication(len(os.Args), os.Args)

	window := widgets.NewQMainWindow(nil, 0)
	window.SetMinimumSize2(400, 200)
	window.SetWindowTitle("アルバイト給与")

	boxLayout := widgets.NewQBoxLayout(1, nil)
	widget := widgets.NewQWidget(nil, 0)

	goukeiInput = widgets.NewQLineEdit(nil)
	boxLayout.AddWidget(goukeiInput, 1, 0)

	ikoruLabel := widgets.NewQLabel2("=", nil, 0)
	boxLayout.AddWidget(ikoruLabel, 1, 0)

	jikanInput = widgets.NewQLineEdit(nil)
	jikanInput.ConnectEditingFinished(calcAndInsert) //jikanからフォーカスをはずした後、編集を終了したらcalcAndInsert関数を実行する
	boxLayout.AddWidget(jikanInput, 1, 0)

	kakeruLabel := widgets.NewQLabel2("×", nil, 0)
	boxLayout.AddWidget(kakeruLabel, 1, 0)

	jikyuuInput = widgets.NewQLineEdit(nil)
	boxLayout.AddWidget(jikyuuInput, 1, 0)
	jikanInput.ConnectEditingFinished(calcAndInsert) //jikyuuからフォーカスをはずした後、編集を終了したらcalcAndInsert関数を実行する
	jikyuuInput.ConnectEditingFinished(calcAndInsert)

	widget.SetLayout(boxLayout)
	window.SetCentralWidget(widget)

	window.Show()
	app.Exec()
}

//jikyuuとjikanのQLineEditから、入力された文字を取り出し、数字に変えて、掛け算した結果をgoukeiに入れる関数
func calcAndInsert() {
	str := jikyuuInput.Text()//jikyuuのQlineEditから文字を取り出す
	i, _ := strconv.Atoi(str)//文字を数字に変換する

	str1 := jikanInput.Text()//jikanのQlineEditから文字を取り出す
	j, _ := strconv.Atoi(str1//文字を数字に変換する
	res := i * j
	h := strconv.Itoa(res)//数字を文字に変換する
	goukeiInput.Clear()//goukeiのQlineEditに入力されている文字を消す
	goukeiInput.Insert(h)//goukeiに掛け算結果のhを入力する
}

掛け算をする機能の付け方をどうするかで悩んだ。まず、jikanInputとjikyuuInputのQlineEditに数字を入力した後、それを取り出すというコードが必要。取り出した数字はこの場合、文字として認識されているので、数字に変える必要がある。

どこかで、数字に変えたjikanInputとjikyuuInputを掛け合わせて、それをgoukeiInputに挿入して表示されればよい。

QlineEditに入力された文字を取り出すのに、Text()関数、文字を挿入するのに、Insert()関数があることがわかった。

問題は、jikyuuとjikanを入力した後、goukeiに文字が表示されるようにするにはどうすればよいかだが、構造体に紐づいたConnectEditingFinishedが使えるとわかった。これは関数を引数に取り、構造体の編集が終わった後、関数内の処理を実行するという関数である。

例えば、jikanInput.ConnectEditingFinished(calcAndInsert)すると、jikanInputの編集(入力)が終わった後、calcAndInsert関数を実行することになる。

これが使えることがわかったので、数字に変えたjikanInputとjikyuuInputを掛け合わせて、それをgoukeiInputに挿入するというcalcAndInsert関数を作成した。また、goukeiInput.Clear()をgoukeiInput.Insert(h)の前に入れないと、次に入力した時に入力した文字が消えないという不具合が発生する。