Add a with-main-window macro.
[commonqt:commonqt.git] / tutorial / conv.lisp
1 #|
2  Currency conversion example written by Robert Synnott.
3
4  http://myblog.rsynnott.com/2009/03/macos-fun-with-commonqt-qt-for-common.html
5 |#
6
7 (defpackage :qt-conv
8   (:use :cl :qt)
9   (:export :main))
10
11 (in-package :qt-conv)
12 (named-readtables:in-readtable :qt)
13
14 (defvar *qapp*)
15
16 (defclass my-window()
17   ((dollarAmount :accessor dollarAmount)
18    (conversionRate :accessor conversionRate)
19    (result :accessor result))
20   (:metaclass qt-class)
21   (:qt-superclass "QWidget")
22   (:slots ("convert()" convert)))
23
24 (defmethod convert ((instance my-window))
25   (let ((result (ignore-errors
26                  (* (read-from-string (#_text (dollarAmount instance)))
27                     (read-from-string (#_text (conversionRate instance)))))))
28     (#_setText (result instance) (if result
29                                      (princ-to-string result)
30                                      "ERROR"))))
31
32 (defmethod initialize-instance :after ((instance my-window) &key)
33   (new instance)
34   (#_setFixedSize instance 360 170)
35   (let ((convert (#_new QPushButton "Convert" instance)))
36     (setf (conversionRate instance) (#_new QLineEdit "1.00" instance)
37           (dollarAmount instance) (#_new QLineEdit "0.00" instance)
38           (result instance) (#_new QLineEdit "0.00" instance))
39     (#_move (#_new QLabel "Exchange Rate per $1:" instance) 20 20)
40     (#_move (#_new QLabel "Dollars to Covert:" instance) 20 60)
41     (#_move (#_new QLabel "Amount in other Currency:" instance) 20 100)
42     (#_move (dollarAmount instance) 200 60)
43     (#_move (conversionRate instance) 200 20)
44     (#_move (result instance) 200 100)
45     (#_move convert 220 130)
46     (connect convert "clicked()" instance "convert()")))
47
48 (defun main (&optional style)
49   (with-main-window (window (make-instance 'my-window))
50     (when style
51       (#_QApplication::setStyle
52        (#_QStyleFactory::create (ecase style
53                                   (:cde "CDE")
54                                   (:macintosh "Macintosh")
55                                   (:windows "Windows")
56                                   (:motif "Motif")))))))