2 single: デスクトップとモバイル開発 (RingQt); はじめに
4 ===================================
6 ===================================
8 Ring アプリケーション (デスクトップとモバイル) 開発のために Qt フレームワーククラスの用法を学びます。
11 pair: RingQt によるデスクトップとモバイル開発; はじめての GUI アプリケーション
15 ===============================
17 この用例では、彼氏、彼女の名前を質問するアプリケーションを作成します。
18 ユーザがテキストボックスへ名前を入力して “Say Hello” ボタンをクリックした後に、
19 “Hello ” を名前へ追加することでテキストボックスの値を更新します。
27 win1 = new qWidget() {
29 setwindowtitle("Hello World")
30 setGeometry(100,100,370,250)
32 label1 = new qLabel(win1) {
33 settext("What is your name ?")
34 setGeometry(10,20,350,30)
35 setalignment(Qt_AlignHCenter)
38 btn1 = new qpushbutton(win1) {
39 setGeometry(10,200,100,30)
41 setclickevent("pHello()")
44 btn1 = new qpushbutton(win1) {
45 setGeometry(150,200,100,30)
47 setclickevent("pClose()")
50 lineedit1 = new qlineedit(win1) {
51 setGeometry(10,100,350,30)
61 lineedit1.settext( "Hello " + lineedit1.text())
70 .. image:: ringqt_shot1.jpg
73 そして Say Hello ボタンをクリックします。
75 .. image:: ringqt_shot2.jpg
79 pair: デスクトップとモバイル開発 (RingQt); イベントループ
84 qApp クラスから exec() メソッドを呼び出すときは Qt はイベント駆動とイベントループで制御します。
86 一度でも exec() を呼び出すと、イベントループを開始し、ウィジェットは様々なイベントへの応答を開始します (マウス、キーボード、タイマーなど)。
88 イベントが発行されてコールバック関数が呼び出されるときは再び制御を戻します。
90 コールバック関数の実行完了後、制御をイベントループへ再び戻します。
94 (1) ほとんどの作業は標準イベントで行います (イベントは各種ウィジェットで用意されています)。
96 (2) イベントフィルタを使うとウィジェットにイベントを追加できます。
98 (3) タイマーを使うと制御を戻します。これにより、各種検査を簡単にできます。
100 コールバック関数で処理時間がかかり、ビジー状態であるとき、 GUI の停止を回避するために qApp クラスで ProcessEvents() メソッドを呼び出せます。
106 exec() メソッドを呼び出さずに、メインループを作成することもできます。
108 この方法は非推奨であり、選択肢の一つに過ぎません。
112 # exec() メソッドを呼び出さない方法
114 oApp.processevents() # GUI イベントへの応答
115 # さらにコードを追加することで、制御を行います!
120 pair: RingQt によるデスクトップとモバイル開発; レイアウトの用法
125 この用例は、前述のアプリケーションで垂直レイアウトを使用するように更新したものです。
133 win1 = new qWidget() {
135 setwindowtitle("Hello World")
136 setGeometry(100,100,400,130)
137 label1 = new qLabel(win1) {
138 settext("What is your name ?")
139 setGeometry(10,20,350,30)
140 setalignment(Qt_AlignHCenter)
142 btn1 = new qpushbutton(win1) {
143 setGeometry(10,200,100,30)
145 setclickevent("pHello()")
147 btn2 = new qpushbutton(win1) {
148 setGeometry(150,200,100,30)
150 setclickevent("pClose()")
152 lineedit1 = new qlineedit(win1) {
153 setGeometry(10,100,350,30)
155 layout1 = new qVBoxLayout() {
161 win1.setlayout(layout1)
170 lineedit1.settext( "Hello " + lineedit1.text())
177 .. image:: ringqt_shot3.jpg
181 pair: RingQt によるデスクトップとモバイル開発; QTextEdit クラスの用法
184 ==========================
186 この用例では、 QTextEdit クラスを使用しています。
194 win1 = new qWidget() {
196 setwindowtitle("QTextEdit Class")
197 setGeometry(100,100,500,500)
199 new qtextedit(win1) {
200 setGeometry(10,10,480,480)
210 実行中は qtextedit へリッチテキストを貼り付けることができます。
212 .. image:: ringqt_shot4.jpg
216 pair: RingQt によるデスクトップとモバイル開発; QListWidget クラスの用法
219 ============================
221 この用例では、 QListWidget クラスを使用しています。
229 win1 = new qWidget() {
231 setGeometry(100,100,400,400)
233 list1 = new qlistwidget(win1) {
234 setGeometry(150,100,200,200)
235 alist = ["one","two","three","four","five"]
236 for x in alist additem(x) next
238 win1.setwindowtitle("Items Count : " + count() )
241 btn1 = new qpushbutton(win1) {
242 setGeometry(10,200,100,30)
243 settext("selected item")
244 setclickevent("pWork()")
247 btn2 = new qpushbutton(win1) {
248 setGeometry(10,240,100,30)
249 settext("Delete item")
250 setclickevent("pWork2()")
260 btn1.settext(string(list1.currentrow()))
264 takeitem(currentrow())
269 .. image:: ringqt_shot5.jpg
270 :alt: QListWidget Class
281 win1 = new qWidget() {
283 setGeometry(100,100,500,400)
285 list1 = new qlistwidget(win1) {
286 setGeometry(150,100,200,200)
287 alist = ["one","two","three","four","five"]
288 for x in alist additem(x) next
291 win1.setwindowtitle("Items Count : " + count() )
294 btn1 = new qpushbutton(win1) {
295 setGeometry(10,200,100,30)
296 settext("selected item")
297 setclickevent("pWork()")
300 btn2 = new qpushbutton(win1) {
301 setGeometry(10,240,100,30)
302 settext("Delete item")
303 setclickevent("pWork2()")
314 nbrOfItems = list1.count()
315 curItemNbr = list1.currentrow()
316 curValue = list1.item(list1.currentrow()).text()
318 win1.setwindowtitle( "After Select - NbrOfItems: " + nbrOfItems +
319 " CurItemNbr: " + curItemNbr + " CurValue: " + curValue )
321 btn1.settext( string(list1.currentrow() ) + " --- " +
322 list1.item(list1.currentrow()).text() )
328 takeitem(currentrow())
331 curItemNbr = currentrow()
332 curValue = item(currentrow()).text()
334 win1.setwindowtitle("After Delete - NbrOfItems: " + nbrOfItems +
335 " CurItemNbr: " + curItemNbr +" CurValue: " + curValue )
341 pair: RingQt によるデスクトップとモバイル開発; QTreeView および QFileSystemModel の用法
343 QTreeView および QFileSystemModel の用法
344 ============================================
346 この用例では、ファイルシステムを表示するために QTreeView ウィジェットの用法を学びます。
354 win1 = New qWidget() {
356 setwindowtitle("Using QTreeView and QFileSystemModel")
357 setGeometry(100,100,500,400)
359 New qtreeview(win1) {
360 setGeometry(00,00,500,400)
362 ofile = new QFileSystemModel()
363 ofile.setrootpath(oDir.currentpath())
375 .. image:: ringqt_shot6.jpg
376 :alt: QTreeView および QFileSystemModel
379 pair: RingQt によるデスクトップとモバイル開発; QTreeWidget と QTreeWidgetItem の用法
381 QTreeWidget と QTreeWidgetItem の用法
382 =========================================
384 この用例では、 QTreeWidget および QTreeWidgetItem クラスを学びます。
392 win1 = new qWidget() {
394 setwindowtitle("TreeWidget")
395 setGeometry(100,100,400,400)
397 layout1 = new qvboxlayout()
399 tree1 = new qtreewidget(win1) {
400 setGeometry(00,00,400,400)
402 myitem = new qtreewidgetitem()
403 myitem.settext(0,"The First Step")
404 addtoplevelitem(myitem)
406 myitem2 = new qtreewidgetitem()
407 myitem2.settext(0,"hello"+x)
408 myitem.addchild(myitem2)
410 myitem3 = new qtreewidgetitem()
411 myitem3.settext(0,"hello"+x)
412 myitem2.addchild(myitem3)
415 setheaderlabel("Steps Tree")
418 layout1.addwidget(tree1)
429 .. image:: ringqt_shot7.jpg
430 :alt: QTreeWidget と QTreeWidgetItem
433 pair: RingQt によるデスクトップとモバイル開発; QComboBox クラスの用法
436 ==========================
438 この用例では、 QComboBox クラスを学びます。
446 win1 = new qWidget() {
448 setwindowtitle("Using QComboBox")
449 setGeometry(100,100,400,400)
451 New QComboBox(win1) {
452 setGeometry(150,100,200,30)
453 alist = ["one","two","three","four","five"]
454 for x in aList additem(x,0) next
466 .. image:: ringqt_shot8.jpg
471 pair: RingQt によるデスクトップとモバイル開発; メニューバーの作成方法
474 ======================
476 この用例では、 QMenuBar クラスを学びます。
484 win1 = new qWidget() {
486 setwindowtitle("Using QMenubar")
487 setGeometry(100,100,400,400)
489 menu1 = new qmenubar(win1) {
490 sub1 = addmenu("File")
491 sub2 = addmenu("Edit")
492 sub3 = addmenu("Help")
494 oAction = new qAction(win1) {
498 oAction = new qAction(win1) {
502 oAction = new qAction(win1) {
506 oAction = new qAction(win1) {
511 oAction = new qaction(win1) {
513 setclickevent("myapp.quit()")
518 oAction = new qAction(win1) {
522 oAction = new qAction(win1) {
526 oAction = new qAction(win1) {
531 oAction = new qAction(win1) {
532 settext("Select All")
537 oAction = new qAction(win1) {
541 sub4 = addmenu("Sub Menu")
543 oAction = new qAction(win1) {
547 oAction = new qAction(win1) {
551 oAction = new qAction(win1) {
557 oAction = new qAction(win1) {
570 .. image:: ringqt_shot9.jpg
574 pair: RingQt によるデスクトップとモバイル開発; コンテキストメニュー
586 win = new qwidget() {
587 setwindowtitle("Context Menu")
589 myfilter = new qAllEvents(win) {
590 setContextmenuEvent("mymenu()")
592 installeventfilter(myfilter)
602 oAction = new qAction(win) {
604 SetCLickevent("See :New")
607 oAction = new qAction(win) {
609 SetCLickevent("See :Open")
612 oAction = new qAction(win) {
614 SetCLickevent("See :Save")
617 oAction = new qAction(win) {
619 SetCLickevent("See :Close")
622 oCursor = new qCursor()
629 pair: RingQt によるデスクトップとモバイル開発; ツールバーの作成方法
634 この用例では、 QToolBar クラスを学びます。
642 win1 = new qMainWindow() {
644 setwindowtitle("Using QToolbar")
645 setGeometry(100,100,600,400)
648 new qpushbutton(win1) { settext("Add") } ,
649 new qpushbutton(win1) { settext("Edit") } ,
650 new qpushbutton(win1) { settext("Find") } ,
651 new qpushbutton(win1) { settext("Delete") } ,
652 new qpushbutton(win1) { settext("Exit")
653 setclickevent("win1.close()") }
656 tool1 = new qtoolbar(win1) {
657 for x in abtns addwidget(x) addseparator() next
659 setGeometry(0,0,500,30)
671 .. image:: ringqt_shot10.jpg
675 pair: RingQt によるデスクトップとモバイル開発; ステータスバーの作成方法
678 ========================
680 この用例では、 QStatusBar クラスを学びます。
688 win1 = new qMainWindow() {
690 setwindowtitle("Using QStatusbar")
691 setGeometry(100,100,400,400)
693 status1 = new qstatusbar(win1) {
694 showmessage("Ready!",0)
697 setstatusbar(status1)
706 .. image:: ringqt_shot11.jpg
711 pair: RingQt によるデスクトップとモバイル開発; QDockWidget の用法
714 ======================
716 この用例では、 QDockWidget クラスを学びます。
724 win1 = new qMainWindow() {
726 setwindowtitle("QDockWidget")
727 setGeometry(100,100,400,400)
729 label1 = new qlabel(win1) {
731 setGeometry(300,300,100,100)
734 label2 = new qlabel(win1) {
735 settext("How are you ?")
736 setGeometry(100,100,100,100)
739 dock1 = new qdockwidget(win1,0) {
744 dock2 = new qdockwidget(win1,0) {
749 adddockwidget(Qt_LeftDockWidgetArea,dock1,Qt_Horizontal)
750 adddockwidget(Qt_LeftDockWidgetArea,dock2,Qt_Vertical)
759 .. image:: ringqt_shot12.jpg
763 pair: RingQt によるデスクトップとモバイル開発; QTabWidget の用法
766 =====================
768 この用例では、 QTabWidget クラスを学びます。
776 win1 = new qMainWindow() {
778 setwindowtitle("Using QTabWidget")
779 setGeometry(100,100,400,400)
781 page1 = new qwidget() {
782 new qpushbutton(page1) {
783 settext("The First Page")
787 page2 = new qwidget() {
788 new qpushbutton(page2) {
789 settext("The Second Page")
793 page3 = new qwidget() {
794 new qpushbutton(page3) {
795 settext("The Third Page")
799 tab1 = new qtabwidget(win1) {
800 inserttab(0,page1,"Page 1")
801 inserttab(1,page2,"Page 2")
802 inserttab(2,page3,"Page 3")
803 setGeometry(100,100,400,400)
806 status1 = new qstatusbar(win1) {
807 showmessage("Ready!",0)
810 setstatusbar(status1)
819 .. image:: ringqt_shot13.jpg
823 pair: RingQt によるデスクトップとモバイル開発; QTableWidget の用法
826 =======================
828 この用例では、 QTableWidget クラスを学びます。
836 win1 = new qMainWindow() {
838 setGeometry(100,100,1100,370)
839 setwindowtitle("Using QTableWidget")
841 Table1 = new qTableWidget(win1) {
843 setrowcount(10) setcolumncount(10)
844 setGeometry(0,0,800,400)
845 setselectionbehavior(QAbstractItemView_SelectRows)
849 item1 = new qtablewidgetitem("R"+X+"C"+Y)
850 setitem(x-1,y-1,item1)
856 setcentralwidget(table1)
867 .. image:: ringqt_shot14.jpg
871 pair: RingQt によるデスクトップとモバイル開発; QProgressBar の用法
874 =======================
876 この用例では、 QProgressBar クラスを学びます。
883 win1 = new qMainWindow() {
885 setGeometry(100,100,600,150)
886 setwindowtitle("Using QProgressBar")
888 for x = 10 to 100 step 10
889 new qprogressbar(win1) {
890 setGeometry(100,x,350,30)
902 .. image:: ringqt_shot15.jpg
906 pair: RingQt によるデスクトップとモバイル開発; QSpinBox の用法
911 この用例では、 QSpinBox クラスを学びます。
918 win1 = new qMainWindow() {
919 setGeometry(100,100,450,260)
920 setwindowtitle("Using QSpinBox")
922 setGeometry(50,100,350,30)
932 .. image:: ringqt_shot16.jpg
936 pair: RingQt によるデスクトップとモバイル開発; QSlider の用法
941 この用例では、 QSlider クラスを学びます。
949 win1 = new qMainWindow() {
951 setGeometry(100,100,500,400)
952 setwindowtitle("Using QSlider")
955 setGeometry(100,100,50,130)
960 setGeometry(100,250,250,30)
962 setorientation(Qt_Horizontal)
974 .. image:: ringqt_shot17.jpg
978 pair: RingQt によるデスクトップとモバイル開発; QDateEdit の用法
983 この用例では、 QDateEdit クラスを学びます。
990 win1 = new qMainWindow() {
991 setwindowtitle("Using QDateEdit")
992 setGeometry(100,100,250,100)
993 new qdateedit(win1) {
994 setGeometry(20,40,220,30)
1003 .. image:: ringqt_shot18.jpg
1007 pair: RingQt によるデスクトップとモバイル開発; QDial の用法
1013 この用例では、 QDial クラスを学びます。
1015 .. code-block:: ring
1020 win1 = new qMainWindow() {
1021 setGeometry(100,100,450,500)
1022 setwindowtitle("Using QDial")
1024 setGeometry(100,100,250,300)
1033 .. image:: ringqt_shot19.jpg
1038 .. code-block:: ring
1043 win1 = new qMainWindow()
1045 setGeometry(100,100,450,500)
1046 setwindowtitle("Using QDial")
1047 button1 = new QPushButton(win1){
1048 setGeometry(100,350,100,30)
1049 settext("Increment")
1050 setClickEvent("pIncrement()")
1053 button2 = new QPushButton(win1){
1054 setGeometry(250,350,100,30)
1055 settext("Decrement")
1056 setClickEvent("pDecrement()")
1058 pdial = new qdial(win1) {
1059 setGeometry(100,50,250,300)
1060 setNotchesVisible(true)
1062 SetValueChangedEvent("pDialMove()")
1064 lineedit1 = new qlineedit(win1) {
1065 setGeometry(200,400,50,30)
1066 setalignment(Qt_AlignHCenter)
1067 settext(string(pdial.value()))
1068 setreturnPressedEvent("pPress()")
1077 pdial.setvalue(val+1)
1078 lineedit1{settext(string(val+1))}
1082 pdial.setvalue(val-1)
1083 lineedit1{settext(string(val-1))}
1086 lineedit1{val=text()}
1087 pdial.setvalue(number(val))
1090 lineedit1.settext(""+pdial.value())
1093 .. image:: usingqdial.png
1098 pair: RingQt によるデスクトップとモバイル開発; QWebView の用法
1103 この用例では、 QWebView クラスを学びます。
1105 .. code-block:: ring
1110 win1 = new qMainWindow() {
1111 setwindowtitle("QWebView")
1112 myweb = new qwebview(win1) {
1113 setGeometry(10,10,600,600)
1114 loadpage(new qurl("http://google.com"))
1116 setcentralwidget(myweb)
1124 .. image:: ringqt_shot20.jpg
1129 pair: RingQt によるデスクトップとモバイル開発; QCheckBox の用法
1132 ====================
1134 この用例では、 QCheckBox クラスを学びます。
1136 .. code-block:: ring
1141 win1 = new qMainWindow() {
1142 setwindowtitle("Using QCheckBox")
1143 new qcheckbox(win1) {
1144 setGeometry(100,100,100,30)
1145 settext("New Customer!")
1154 .. image:: ringqt_shot21.jpg
1160 .. code-block:: ring
1165 win1 = new qMainWindow() {
1166 setGeometry(100,100,400,300)
1167 setwindowtitle("Using QCheckBox")
1169 ### 0: チェックされていない。 1: チェックされた。
1171 CheckBox = new qcheckbox(win1) {
1172 setGeometry(100,100,160,30)
1173 settext("New Customer!")
1174 setclickedEvent("HandleClickEvent()")
1182 Func HandleClickEvent
1184 if CheckBox.isChecked() = 1
1185 CheckBox.settext("New Customer. Check 1-ON")
1187 CheckBox.settext("New Customer. Check 0-OFF")
1192 pair: RingQt によるデスクトップとモバイル開発; QRadioButton と QButtonGroup の用法
1194 QRadioButton と QButtonGroup の用法
1195 =======================================
1197 この用例では、 QRadioButton および QButtonGroup クラスを学びます。
1199 .. code-block:: ring
1205 win1 = new qMainWindow() {
1207 setwindowtitle("Using QRadioButton")
1209 new qradiobutton(win1) {
1210 setGeometry(100,100,100,30)
1213 new qradiobutton(win1) {
1214 setGeometry(100,150,100,30)
1217 new qradiobutton(win1) {
1218 setGeometry(100,200,100,30)
1223 group2 = new qbuttongroup(win1) {
1224 btn4 = new qradiobutton(win1) {
1225 setGeometry(200,150,100,30)
1228 btn5 = new qradiobutton(win1) {
1229 setGeometry(200,200,100,30)
1245 .. image:: ringqt_shot22.jpg
1246 :alt: QRadioButton と QButtonGroup の用法
1249 pair: RingQt によるデスクトップとモバイル開発; QLabel へハイパーリンクを追加するには
1251 QLabel へハイパーリンクを追加するには
1252 =====================================
1254 この用例では、 QLabel クラスでハイパーリンクを作成する方法を学びます。
1256 .. code-block:: ring
1261 win1 = new qMainWindow() {
1262 setwindowtitle("QLabel - Hyperlink")
1264 setGeometry(100,100,100,30)
1265 setopenexternallinks(true)
1266 settext('<a href="http://google.com">Google</a>')
1275 .. image:: ringqt_shot23.jpg
1279 pair: RingQt によるデスクトップとモバイル開発; QVideoWidget と QMediaPlayer
1281 QVideoWidget と QMediaPlayer
1282 =============================
1284 この用例では、 QVideoWidget および QMediaPlayer クラスで動画のグループを
1285 異なる位置から同時再生する方法を学びます。
1288 .. code-block:: ring
1294 win1 = new qMainWindow() {
1296 setwindowtitle("QVideoWidget")
1298 btn1 = new qpushbutton(win1) {
1299 setGeometry(0,0,100,30)
1301 setclickevent("player.play() player2.play()
1302 player3.play() player4.play()")
1305 videowidget = new qvideowidget(win1) {
1306 setGeometry(50,50,600,300)
1307 setstylesheet("background-color: black")
1310 videowidget2 = new qvideowidget(win1) {
1311 setGeometry(700,50,600,300)
1312 setstylesheet("background-color: black")
1316 videowidget3 = new qvideowidget(win1) {
1317 setGeometry(50,370,600,300)
1318 setstylesheet("background-color: black")
1321 videowidget4 = new qvideowidget(win1) {
1322 setGeometry(700,370,600,300)
1323 setstylesheet("background-color: black")
1326 player = new qmediaplayer() {
1327 setmedia(new qurl("1.mp4"))
1328 setvideooutput(videowidget)
1329 setposition(35*60*1000)
1333 player2 = new qmediaplayer() {
1334 setmedia(new qurl("2.mp4"))
1335 setvideooutput(videowidget2)
1336 setposition(23*60*1000)
1339 player3 = new qmediaplayer() {
1340 setmedia(new qurl("3.mp4"))
1341 setvideooutput(videowidget3)
1342 setposition(14.22*60*1000)
1345 player4 = new qmediaplayer() {
1346 setmedia(new qurl("4.avi"))
1347 setvideooutput(videowidget4)
1348 setposition(8*60*1000)
1362 .. image:: ringqt_shot24.jpg
1367 pair: RingQt によるデスクトップとモバイル開発; QFrame の用法
1372 この用例では、 QFrame クラスを学びます。
1374 .. code-block:: ring
1379 win1 = new qMainWindow() {
1380 setwindowtitle("Using QFrame")
1382 frame1 = new qframe(win1,0) {
1383 setGeometry(100,20+50*x,400,30)
1384 setframestyle(QFrame_Raised | QFrame_WinPanel)
1395 .. image:: ringqt_shot25.jpg
1400 pair: RingQt によるデスクトップとモバイル開発; QLabel による画像の表示方法
1403 ===============================
1405 QLabel ウイジェットによる画像の表示方法を学びます。
1407 .. code-block:: ring
1412 win1 = new qMainWindow() {
1413 setwindowtitle("QLabel - Display image")
1415 image = new qpixmap("b:/mahmoud/photo/advice.jpg")
1417 setGeometry(0,0,image.width(),image.height())
1426 .. image:: ringqt_shot26.jpg
1431 pair: RingQt によるデスクトップとモバイル開発; メニューバーとスタイルシートの用例
1434 ==================================
1436 メニューバーの作成、およびウィンドウのスタイルシートの設定方法を学びます。
1438 .. code-block:: ring
1444 win1 = new qMainWindow() {
1446 setwindowtitle("Menubar")
1448 menu1 = new qmenubar(win1) {
1449 sub1 = addmenu("File")
1451 oAction = new qAction(win1) {
1456 oAction = new qAction(win1) {
1460 setstatustip("open new file")
1463 oAction = new qAction(win1) {
1467 oAction = new qAction(win1) {
1473 oAction = new qaction(win1)
1474 oAction.settext("Exit")
1475 oAction.setclickevent("myapp.quit()")
1480 status1 = new qstatusbar(win1) {
1481 showmessage("Ready!",0)
1484 setmousetracking(true)
1485 setstatusbar(status1)
1486 setStyleSheet("color: black; selection-color: black;
1487 selection-background-color:white ;
1488 background: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1,
1489 stop: 0 #eef, stop: 1 #ccf);")
1497 .. image:: ringqt_shot27.jpg
1501 pair: RingQt によるデスクトップとモバイル開発; QLineEdit イベントと QMessageBox
1503 QLineEdit イベントと QMessageBox
1504 ================================
1506 QLineEdit イベントの用法、およびメッセージボックスの表示方法を学びます。
1508 .. code-block:: ring
1514 win1 = new qWidget() {
1516 setwindowtitle("Welcome")
1517 setGeometry(100,100,400,300)
1520 label1 = new qLabel(win1) {
1521 settext("What is your name ?")
1522 setGeometry(10,20,350,30)
1523 setalignment(Qt_AlignHCenter)
1526 btn1 = new qpushbutton(win1) {
1527 setGeometry(10,200,100,30)
1528 settext("Say Hello")
1529 setclickevent("pHello()")
1532 btn1 = new qpushbutton(win1) {
1533 setGeometry(150,200,100,30)
1535 setclickevent("pClose()")
1538 lineedit1 = new qlineedit(win1) {
1539 setGeometry(10,100,350,30)
1540 settextchangedevent("pChange()")
1541 setreturnpressedevent("penter()")
1551 lineedit1.settext( "Hello " + lineedit1.text())
1557 win1 { setwindowtitle( lineedit1.text() ) }
1560 new qmessagebox(win1) {
1561 setwindowtitle("Thanks")
1562 settext("Hi " + lineedit1.text() )
1563 setstylesheet("background-color : white")
1569 .. image:: ringqt_shot28.jpg
1570 :alt: QLineEdit イベントと QMessageBox
1572 .. image:: ringqt_shot29.jpg
1573 :alt: QLineEdit イベントと QMessageBox
1576 pair: RingQt によるデスクトップとモバイル開発; そのほかのウイジェットイベント
1579 ==============================
1581 各 Qt シグナルは RingQt で使えます。シグナル名の前に設定を行うことで追加、
1582 およびイベントのコードを決定するために使用できるメソッドを取得するためにシグナル名の後にイベントを追加します。
1584 例えば QProgressBar クラスにはシグナル名である valueChanged() があります。
1585 使用するには setValueChangedEvent() 関数を使用します。
1589 .. code-block:: ring
1594 win1 = new qMainWindow() {
1596 setwindowtitle("QProgressBar valueChanged Event")
1598 progress1 = new qprogressbar(win1) {
1599 setGeometry(100,100,350,30)
1601 setvaluechangedevent("pChange()")
1604 new qpushbutton(win1) {
1605 setGeometry(10,10,100,30)
1607 setclickevent("pIncrease()")
1618 progress1 { setvalue(value()+1) }
1621 win1.setwindowtitle("value : " + progress1.value() )
1625 .. image:: ringqt_shot30.jpg
1626 :alt: qProgressBar クラスの valueChanged イベント
1628 別の用例は QCheckBox クラスの stateChanged イベントです。
1630 .. code-block:: ring
1635 win1 = new qMainWindow() {
1636 setwindowtitle("QCheckBox")
1637 new qcheckbox(win1) {
1638 setGeometry(100,100,100,30)
1639 settext("New Customer!")
1640 setstatechangedevent("pchange()")
1649 new qMessageBox(Win1) {
1650 setWindowTitle("Checkbox")
1651 settext("State Changed!")
1657 .. image:: ringqt_shot31.jpg
1658 :alt: qProgressBar クラスの valueChanged イベント
1661 pair: RingQt によるデスクトップとモバイル開発; QTimer クラスの用法
1664 =======================
1666 この用例では、 QTimer クラスを学びます。
1668 .. code-block:: ring
1673 win1 = new qwidget() {
1674 setgeometry(100,100,200,70)
1675 setwindowtitle("Timer")
1676 label1 = new qlabel(win1) {
1677 setgeometry(10,10,200,30)
1682 settimeoutevent("pTime()")
1691 label1.settext(thetime())
1694 return "Time : " + Time()
1699 .. image:: ringqt_shot32.jpg
1703 pair: RingQt によるデスクトップとモバイル開発; QProgressBar およびタイマーの用法
1705 QProgressBar およびタイマーの用法
1706 =====================================
1708 この用例では、“アニメーション”つきの QProgressBar クラスとタイマーを学びます。
1710 .. code-block:: ring
1712 ###------------------------------------
1719 win1 = new qwidget()
1721 setgeometry(100,100,400,100)
1722 setwindowtitle("Timer and ProgressBar")
1724 LabelMan = new qlabel(win1)
1726 setgeometry(10,10,200,30)
1727 settext(theTime()) ### ==>> 関数
1730 TimerMan = new qtimer(win1)
1733 settimeoutevent("pTime()") ### ==>> 関数
1737 BarMan = new qprogressbar(win1)
1739 setGeometry(100,50,300,10) ### X, Y 位置、長さ、チックネス
1740 setvalue(0) ### パーセントが塗りつぶされた
1749 LabelMan.settext(theTime()) ### ==>> 関数
1752 if BarMan.value() >= 100 ### プログレスバーの開始後.
1755 BarMan{ setvalue(value() + Increment) }
1758 return "Time : " + Time()
1760 .. image:: ringqt_shot15-B.jpg
1764 pair: RingQt によるデスクトップとモバイル開発; QLabel による寸法変更画像の表示方法
1766 QLabel による寸法変更画像の表示方法
1767 =======================================
1769 この例では QLabel ウィジェットで“アニメーションつき”の画像を表示して寸法を変更する方法を学びます。
1771 .. code-block:: ring
1775 #----------------------------------------------------
1776 # 必携: image = "C:\RING\bin\stock.jpg"
1778 # imageStock: 伸張する画像の開始寸法
1780 imageW = 200 ; imageH = 200 ; GrowBy = 4
1782 ###----------------------------------------------------
1785 WinWidth = 1280 ; WinHeight = 960
1786 BoxWidth = WinWidth -80 ; BoxHeight = WinHeight -80
1788 ###----------------------------------------------------
1792 win1 = new qwidget() {
1794 setgeometry(50,50, WinWidth,WinHeight)
1795 setwindowtitle("Animated Image - Display Image Scaled and Resized")
1797 imageStock = new qlabel(win1) {
1799 image = new qpixmap("C:\RING\bin\stock.jpg")
1800 AspectRatio = image.width() / image.height()
1803 imageH = imageH / AspectRatio
1805 ### 水平寸法、垂直寸法、アスペクト比、変形
1806 setpixmap(image.scaled(imageW , imageH ,0,0))
1808 PosLeft = (BoxWidth - imageW ) / 2
1809 PosTop = (BoxHeight - imageH ) / 2
1810 setGeometry(PosLeft,PosTop,imageW,imageH)
1814 TimerMan = new qtimer(win1) {
1815 setinterval(100) ### 100 ミリ秒間隔です。
1816 settimeoutevent("pTime()") ### ==>> 関数
1826 ###------------------------------------------------------
1827 ### TimerMan 関数: 100 ミリ秒間隔で呼び出します。
1831 ### 画像の大きさがウィンドウ領域に達したときにタイマーを停止します。
1832 if imageW > BoxWidth
1834 imageStock.clear() ### 画像の消去
1839 imageH = imageW / AspectRatio
1841 ### 画像の寸法変更: 水平寸法、垂直寸法、アスペクト比、変形
1842 imageStock.setpixmap(image.scaled(imageW , imageH ,0,0))
1845 PosLeft = (WinWidth - imageW ) / 2
1846 PosTop = (WinHeight - imageH ) / 2
1847 imageStock.setGeometry(PosLeft,PosTop,imageW,imageH)
1851 pair: RingQt によるデスクトップとモバイル開発; QFileDialog クラスの用法
1854 ============================
1858 .. code-block:: ring
1863 win1 = new qwidget() {
1864 setwindowtitle("open file")
1865 setgeometry(100,100,400,400)
1866 new qpushbutton(win1) {
1867 setgeometry(10,10,200,30)
1868 settext("open file")
1869 setclickevent("pOpen()")
1877 new qfiledialog(win1) {
1878 cName = getopenfilename(win1,"open file","c:\","source files(*.ring)")
1879 win1.setwindowtitle(cName)
1884 .. image:: ringqt_shot33.jpg
1885 :alt: QFileDialog クラス
1888 pair: RingQt によるデスクトップとモバイル開発; QPainter による描画方法
1891 ===========================
1893 この用例では、 QPainter クラスによる描画方法を学びます。
1895 .. code-block:: ring
1899 win1 = new qwidget() {
1900 setwindowtitle("Drawing using QPainter")
1901 setgeometry(100,100,500,500)
1902 label1 = new qlabel(win1) {
1903 setgeometry(10,10,400,400)
1906 new qpushbutton(win1) {
1907 setgeometry(200,400,100,30)
1909 setclickevent("draw()")
1919 color = new qcolor() {
1929 drawline(500,150,950,450)
1930 drawline(950,550,500,150)
1933 label1 { setpicture(p1) show() }
1937 .. image:: ringqt_shot34.jpg
1941 pair: RingQt によるデスクトップとモバイル開発; QPrinter による印刷方法
1944 ===========================
1946 この用例では、 QPrinter で PDF ファイルを印刷する方法を学びます。
1948 .. code-block:: ring
1952 win1 = new qwidget() {
1953 setwindowtitle("Printer")
1954 setgeometry(100,100,500,500)
1955 myweb = new qwebview(win1) {
1956 setgeometry(100,100,1000,500)
1957 loadpage(new qurl("http://google.com"))
1959 new qpushbutton(win1) {
1960 setGeometry(20,20,100,30)
1962 setclickevent("print()")
1970 printer1 = new qPrinter(0) {
1971 setoutputformat(1) # 1 = pdf
1972 setoutputfilename("test.pdf")
1973 painter = new qpainter() {
1975 myfont = new qfont("Times",50,-1,0)
1977 drawtext(100,100,"test")
1979 drawtext(100,100,"test2")
1984 printer1 = new qPrinter(0) {
1986 setoutputfilename("test2.pdf")
1987 myweb.print(printer1)
1992 system ("test2.pdf")
1996 pair: RingQt によるデスクトップとモバイル開発; QPrintPreviewDialog の用法
1998 QPrintPreviewDialog の用法
1999 ==============================
2001 この用例では、 QPrintPreviewDialog クラスの用法を学びます。
2005 .. code-block:: ring
2010 win1 = new qwidget() {
2011 setwindowtitle("Printer Preview Dialog")
2012 setgeometry(100,100,800,880)
2013 printer1 = new qPrinter(0)
2015 oPreview = new qPrintPreviewDialog(printer1) {
2018 setPaintrequestedevent("printPreview()")
2027 painter = new qpainter() {
2029 myfont = new qfont("Times",50,-1,0)
2031 drawtext(100,100,"Test - Page (1)")
2033 drawtext(100,100,"Test - Page (2)")
2035 myfont2 = new qfont("Times",14,-1,0)
2038 drawtext(100,100+(20*x),"Number : " + x)
2046 .. image:: printpreviewdialog.png
2050 pair: RingQt によるデスクトップとモバイル開発; 複数ウィンドウの作成方法
2053 ========================
2055 この用例は、複数ウィンドウの作成をするためのデモです。
2057 .. code-block:: ring
2061 win1 = new qwidget() {
2062 setwindowtitle("First")
2063 setgeometry(100,100,500,500)
2065 new qpushbutton(win1) {
2066 setgeometry(100,100,100,30)
2068 setclickevent("app1.quit()")
2071 new qpushbutton(win1) {
2072 setgeometry(250,100,100,30)
2074 setclickevent("second()")
2083 win2 = new qwidget() {
2084 setwindowtitle("Second")
2085 setgeometry(100,100,500,500)
2086 setwindowflags(Qt_dialog)
2092 .. image:: ringqt_shot35.jpg
2096 pair: RingQt によるデスクトップとモバイル開発; 音声の再生
2103 .. code-block:: ring
2107 win1 = new qwidget() {
2108 setwindowtitle("play sound!") show()
2110 new qmediaplayer() {
2111 setmedia(new qurl("footstep.wav"))
2112 setvolume(50) play()
2118 pair: RingQt によるデスクトップとモバイル開発; QColorDialog クラスの用法
2121 =============================
2125 .. code-block:: ring
2129 oApp = new myapp { start() }
2139 win1 = new qMainWindow() {
2140 setwindowtitle("Color Dialog")
2141 setgeometry(100,100,400,400)
2144 new qpushbutton(win1) {
2145 setgeometry(10,10,100,30)
2146 settext("Get Color")
2147 setclickevent("oApp.pColor()")
2155 myobj = new qcolordialog()
2156 aColor = myobj.GetColor()
2157 r=acolor[1] g=acolor[2] b=acolor[3]
2158 win1.setstylesheet("background-color: rgb("+r+", " + g+ "," + b + ")")
2162 .. image:: ringqt_shot37.jpg
2163 :alt: QColorDialog クラス
2166 pair: RingQt によるデスクトップとモバイル開発; qLCDNumber クラスの用法
2169 ===========================
2171 この用例では、 qLCDNumber クラスを学びます。
2173 .. code-block:: ring
2179 win1 = new qWidget()
2181 setwindowtitle("LCD Number")
2182 setgeometry(100,100,250,120)
2184 new qLCDNumber(win1)
2186 setgeometry(10,10,100,40)
2191 new qLCDNumber(win1)
2193 setgeometry(10,60,100,40)
2206 .. image:: ringqt_shot38.jpg
2207 :alt: QLCDNumber クラス
2210 pair: RingQt によるデスクトップとモバイル開発; 移動可能ラベルの用例
2213 ======================
2215 .. code-block:: ring
2221 win1 = new qWidget()
2224 label1 = new qLabel(win1)
2227 setgeometry(10,10,200,50)
2228 setstylesheet("color: purple ; font-size: 30pt;")
2234 setTimeOutEvent("pMove()")
2238 setWindowTitle("Movable Label")
2239 setgeometry(100,100,600,80)
2240 setStyleSheet("background-color: white;")
2260 .. image:: ringqt_shot39.jpg
2264 pair: RingQt によるデスクトップとモバイル開発; QMessagebox の用例
2269 メッセージ・ボックスの出力を確認する方法を学びます。
2271 .. code-block:: ring
2276 win1 = new qWidget()
2278 label1 = new qpushbutton(win1)
2281 setgeometry(10,10,200,50)
2282 setstylesheet("color: purple ; font-size: 30pt;")
2283 setclickevent("pWork()")
2285 setWindowTitle("Messagebox")
2286 setgeometry(100,100,600,80)
2287 setStyleSheet("background-color: white;")
2294 new qmessagebox(win1)
2296 setwindowtitle("messagebox title")
2297 settext("messagebox text")
2298 setInformativeText("Do you want to save your changes?")
2299 setstandardbuttons(QMessageBox_Yes | QMessageBox_No | QMessageBox_Close)
2302 if result = QMessageBox_Yes
2303 setwindowtitle("Yes")
2304 but result = QMessageBox_No
2305 setwindowtitle("No")
2306 but result = QMessageBox_Close
2307 setwindowtitle("Close")
2314 .. image:: ringqt_shot40.jpg
2315 :alt: QMessageBox の実行結果
2318 pair: RingQt によるデスクトップとモバイル開発; QInputDialog クラスの用法
2321 =============================
2323 この用例では、 QInputDialog クラスの用法を学びます。
2325 .. code-block:: ring
2331 Win1 = New QWidget () {
2333 SetGeometry(100,100,400,400)
2334 SetWindowTitle("Input Dialog")
2336 New QPushButton(win1)
2339 SetText ("Input Dialog")
2340 SetGeometry(100,100,100,30)
2341 SetClickEvent("pWork()")
2351 oInput = New QInputDialog(win1)
2353 setwindowtitle("What is your name?")
2354 setgeometry(100,100,400,50)
2355 setlabeltext("User Name")
2356 settextvalue("Mahmoud")
2358 if lCheck win1.setwindowtitle(oInput.textvalue()) ok
2364 .. image:: ringqt_shot41.jpg
2368 pair: RingQt によるデスクトップとモバイル開発; ダイアログ関数
2375 .. code-block:: none
2377 SetDialogIcon(cIconFile)
2378 MsgInfo(cTitle,cMessage)
2379 ConfirmMsg(cTitle,cMessage) --> lResult
2380 InputBox(cTitle,cMessage) --> cValue
2381 InputBoxInt(cTitle,cMessage) --> nValue
2382 InputBoxNum(cTitle,cMessage) --> nValue
2383 InputBoxPass(cTitle,cMessage) --> cValue
2387 .. code-block:: ring
2393 SetDialogIcon("notepad.png")
2394 msginfo(:Ring,:Welcome)
2395 see confirmMsg(:Ring,"Are you sure?") + nl
2396 see InputBoxNum(:Ring,"Enter Number(double) :") + nl
2397 see InputBox(:Ring,"Enter Value :") + nl
2398 see InputBoxInt(:Ring,"Enter Number(int)") + nl
2399 see InputBoxPass(:Ring,"Enter Password") +nl
2404 pair: RingQt によるデスクトップとモバイル開発; キー入力とマウス移動イベント
2407 ==============================
2409 この用例では、イベントフィルタによりキー入力と
2410 マウスの移動イベントを検知するための方法を学びます。
2412 .. code-block:: ring
2418 win1 = new qWidget()
2420 setWindowTitle("Test using Event Filter!")
2421 setGeometry(100,100,400,400)
2422 setmousetracking(true)
2423 myfilter = new qallevents(win1)
2424 myfilter.setKeyPressEvent("pWork()")
2425 myfilter.setMouseButtonPressevent("pClick()")
2426 myfilter.setmousemoveevent("pMove()")
2428 installeventfilter(myfilter)
2437 win1.setwindowtitle('KeyPress! : ' + myfilter.getkeycode())
2440 new qmessagebox(win1) {
2441 setgeometry(100,100,400,100)
2442 setwindowtitle("click event!")
2443 settext("x : " + myfilter.getx() +
2444 " y : " + myfilter.gety() + " button : " +
2445 myfilter.getbutton() )
2450 win1.setwindowtitle("Mouse Move , X : " + myfilter.getx() +
2451 " Y : " + myfilter.gety() )
2455 .. image:: ringqt_shot42.jpg
2456 :alt: キー入力とマウス移動イベント
2459 pair: RingQt によるデスクトップとモバイル開発; マウスによるオブジェクトの移動方法
2462 ======================================
2464 ユーザがラベルを移動できる移動可能なオブジェクトをプログラムする方法を学びます。
2466 .. code-block:: ring
2476 win1 = new qWidget()
2479 setWindowTitle("Move this label!")
2480 setGeometry(100,100,400,400)
2481 setstylesheet("background-color:white;")
2483 Label1 = new qLabel(Win1){
2484 setGeometry(100,100,200,50)
2486 setstylesheet("font-size: 30pt")
2487 myfilter = new qallevents(label1)
2488 myfilter.setEnterevent("pEnter()")
2489 myfilter.setLeaveevent("pLeave()")
2490 myfilter.setMouseButtonPressEvent("pPress()")
2491 myfilter.setMouseButtonReleaseEvent("pRelease()")
2492 myfilter.setMouseMoveEvent("pMove()")
2493 installeventfilter(myfilter)
2503 Label1.setStyleSheet("background-color: purple; color:white;font-size: 30pt;")
2506 Label1.setStyleSheet("background-color: white; color:black;font-size: 30pt;")
2510 nX = myfilter.getglobalx()
2511 ny = myfilter.getglobaly()
2518 nX2 = myfilter.getglobalx()
2519 ny2 = myfilter.getglobaly()
2524 move(x()+ndiffx,y()+ndiffy)
2525 setStyleSheet("background-color: Green;
2526 color:white;font-size: 30pt;")
2536 .. image:: ringqt_shot43.jpg
2537 :alt: マウスで移動できるオブジェクト
2539 .. image:: ringqt_shot44.jpg
2540 :alt: マウスで移動できるオブジェクト
2542 .. image:: ringqt_shot45.jpg
2543 :alt: マウスをで移動できるオブジェクト
2546 pair: RingQt によるデスクトップとモバイル開発; GUI クラスからの継承
2549 ============================
2553 .. code-block:: ring
2561 class mywindow from qwidget
2564 setwindowtitle("First Window")
2565 setgeometry(100,100,400,400)
2566 setstylesheet("background-color: purple;")
2567 settooltip("my first window!")
2572 .. image:: ringqt_shot46.jpg
2576 pair: RingQt によるデスクトップとモバイル開発; QDesktopWidget クラスの用法
2578 QDesktopWidget クラスの用法
2579 ===============================
2581 この用例では、 QDesktopWidget の用法を学びます。
2583 .. code-block:: ring
2588 win1 = New qWidget()
2591 btn1 = new qPushbutton(win1)
2596 setClickEvent("pCenter()")
2606 oDesktop = new qDesktopWidget()
2607 oRect = oDesktop.screenGeometry( oDesktop.primaryScreen() )
2608 win1.move((oRect.width()-win1.width()) /2 , (oRect.Height()-win1.Height())/2 )
2613 .. image:: ringqt_shot47.jpg
2614 :alt: Using QDesktopWidget クラス
2617 pair: RingQt によるデスクトップとモバイル開発; テキストの回転
2622 この用例では、タイマーでテキストを回転しています。
2624 .. code-block:: ring
2631 win1 = new qwidget() {
2632 setwindowtitle("Rotate Text")
2634 label1 = new qlabel(win1) {
2636 myfilter = new qallevents(win1)
2637 myfilter.setMouseButtonPressevent("pClick()")
2638 installeventfilter(myfilter)
2642 settimeoutevent("pTime()")
2646 L1 = new qVBoxLayout() { AddWidget(Label1) } SetLayout(L1)
2654 color = new qcolor() {
2661 painter = new qpainter() {
2665 myfont.setpointsize(50)
2668 drawtext(350,0*nAngle,"welcome")
2669 drawtext(0,0*nAngle,"welcome")
2678 win1 { setwindowtitle("Click Event") }
2689 .. image:: shotrotatetext.png
2694 pair: RingQt によるデスクトップとモバイル開発; フォーカスの変更
2699 この用例は、 ENTER キーでフォーカスを変更します。
2701 .. code-block:: ring
2706 win = new qWidget() {
2708 SetWindowTitle("Change Focus")
2709 text1 = new qLineEdit(win)
2710 text2 = new qLineEdit(win)
2711 text3 = new qLineEdit(win)
2712 text4 = new qLineEdit(win)
2713 layout1 = new qVBoxLayout() {
2721 aList = [text1,text2,text3,text4]
2722 oFilter = new qallevents(win)
2723 oFilter.setKeyPressEvent("pWork()")
2724 installeventfilter(oFilter)
2731 nCode = oFilter.getkeycode()
2732 if nCode = 16777220 # ENTER キー
2733 for x=1 to len(aList)
2734 if aList[x].HasFocus()
2736 if t > len(aList) t=1 ok
2737 aList[t].SetFocus(0)
2745 pair: RingQt によるデスクトップとモバイル開発; 正規表現
2750 この用例では、正規表現のクラスを使用しています。
2752 .. code-block:: ring
2758 see "Using Regular Expressions" + nl
2760 exp = new qregularexpression() {
2761 setPattern("\d\d \w+")
2763 match = match("33 one",0,0,0)
2764 see match.hasmatch() + nl
2765 match = match("3 one",0,0,0)
2766 see match.hasmatch() + nl
2767 match = match("welcome 11 one",0,0,0)
2768 see match.hasmatch() + nl
2769 matched = match.captured(0)
2772 exp = new qregularexpression() {
2773 setPattern("^(\d\d)/(\d\d)/(\d\d\d\d)$")
2775 match = match("08/12/1985",0,0,0)
2776 see match.hasmatch() + nl
2777 day = match.captured(1)
2778 month = match.captured(2)
2779 year = match.captured(3)
2780 see day + nl + month + nl + year + nl
2781 see "(" + match.capturedStart(1) + "," + match.capturedEnd(1)+ ")" + nl
2782 see "(" + match.capturedStart(2) + "," + match.capturedEnd(2)+ ")" + nl
2783 see "(" + match.capturedStart(3) + "," + match.capturedEnd(3)+ ")" + nl
2790 .. code-block:: ring
2792 Using Regular Expressions
2798 ^(\d\d)/(\d\d)/(\d\d\d\d)$
2810 pair: RingQt によるデスクトップとモバイル開発; シンプルなクライアントとサーバーの用例
2813 ======================================
2815 この用例では、シンプルなクライアントとサーバーアプリケーションの作成方法を学びます。
2817 .. code-block:: ring
2822 oClient = new Client { client() }
2823 oServer = new Server { server() }
2829 win1 lineedit1 cOutput=""
2834 win1 = new qwidget()
2836 new qpushbutton(win1) {
2837 setgeometry(50,50,100,30)
2839 setclickevent("oClient.Connect()")
2842 lineedit1 = new qtextedit(win1) {
2843 setGeometry(150,50,200,300)
2847 setwindowtitle("client")
2848 setgeometry(10,100,400,400)
2853 cOutput = "Connect to host 127.0.0.1 port 9999" + nl
2854 lineedit1.settext(cOutput)
2855 oTcpSocket = new qTcpSocket(win1) {
2856 setconnectedevent("oClient.pConnected()")
2857 setreadyreadevent("oClient.pRead()")
2858 connecttohost("127.0.0.1",9999,3,0)
2859 waitforconnected(5000)
2864 cOutput += "Connected!" + nl
2865 lineedit1.settext(cOutput)
2869 cOutput += "Ready Read!" + nl
2870 lineedit1.settext(cOutput)
2871 cOutput += oTcpSocket.readall().data() + nl
2872 lineedit1.settext(cOutput)
2877 oTcpServer oTcpClient
2882 win1 = new qwidget()
2884 lineedit1 = new qtextedit(win1) {
2885 setGeometry(150,50,200,300)
2889 setwindowtitle("Server")
2890 setgeometry(450,100,400,400)
2894 oTcpServer = new qTcpServer(win1) {
2895 setNewConnectionEvent("oServer.pNewConnection()")
2896 oHostAddress = new qHostAddress()
2897 oHostAddress.SetAddress("127.0.0.1")
2898 listen(oHostAddress,9999)
2900 cOutput = "Server Started" + nl +
2901 "listen to port 9999" + nl
2903 lineedit1.settext(cOutput)
2907 oTcpClient = oTcpServer.nextPendingConnection()
2908 cOutput += "Accept Connection" + nl
2909 lineedit1.settext(cOutput)
2911 cStr ="Hello from server to client!"+char(13)+char(10)
2912 write(cStr,len(cStr))
2914 waitforbyteswritten(300000)
2920 .. image:: ringqt_shot36.jpg
2921 :alt: クライアントとサーバーの用例
2924 pair: RingQt によるデスクトップとモバイル開発; 動的オブジェクト
2929 実行時にオブジェクトの作成、およびウィンドウへオブジェクトを追加します。
2933 .. code-block:: ring
2937 oFormDesigner = new FormDesigner { start("oFormDesigner") }
2945 func start cObjectName
2949 winToolBox = new qWidget()
2950 winToolBox.setWindowTitle("ToolBox")
2951 winToolBox.move(10,10)
2952 winToolBox.resize(300,600)
2954 btn = new qPushButton(winToolBox)
2956 btn.setText("Create Button")
2957 btn.setClickEvent(cObjectName+".pCreateButton()")
2962 winForm = new qWidget() {
2964 setWindowTitle("Form Designer")
2974 nCount = len(aObjects)
2976 aObjects + new MyButton(winForm)
2979 setText("Button"+ nIndex)
2980 Move(30*nIndex,30*nIndex)
2986 Class MyButton from qPushButton
2991 pair: RingQt によるデスクトップとモバイル開発; Weight History アプリケーション
2993 Weight History アプリケーション
2994 ===============================
2996 このサンプルは体重の記録で役に立ちます (日付、時刻と体重)。
2998 .. code-block:: ring
3004 $ApplicationObject = "oApp" # イベントを呼び出すときに使用します。
3007 oApp.CloseDatabase()
3012 cDir = currentdir() + "/"
3016 win1 = new qWidget()
3018 setWindowTitle("Weight History")
3020 layoutButtons = new qhboxlayout()
3022 label1 = new qLabel(win1) { setText("Weight") }
3023 text1 = new qlineedit(win1)
3024 btnAdd = new qpushbutton(win1) {
3026 setClickEvent($ApplicationObject+".AddWeight()")
3028 btnDelete = new qpushbutton(win1) {
3030 setClickEvent($ApplicationObject+".Deleteweight()")
3035 addwidget(btnDelete)
3037 layoutData = new qhboxlayout()
3039 Table1 = new qTableWidget(win1) {
3042 setselectionbehavior(QAbstractItemView_SelectRows)
3043 setHorizontalHeaderItem(0, new QTableWidgetItem("Date"))
3044 setHorizontalHeaderItem(1, new QTableWidgetItem("Time"))
3045 setHorizontalHeaderItem(2, new QTableWidgetItem("Weight"))
3046 setitemChangedEvent($ApplicationObject+".ItemChanged()")
3047 setAlternatingRowColors(true)
3048 horizontalHeader().setStyleSheet("color: blue")
3049 verticalHeader().setStyleSheet("color: red")
3053 layoutClose = new qhboxlayout()
3055 btnclose = new qpushbutton(win1) {
3057 setClickEvent("MyApp.Quit()")
3061 layoutMain = new qvboxlayout()
3063 addlayout(layoutButtons)
3064 addLayout(LayoutData)
3065 addLayout(layoutClose)
3067 setlayout(layoutMain)
3075 if not fexists(cDir + "weighthistory.db")
3078 new QSqlDatabase() {
3079 this.oCon = addDatabase("QSQLITE") {
3080 setDatabaseName("weighthistory.db")
3086 exec("create table weighthistory (id integer primary key,"+
3087 " f_date varchar(10),"+
3088 " f_time varchar(8), f_weight varchar(8) );")
3098 cWeight = text1.text()
3105 nID = this.aIDs[nROW+1]
3107 exec("delete from weighthistory where id = " + nID )
3109 Del(this.aIDs,nRow+1)
3116 Func AddRecord cWeight
3118 cStr = "insert into weighthistory (f_date,f_time,f_weight) values"+
3119 " ('%f1','%f2','%f3')"
3122 cStr = substr(cStr,"%f1",cDate)
3123 cStr = substr(cStr,"%f2",cTime)
3124 cStr = substr(cStr,"%f3",cWeight)
3129 Table1.selectrow(table1.rowcount()-1)
3133 table1.setitemChangedEvent("")
3135 query = new QSqlQuery() {
3136 exec("select * from weighthistory")
3138 this.Table1.setrowcount(0)
3142 this.aIDs + query.value(0).tostring()
3144 cStr = query.value(x).tostring()
3145 item = new qTableWidgetItem(cStr)
3146 setItem(nRows,x-1,item)
3153 table1.setitemChangedEvent($ApplicationObject+".ItemChanged()")
3156 nRow = table1.currentrow()
3158 myitem = Table1.item(table1.currentrow(),0)
3159 cDate = myitem.text()
3160 myitem = Table1.item(table1.currentrow(),1)
3161 cTime = myitem.text()
3162 myitem = Table1.item(table1.currentrow(),2)
3163 cWeight = myitem.text()
3165 cStr = "update weighthistory set f_date ='%f1' , f_time = '%f2' , "+
3166 "f_weight ='%f3' where id = " + this.aIDs[nROW+1]
3167 cStr = substr(cStr,"%f1",cDate)
3168 cStr = substr(cStr,"%f2",cTime)
3169 cStr = substr(cStr,"%f3",cWeight)
3176 このスクリーンショットはアプリケーション実行中のものです。
3178 .. image:: weighthistory_app.png
3179 :alt: Weight History アプリケーション
3182 pair: RingQt によるデスクトップとモバイル開発; Notepad アプリケーション
3186 ========================
3188 この用例では、 RingQt を使用してシンプルな Notepad を開発したものです。
3190 .. code-block:: ring
3194 cActiveFileName = ""
3195 aTextColor = [0,0,0]
3196 aBackColor = [255,255,255]
3197 cFont = "MS Shell Dlg 2,14,-1,5,50,0,0,0,0,0"
3198 cWebsite = "http://www.google.com"
3203 oSearchFilter = NULL
3204 oReplaceValue = NULL
3209 win1 = new qMainWindow() {
3211 setwindowtitle("Ring Notepad")
3212 setGeometry(100,100,400,400)
3214 new qpushbutton(win1) {
3215 setbtnimage(self,"image/new.png")
3216 setclickevent("pNew()")
3217 settooltip("New File")
3219 new qpushbutton(win1) {
3220 setbtnimage(self,"image/open.png")
3221 setclickevent("pOpen()")
3222 settooltip("Open File")
3224 new qpushbutton(win1) {
3225 setbtnimage(self,"image/save.png")
3226 setclickevent("pSave()")
3229 new qpushbutton(win1) {
3230 setbtnimage(self,"image/saveas.png")
3231 setclickevent("pSaveAs()")
3232 settooltip("Save As")
3234 new qpushbutton(win1) {
3235 setbtnimage(self,"image/cut.png")
3236 setclickevent("pCut()")
3239 new qpushbutton(win1) {
3240 setbtnimage(self,"image/copy.png")
3241 setclickevent("pCopy()")
3244 new qpushbutton(win1) {
3245 setbtnimage(self,"image/paste.png")
3246 setclickevent("pPaste()")
3249 new qpushbutton(win1) {
3250 setbtnimage(self,"image/font.png")
3251 setclickevent("pFont()")
3254 new qpushbutton(win1) {
3255 setbtnimage(self,"image/colors.jpg")
3256 setclickevent("pColor()")
3257 settooltip("Text Color")
3259 new qpushbutton(win1) {
3260 setbtnimage(self,"image/search.png")
3261 setclickevent("pFind()")
3262 settooltip("Find and Replace")
3264 new qpushbutton(win1) {
3265 setbtnimage(self,"image/print.png")
3266 setclickevent("pPrint()")
3269 new qpushbutton(win1) {
3270 setbtnimage(self,"image/debug.png")
3271 setclickevent("pDebug()")
3272 settooltip("Debug (Run then wait!)")
3274 new qpushbutton(win1) {
3275 setbtnimage(self,"image/run.png")
3276 setclickevent("pRun()")
3277 settooltip("Run the program")
3279 new qpushbutton(win1) {
3280 setbtnimage(self,"image/close.png")
3281 setclickevent("pQuit()")
3286 tool1 = addtoolbar("files") {
3287 for x in aBtns addwidget(x) addseparator() next
3290 menu1 = new qmenubar(win1) {
3291 sub1 = addmenu("File")
3292 sub2 = addmenu("Edit")
3293 sub3 = addmenu("View")
3294 sub4 = addmenu("Help")
3296 oAction = new qAction(win1) {
3297 setShortcut(new QKeySequence("Ctrl+n"))
3298 setbtnimage(self,"image/new.png")
3300 setclickevent("pNew()")
3303 oAction = new qAction(win1) {
3304 setShortcut(new QKeySequence("Ctrl+o"))
3305 setbtnimage(self,"image/open.png")
3307 setclickevent("pOpen()")
3311 oAction = new qAction(win1) {
3312 setShortcut(new QKeySequence("Ctrl+s"))
3313 setbtnimage(self,"image/save.png")
3315 setclickevent("pSave()")
3319 oAction = new qAction(win1) {
3320 setShortcut(new QKeySequence("Ctrl+e"))
3321 setbtnimage(self,"image/saveas.png")
3323 setclickevent("pSaveAs()")
3327 oAction = new qAction(win1) {
3328 setShortcut(new QKeySequence("Ctrl+p"))
3329 setbtnimage(self,"image/print.png")
3330 settext("Print to PDF")
3331 setclickevent("pPrint()")
3335 oAction = new qAction(win1) {
3336 setShortcut(new QKeySequence("Ctrl+d"))
3337 setbtnimage(self,"image/debug.png")
3338 settext("Debug (Run then wait!)")
3339 setclickevent("pDebug()")
3343 oAction = new qAction(win1) {
3344 setShortcut(new QKeySequence("Ctrl+r"))
3345 setbtnimage(self,"image/run.png")
3347 setclickevent("pRun()")
3351 oAction = new qAction(win1) {
3352 setShortcut(new QKeySequence("Ctrl+F5"))
3353 setbtnimage(self,"image/run.png")
3354 settext("Run GUI Application (No Console)")
3355 setclickevent("pRunNoConsole()")
3359 oAction = new qaction(win1) {
3360 setShortcut(new QKeySequence("Ctrl+q"))
3361 setbtnimage(self,"image/close.png")
3363 setstatustip("Exit")
3364 setclickevent("pQuit()")
3369 oAction = new qAction(win1) {
3370 setShortcut(new QKeySequence("Ctrl+x"))
3371 setbtnimage(self,"image/cut.png")
3373 setclickevent("pCut()")
3376 oAction = new qAction(win1) {
3377 setShortcut(new QKeySequence("Ctrl+c"))
3378 setbtnimage(self,"image/copy.png")
3380 setclickevent("pCopy()")
3383 oAction = new qAction(win1) {
3384 setShortcut(new QKeySequence("Ctrl+v"))
3385 setbtnimage(self,"image/paste.png")
3387 setclickevent("pPaste()")
3391 oAction = new qAction(win1) {
3392 setShortcut(new QKeySequence("Ctrl+i"))
3393 setbtnimage(self,"image/font.png")
3395 setclickevent("pFont()")
3399 oAction = new qAction(win1) {
3400 setShortcut(new QKeySequence("Ctrl+t"))
3401 setbtnimage(self,"image/colors.jpg")
3402 settext("Text Color")
3403 setclickevent("pColor()")
3406 oAction = new qAction(win1) {
3407 setShortcut(new QKeySequence("Ctrl+b"))
3408 setbtnimage(self,"image/colors.jpg")
3409 settext("Back Color")
3410 setclickevent("pColor2()")
3414 oAction = new qAction(win1) {
3415 setShortcut(new QKeySequence("Ctrl+g"))
3416 settext("Go to line")
3417 setclickevent("pGoto()")
3420 oAction = new qAction(win1) {
3421 setShortcut(new QKeySequence("Ctrl+f"))
3422 setbtnimage(self,"image/search.png")
3423 settext("Find and Replace")
3424 setclickevent("pFind()")
3429 oAction = new qAction(win1) {
3430 setShortcut(new QKeySequence("Ctrl+p"))
3431 setbtnimage(self,"image/project.png")
3432 settext("Project Files")
3433 setclickevent("pProject()")
3436 oAction = new qAction(win1) {
3437 setShortcut(new QKeySequence("Ctrl+u"))
3438 setbtnimage(self,"image/source.png")
3439 setclickevent("pSourceCode()")
3440 settext("Source Code")
3443 oAction = new qAction(win1) {
3444 setShortcut(new QKeySequence("Ctrl+w"))
3445 setbtnimage(self,"image/richtext.png")
3446 setclickevent("pWebBrowser()")
3447 settext("Web Browser")
3452 sub5 = addmenu("Development Tools")
3455 oAction = new qAction(win1) {
3456 settext("Programming Language")
3457 setclickevent("pLang()")
3460 oAction = new qAction(win1) {
3461 settext("GUI Library")
3462 setclickevent("pGUI()")
3467 oAction = new qAction(win1) {
3469 setclickevent("pAbout()")
3477 status1 = new qstatusbar(win1) {
3478 showmessage("Ready!",0)
3481 setstatusbar(status1)
3483 tree1 = new qtreeview(win1) {
3484 setclickedevent("pChangeFile()")
3485 setGeometry(00,00,200,400)
3487 ofile = new QFileSystemModel() {
3488 setrootpath(oDir.currentpath())
3489 myfiles = new qstringlist()
3490 myfiles.append("*.ring")
3491 myfiles.append("*.rh")
3492 setnamefilters(myfiles)
3493 setNameFilterDisables(false)
3496 myindex = ofile.index(oDir.currentpath(),0)
3497 for x = 1 to ofile.columncount()
3500 setcurrentindex(myindex)
3501 setexpanded(myindex,true)
3505 oDock1 = new qdockwidget(win1,0) {
3506 setGeometry(00,00,200,200)
3507 setwindowtitle("Project Files")
3511 textedit1 = new qtextedit(win1) {
3512 setCursorPositionChangedevent("pCursorPositionChanged()")
3513 setLineWrapMode(QTextEdit_NoWrap)
3514 setAcceptRichText(false)
3515 setTextChangedEvent("lAskToSave = true")
3519 oDock2 = new qdockwidget(win1,0) {
3520 setwidget(textedit1)
3521 setwindowtitle("Source Code")
3524 oWebBrowser = new qWidget() {
3525 setWindowFlags(Qt_SubWindow)
3526 oWBLabel = new qLabel(win1) {
3527 setText("Website: ")
3529 oWBText = new qLineEdit(win1) {
3531 setReturnPressedEvent("pWebGo()")
3533 oWBGo = new qPushButton(win1) {
3535 setClickEvent("pWebGo()")
3537 oWBBack = new qPushButton(win1) {
3539 setClickEvent("pWebBack()")
3541 oWBLayout1 = new qHBoxLayout() {
3547 oWebView = new qWebView(win1) {
3548 loadpage(new qurl(cWebSite))
3550 oWBlayout2 = new qVBoxLayout() {
3551 addLayout(oWBLayout1)
3554 setLayout(oWBLayout2)
3557 oDock3 = new qdockwidget(win1,0) {
3558 setwidget(oWebBrowser)
3559 setwindowtitle("Web Browser")
3560 setFeatures(QDockWidget_DocWidgetClosable)
3563 adddockwidget(1,oDock1,1)
3564 adddockwidget(2,oDock2,2)
3565 adddockwidget(2,oDock3,1)
3567 setwinicon(self,"image/notepad.png")
3576 cWebsite = oWBText.text()
3577 oWebView.LoadPage( new qurl( cWebSite ) )
3592 myitem = tree1.currentindex()
3593 if ofile.isdir(myitem)
3596 cActiveFileName = ofile.filepath(myitem)
3597 textedit1.settext(read(cActiveFileName))
3598 textedit1.setfocus(0)
3599 pCursorPositionChanged()
3600 pSetActiveFileName()
3602 func pSetActiveFileName
3603 oDock2.setWindowTitle("Source Code : " + cActiveFileName)
3605 func pCursorPositionChanged
3606 status1.showmessage(" Line : "+(textedit1.textcursor().blocknumber()+1)+
3607 " Column : " +(textedit1.textcursor().columnnumber()+1) +
3608 " Total Lines : " + textedit1.document().linecount() ,0)
3611 oInput = New QInputDialog(win1)
3613 setwindowtitle("Enter the line number?")
3614 setgeometry(100,100,400,50)
3615 setlabeltext("Line")
3618 nLine = 0 + oInput.textvalue()
3619 oBlock = textedit1.document().findBlockByLineNumber(nLine-1)
3620 oCursor = textedit1.textcursor()
3621 oCursor.setposition(oBlock.position(),0)
3622 textedit1.settextcursor(oCursor)
3626 if isobject(oSearch)
3627 oSearch.activatewindow()
3630 oSearch = new qWidget()
3634 setText("Find What : ")
3635 setgeometry(10,10,50,30)
3637 oSearchValue = new qlineedit(oSearch)
3639 setgeometry(80,10,460,30)
3640 setReturnPressedEvent("pFindValue()")
3644 setText("Replace with ")
3645 setgeometry(10,45,80,30)
3647 oReplaceValue = new qlineedit(oSearch)
3649 setgeometry(80,45,460,30)
3651 oSearchCase = new qCheckbox(oSearch)
3653 setText("Case Sensitive")
3654 setgeometry(80,85,100,30)
3656 new qPushButton(oSearch)
3658 setText("Find/Find Next")
3659 setgeometry(80,120,100,30)
3660 setclickevent("pFindValue()")
3662 new qPushButton(oSearch)
3665 setgeometry(200,120,100,30)
3666 setclickevent("pReplace()")
3668 new qPushButton(oSearch)
3670 setText("Replace All")
3671 setgeometry(320,120,100,30)
3672 setclickevent("pReplaceAll()")
3674 new qPushButton(oSearch)
3677 setgeometry(440,120,100,30)
3678 setclickevent("pSearchClose()")
3681 setwinicon(oSearch,"image/notepad.png")
3682 setWindowTitle("Find/Replace")
3683 setStyleSheet("background-color:white;")
3684 setFixedsize(550,160)
3685 setwindowflags( Qt_CustomizeWindowHint |
3686 Qt_WindowTitleHint | Qt_WindowStaysOnTopHint)
3688 oSearchFilter = new qallevents(oSearch)
3689 oSearchFilter.setKeyPressEvent("pSearchKeyPress()")
3690 installeventfilter(oSearchFilter)
3696 oCursor = textedit1.textCursor()
3697 if oCursor.HasSelection() = false
3698 new qMessagebox(oSearch)
3700 SetWindowTitle("Replace")
3701 SetText("No Selection")
3706 cValue = oSearchValue.text()
3707 cSelected = oCursor.SelectedText()
3708 if oSearchCase.checkState() = Qt_Unchecked
3709 cValue = lower(cValue)
3710 cSelected = lower(cSelected)
3712 if cSelected != cValue
3713 new qMessagebox(oSearch)
3715 SetWindowTitle("Replace")
3721 cValue = oReplaceValue.text()
3722 nStart = oCursor.SelectionStart()
3723 nEnd = oCursor.SelectionEnd()
3724 cStr = textedit1.toPlainText()
3725 cStr = left(cStr,nStart)+cValue+substr(cStr,nEnd+1)
3726 textedit1.setText(cStr)
3730 cStr = textedit1.toPlainText()
3731 cOldValue = oSearchValue.text()
3732 cNewValue = oReplaceValue.text()
3733 if oSearchCase.checkState() = Qt_Unchecked
3735 cStr = SubStr(cStr,cOldValue,cNewValue,true)
3738 cStr = SubStr(cStr,cOldValue,cNewValue)
3740 textedit1.setText(cStr)
3741 new qMessagebox(oSearch)
3743 SetWindowTitle("Replace All")
3744 SetText("Operation Done")
3752 func pSearchKeyPress
3753 if oSearchFilter.getKeyCode() = Qt_Key_Escape
3758 oCursor = textedit1.textcursor()
3759 nPosStart = oCursor.Position() + 1
3760 cValue = oSearchValue.text()
3761 cStr = textedit1.toplaintext()
3762 cStr = substr(cStr,nPosStart)
3763 if oSearchCase.checkState() = Qt_Unchecked
3764 cStr = lower(cStr) cValue = lower(cValue)
3766 nPos = substr(cStr,cValue)
3768 nPos += nPosStart - 2
3769 oCursor = textedit1.textcursor()
3770 oCursor.setposition(nPos,0)
3771 textedit1.settextcursor(oCursor)
3772 oCursor = textedit1.textcursor()
3773 oCursor.setposition(nPos+len(cValue),1)
3774 textedit1.settextcursor(oCursor)
3777 new qMessagebox(oSearch)
3779 SetWindowTitle("Search")
3780 SetText("Cannot find :" + cValue)
3787 New qMessageBox(win1) {
3788 setWindowTitle("Sorry")
3789 setText("Save the file first!")
3794 if cActiveFileName = Null return pNofileopened() ok
3795 cCode = "start run " + cActiveFileName + nl
3799 if cActiveFileName = Null return pNofileopened() ok
3800 cCode = "start ring " + cActiveFileName + nl
3804 if cActiveFileName = Null return pNofileopened() ok
3805 cCode = "start /b ring " + cActiveFileName + nl
3809 if cActiveFileName = NULL return pSaveAs() ok
3810 writefile(cActiveFileName,textedit1.toplaintext())
3811 status1.showmessage("File : " + cActiveFileName + " saved!",0)
3815 new qfiledialog(win1) {
3816 cName = getsavefilename(win1,"Save As","","source files(*.ring)")
3818 cActiveFileName = cName
3819 writefile(cActiveFileName,textedit1.toplaintext())
3820 status1.showmessage("File : " + cActiveFileName + " saved!",0)
3821 pSetActiveFileName()
3827 status1.showmessage("Printing to File : RingDoc.pdf",0)
3828 printer1 = new qPrinter(0) {
3829 setoutputformat(1) # 1 = pdf
3830 setoutputfilename("RingDoc.pdf")
3831 textedit1.print(printer1)
3833 status1.showmessage("Done!",0)
3834 system("RingDoc.pdf")
3838 status1.showmessage("Cut!",0)
3842 status1.showmessage("Copy!",0)
3846 status1.showmessage("Paste!",0)
3849 oFontDialog = new qfontdialog() {
3852 textedit1.selectall()
3857 myfont = new qfont("",0,0,0)
3858 myfont.fromstring(cFont)
3859 textedit1.setcurrentfont(myfont)
3862 new qcolordialog() { aTextColor = GetColor() }
3866 new qcolordialog() { aBackColor = GetColor() }
3870 textedit1.setstylesheet("color: rgb(" + aTextColor[1] + "," + aTextColor[2] +
3871 "," + aTextColor[3] + ");" + "background-color: rgb(" +
3872 aBackColor[1] + "," + aBackColor[2] + "," +
3873 aBackColor[3] + ")")
3876 new qfiledialog(win1) {
3877 cName = getopenfilename(win1,"open file","c:\","source files(*.ring)")
3879 cActiveFileName = cName
3880 textedit1.settext(read(cActiveFileName))
3885 new qfiledialog(win1) {
3886 cName = getsavefilename(win1,"New file","","source files(*.ring)")
3889 cActiveFileName = cName
3890 textedit1.settext(read(cActiveFileName))
3895 Func WriteFile cFileName,cCode
3896 aCode = str2list(cCode)
3897 fp = fopen(cFileName,"wb")
3899 fwrite(fp,cLine+char(13)+char(10))
3903 Func MsgBox cTitle,cMessage
3904 new qMessagebox(win1) {
3905 setwindowtitle(cTitle)
3912 MsgBox("Programming Language",
3913 "This application developed using the Ring programming language")
3916 MsgBox("GUI Library",
3917 "This application uses the Qt GUI Library through RingQt")
3921 "2016, Mahmoud Fayed <msfclipper@yahoo.com>")
3924 cSettings = "aTextColor = ["+aTextColor[1]+","+aTextColor[2]+
3925 ","+aTextColor[3]+"]" + nl +
3926 "aBackColor = ["+aBackColor[1]+","+aBackColor[2]+
3927 ","+aBackColor[3]+"]" + nl +
3928 "cFont = '" + cFont + "'" + nl +
3929 "cWebSite = '" + cWebsite + "'" + nl
3930 cSettings = substr(cSettings,nl,char(13)+char(10))
3931 write("ringnotepad.ini",cSettings)
3933 new qmessagebox(win1)
3935 setwindowtitle("Save Changes?")
3936 settext("Some changes are not saved!")
3937 setInformativeText("Do you want to save your changes?")
3938 setstandardbuttons(QMessageBox_Yes |
3939 QMessageBox_No | QMessageBox_Cancel)
3942 if result = QMessageBox_Yes
3944 but result = QMessageBox_Cancel
3953 oWebView { loadpage(new qurl(cWebSite)) }
3954 oWBText { setText(cWebSite) }
3956 Func RestoreSettings
3957 eval(read("ringnotepad.ini"))
3970 このスクリーンショットは “ファイル” メニューのデモです。
3972 .. image:: ringqt_shot50.jpg
3973 :alt: Ring ノートパッド - ファイルメニュー
3977 .. image:: ringqt_shot51.jpg
3978 :alt: Ring ノートパッド - 検索と置換
3980 このスクリーンショットはアプリケーションのメインウィンドウのデモです。
3982 .. image:: ringqt_shot49.jpg
3983 :alt: Ring ノートパッド - メインウィンドウ
3985 .. note:: 前述のサンプルにある pDebug(), pRun() および pRunNoConsole() 関数は移植性がありません!
3986 このサンプルでは MS-Windows 用に記述されており、ほかのオペレーティングシステム用に更新できます。
3989 pair: RingQt によるデスクトップとモバイル開発; Cards ゲーム
3994 この用例は、 RingQt で開発したシンプルなカードゲームです。
3996 各プレイヤーは五枚のカードを取得しますが、カードの中身は誰にもわかりません。
3997 プレイヤーは毎回カードを確認するためにカードを一枚クリックします。
3998 カードが別のカードと同じ番号ならば各カードのポイントを取得します。
3999 カードの番号が “5” ならば、すべての可視状態のカードのポイントを取得します。
4001 .. code-block:: ring
4009 mypic = new QPixmap("cards.jpg")
4011 mypic2 = mypic.copy(0,(124*4)+1,79,124)
4012 Player1EatPic = mypic.copy(80,(124*4)+1,79,124)
4013 Player2EatPic= mypic.copy(160,(124*4)+1,79,124)
4019 temppic = mypic.copy((79*y1)+1,(124*x1)+1,79,124)
4025 nPlayer1Score = 0 nPlayer2Score=0
4030 again Page1.lnewgame
4034 Player1EatPic.delete()
4035 Player2EatPic.delete()
4041 func gui_setbtnpixmap pBtn,pPixmap
4043 setIcon(new qicon(pPixmap.scaled(width(),height(),0,0)))
4044 setIconSize(new QSize(width(),height()))
4050 win1 layout1 label1 label2 layout2 layout3 aBtns aBtns2
4051 aCards nRole=1 aStatus = list(nCardsCount) aStatus2 = aStatus
4052 aValues aStatusValues = aStatus aStatusValues2 = aStatus
4053 Player1EatPic Player2EatPic
4060 win1 = new qWidget() {
4061 setwindowtitle("Five")
4062 setstylesheet("background-color: White")
4066 layout1 = new qvboxlayout()
4068 label1 = new qlabel(win1) {
4069 settext("Player (1) - Score : " + nPlayer1Score)
4070 setalignment(Qt_AlignHCenter | Qt_AlignVCenter)
4071 setstylesheet("color: White; background-color: Purple;
4076 closebtn = new qpushbutton(win1) {
4077 settext("Close Application")
4078 setstylesheet("font-size: 18px ; color : white ;
4079 background-color: black ;")
4080 setclickevent("Page1.win1.close()")
4086 layout2 = new qhboxlayout()
4090 for x = 1 to nCardsCount
4091 aBtns + new qpushbutton(win1)
4092 aBtns[x].setfixedwidth(79*nScale)
4093 aBtns[x].setfixedheight(124*nScale)
4094 gui_setbtnpixmap(aBtns[x],mypic2)
4095 layout2.addwidget(aBtns[x])
4096 aBtns[x].setclickevent("Page1.Player1click("+x+")")
4099 layout1.addwidget(label1)
4100 layout1.addlayout(layout2)
4102 label2 = new qlabel(win1) {
4103 settext("Player (2) - Score : " + nPlayer2Score)
4104 setalignment(Qt_AlignHCenter | Qt_AlignVCenter)
4105 setstylesheet("color: white; background-color: red;
4110 layout3 = new qhboxlayout()
4113 for x = 1 to nCardsCount
4114 aBtns2 + new qpushbutton(win1)
4115 aBtns2[x].setfixedwidth(79*nScale)
4116 aBtns2[x].setfixedheight(124*nScale)
4117 gui_setbtnpixmap(aBtns2[x],mypic2)
4118 layout3.addwidget(aBtns2[x])
4119 aBtns2[x].setclickevent("Page1.Player2click("+x+")")
4122 layout1.addwidget(label2)
4123 layout1.addlayout(layout3)
4124 layout1.addwidget(closebtn)
4126 win1.setlayout(layout1)
4131 if nRole = 1 and aStatus[x] = 0
4132 nPos = ((random(100)+clock())%(len(aCards)-1)) + 1
4133 gui_setbtnpixmap(aBtns[x],aCards[nPos])
4137 aStatusValues[x] = aValues[nPos]
4139 Player1Eat(x,aStatusValues[x])
4144 if nRole = 2 and aStatus2[x] = 0
4145 nPos = ((random(100)+clock())%(len(aCards)-1)) + 1
4146 gui_setbtnpixmap(aBtns2[x],aCards[nPos])
4150 aStatusValues2[x] = aValues[nPos]
4152 Player2Eat(x,aStatusValues2[x])
4156 Func Player1Eat nPos,nValue
4158 app1.processEvents()
4162 for x = 1 to nCardsCount
4163 if aStatus2[x] = 1 and (aStatusValues2[x] = nValue or nValue=5)
4165 gui_setbtnpixmap(aBtns2[x],Player1EatPic)
4169 if (x != nPos) and (aStatus[x] = 1) and
4170 (aStatusValues[x] = nValue or nValue=5)
4172 gui_setbtnpixmap(aBtns[x],Player1EatPic)
4179 gui_setbtnpixmap(aBtns[nPos],Player1EatPic)
4181 label1.settext("Player (1) - Score : " + nPlayer1Score)
4184 Func Player2Eat nPos,nValue
4186 app1.processEvents()
4190 for x = 1 to nCardsCount
4191 if aStatus[x] = 1 and (aStatusValues[x] = nValue or nValue = 5)
4193 gui_setbtnpixmap(aBtns[x],Player2EatPic)
4198 if (x != nPos) and (aStatus2[x] = 1) and
4199 (aStatusValues2[x] = nValue or nValue=5 )
4201 gui_setbtnpixmap(aBtns2[x],Player2EatPic)
4208 gui_setbtnpixmap(aBtns2[nPos],Player2EatPic)
4210 label2.settext("Player (2) - Score : " + nPlayer2Score)
4217 if nPlayer1Score > nPlayer2Score
4218 label1.settext("Player (1) Wins!!!")
4220 if nPlayer2Score > nPlayer1Score
4221 label2.settext("Player (2) Wins!!!")
4224 app1.processEvents()
4225 delay(nDelayNewGame)
4251 .. image:: ringqt_shot48.jpg
4254 .. note:: 前述のスクリーンショットではプレイヤーが‘5’番のカードを入手していますがスコアは加算されていません。
4255 これはほかのカードが不可視状態のときに‘5’番のカードを開いたからです!
4257 このスクリーンショットはモバイル機器 (Android) でゲームを実行しています。
4259 .. image:: ringqt_shot52.jpg
4262 .. note:: Qt を使うと同じアプリケーションをほかのモバイルシステムで実行できます。
4266 pair: RingQt によるデスクトップとモバイル開発; クラスとメソッドでデフォルトのイベントを使うには
4269 クラスとメソッドでデフォルトのイベントを使うには
4270 ================================================
4272 この表ではクラス名、およびメソッドで使用するデフォルトのイベントについて説明しています。
4274 ============================== ===========================================================
4275 クラス名 メソッドで使用するデフォルトのイベント
4276 ============================== ===========================================================
4277 QPushButton SetClickEvent()
4278 QAction SetClickEvent()
4279 QLineEdit SetTextChangedEvent()
4280 .. SetCursorPositionChangedEvent()
4281 .. SetEditingFinishedEvent()
4282 .. SetReturnPressedEvent()
4283 .. SetSelectionChangedEvent()
4284 .. SetTextEditedEvent()
4285 QTextEdit SetCopyAvailableEvent()
4286 .. SetCurrentCharFormatChangedEvent()
4287 .. SetCursorPositionChangedEvent()
4288 .. SetRedoAvailableEvent()
4289 .. SetSelectionChangedEvent()
4290 .. SetTextChangedEvent()
4291 .. SetUndoAvailableEvent()
4292 QListWidget SetCurrentItemChangedEvent()
4293 .. SetCurrentRowChangedEvent()
4294 .. SetCurrentTextChangedEvent()
4295 .. SetItemActivatedEvent()
4296 .. SetItemChangedEvent()
4297 .. SetItemClickedEvent()
4298 .. SetItemDoubleClickedEvent()
4299 .. SetItemEnteredEvent()
4300 .. SetItemPressedEvent()
4301 .. SetItemSelectionChangedEvent()
4302 QTreeView SetCollapseEvent()
4303 .. SetExpandedEvent()
4304 .. SetActivatedEvent()
4305 .. SetClickedEvent()
4306 .. SetDoubleClickedEvent()
4307 .. SetEnteredEvent()
4308 .. SetPressedEvent()
4309 .. SetViewportEnteredEvent()
4310 QTreeWidget SetCollapsedEvent()
4311 .. SetExpandedEvent()
4312 .. SetActivatedEvent()
4313 .. SetClickedEvent()
4314 .. SetDoubleClickedEvent()
4315 .. SetEnteredEvent()
4316 .. SetPressedEvent()
4317 .. SetViewportEnteredEvent()
4318 .. SetCurrentItemChangedEvent()
4319 .. SetItemActivatedEvent()
4320 .. SetItemChangedEvent()
4321 .. SetItemClickedEvent()
4322 .. SetItemCollapsedEvent()
4323 .. SetItemDoubleClickedEvent()
4324 .. SetItemEnteredEvent()
4325 .. SetItemExpandedEvent()
4326 .. SetItemPressedEvent()
4327 .. SetItemSelectionChangedEvent()
4328 QComboBox SetActivatedEvent()
4329 .. SetCurrentIndexChangedEvent()
4330 .. SetEditTextChangedEvent()
4331 .. SetHighlightedEvent()
4332 QTabWidget SetCurrentChangedEvent()
4333 .. SetTabCloseRequestedEvent()
4334 QTableWidget SetCellActivatedEvent()
4335 .. SetCellChangedEvent()
4336 .. SetCellClickedEvent()
4337 .. SetCellDoubleClickedEvent()
4338 .. SetCellEnteredEvent()
4339 .. SetCellPressedEvent()
4340 .. SetCurrentCellChangedEvent()
4341 .. SetCurrentItemChangedEvent()
4342 .. SetItemActivatedEvent()
4343 .. SetItemChangedEvent()
4344 .. SetItemClickedEvent()
4345 .. SetItemDoubleClickedEvent()
4346 .. SetItemEnteredEvent()
4347 .. SetItemPressedEvent()
4348 .. SetItemSelectionChangedEvent()
4349 QProgressBar SetValueChangedEvent()
4350 QSpinBox SetValueChangedEvent()
4351 QSlider SetActionTriggeredEvent()
4352 .. SetRangeChangedEvent()
4353 .. SetSliderMovedEvent()
4354 .. SetSliderPressedEvent()
4355 .. SetSliderReleasedEvent()
4356 .. SetValueChangedEvent()
4357 QDial SetActionTriggeredEvent()
4358 .. SetRangeChangedEvent()
4359 .. SetSliderMovedEvent()
4360 .. SetSliderPressedEvent()
4361 .. SetSliderReleasedEvent()
4362 .. SetValueChangedEvent()
4363 QWebView SetLoadFinishedEvent()
4364 .. SetLoadProgressEvent()
4365 .. SetLoadStartedEvent()
4366 .. SetSelectionChangedEvent()
4367 .. SetTitleChangedEvent()
4368 .. SetUrlChangedEvent()
4369 QCheckBox SetStateChangedEvent()
4370 .. SetClickedEvent()
4371 .. SetPressedEvent()
4372 .. SetReleasedEvent()
4373 .. SetToggledEvent()
4374 QRadioButton SetClickedEvent()
4375 .. SetPressedEvent()
4376 .. SetReleasedEvent()
4377 .. SetToggledEvent()
4378 QButtonGroup SetButtonClickedEvent()
4379 .. SetButtonPressedEvent()
4380 .. SetButtonReleasedEvent()
4381 QVideoWidget SetBrightnessChangedEvent()
4382 .. SetContrastChangedEvent()
4383 .. SetFullScreenChangedEvent()
4384 .. SetHueChangedEvent()
4385 .. SetSaturationChangedEvent()
4386 QTimer SetTimeoutEvent()
4387 QTcpServer SetAcceptErrorEvent()
4388 .. SetNewConnectionEvent()
4389 QIODevice SetAboutToCloseEvent()
4390 .. SetBytesWrittenEvent()
4391 .. SetReadChannelFinishedEvent()
4392 .. SetReadyReadEvent()
4393 QAbstractSocket SetConnectedEvent()
4394 .. SetDisconnectedEvent()
4396 .. SetHostFoundEvent()
4397 .. SetProxyAuthenticationRequiredEvent()
4398 .. SetStateChangedEvent()
4399 QTcpSocket SetConnectedEvent()
4400 .. SetDisconnectedEvent()
4402 .. SetHostFoundEvent()
4403 .. SetProxyAuthenticationRequiredEvent()
4404 .. SetStateChangedEvent()
4405 .. SetAboutToCloseEvent()
4406 .. SetBytesWrittenEvent()
4407 .. SetReadChannelFinishedEvent()
4408 .. SetReadyReadEvent()
4409 QColorDialog SetColorSelectedEvent()
4410 .. SetCurrentColorChangedEvent()
4411 QNetworkAccessManager SetFinishedEvent()
4412 QThread SetStartedEvent()
4413 .. SetFinishedEvent()
4414 ============================== ===========================================================
4417 pair: RingQt によるデスクトップとモバイル開発; イベントでイベントフィルタによるメソッド
4419 イベントでイベントフィルタによるメソッド
4420 ============================================
4422 RingQt はイベントフィルタを使用することにより、新しいクラス QAllEvents を定義しています。
4426 ================================ ======================
4428 ================================ ======================
4429 getKeyCode() --> Number QAllEvents
4432 getglobalx() --> Number
4433 getglobaly() --> Number
4434 getbutton() --> Number
4435 getbuttons() --> Number
4436 ================================ ======================
4438 この表はイベントで使用するメソッドを解説しています。
4440 =================================================== ======================
4442 =================================================== ======================
4443 setKeyPressEvent(cEvent) QAllEvents
4444 setMouseButtonPressEvent(cEvent)
4445 setMouseButtonReleaseEvent(cEvent)
4446 setMouseButtonDblClickEvent(cEvent)
4447 setMouseMoveEvent(cEvent)
4448 setCloseEvent(cEvent)
4449 setContextMenuEvent(cEvent)
4450 setDragEnterEvent(cEvent)
4451 setDragLeaveEvent(cEvent)
4452 setDragMoveEvent(cEvent)
4453 setDropEvent(cEvent)
4454 setEnterEvent(cEvent)
4455 setFocusInEvent(cEvent)
4456 setFocusOutEvent(cEvent)
4457 setKeyReleaseEvent(cEvent)
4458 setLeaveEvent(cEvent)
4459 setNonClientAreaMouseButtonDblClickEvent(cEvent)
4460 setNonClientAreaMouseButtonPressEvent(cEvent)
4461 setNonClientAreaMouseButtonReleaseEvent(cEvent)
4462 setNonClientAreaMouseMoveEvent(cEvent)
4463 setMoveEvent(cEvent)
4464 setResizeEvent(cEvent)
4465 setWindowActivateEvent(cEvent)
4466 setWindowBlockedEvent(cEvent)
4467 setWindowDeactivateEvent(cEvent)
4468 setWindowStateChangeEvent(cEvent)
4469 setWindowUnblockedEvent(cEvent)
4470 =================================================== ======================
4473 pair: RingQt によるデスクトップとモバイル開発; Qt と RingQt の違い
4478 (1) RingQt ではイベントの実行用コードを設定するために単純なメソッドを使用します。
4482 .. code-block:: none
4484 Set<Event_Name>Event(cEventCode)
4486 (2) RingQt では Ring キーワードとの衝突を回避するためにメソッド名を変更しています。
4490 =============================== ====================== =====================
4491 クラス名 Qt メソッド名 RingQt メソッド名
4492 =============================== ====================== =====================
4493 QWebView load loadpage
4494 QMediaPlaylist load loadfile
4495 QMediaPlaylist next movenext
4496 QPainter end endpaint
4497 QPicture load loadfile
4498 QLineEdit end endtext
4499 QDialog done donedialog
4500 QTextDocument end enddoc
4501 QTextBlock next nextblock
4502 QSqlQuery next movenext
4503 QImage load loadimage
4504 QNetworkAccessManager get getvalue
4505 QNetworkAccessManager put putvalue
4506 QThread exit exitfromthread
4507 QRegularExpressionMatchIterator next nextitem
4508 QCamera load loadcamera
4509 =============================== ====================== =====================
4512 pair: RingQt によるデスクトップとモバイル開発; RingQt クラスおよび Qt の取扱説明書
4514 RingQt クラスおよび Qt の取扱説明書
4515 =========================================
4517 Qt 取扱説明書 : http://doc.qt.io/qt-5/classes.html
4519 対応しているクラスとメソッドについては “RingQt クラスとメソッドのリファレンス” の章を参照してください。
4523 pair: RingQt によるデスクトップとモバイル開発; 新しいクラス名 - 1 からインデックスを開始
4525 新しいクラス名 - 1 からインデックスを開始
4526 =========================================
4528 RingQt には新しいクラスが追加されています - 別バージョンのクラス名は小文字 “q” で開始されません。
4529 また GUI コントロールなど扱うときにインデックスが 1 から開始するようにメソッドを更新してあります。
4536 前述のクラスは guilib.ring の System.GUI パッケージに実装されています:
4540 .. code-block:: ring
4546 これは以前のコードに一切影響を与えません。
4547 つまり Ring の規則と整合性がある優れたコードへの第三の選択です。
4549 またフォームデザイナーは、クラス間で「インデックスを 0 から開始」
4550 または「インデックスを 1 から開始」を選択肢を使用するために更新しました。
4554 (1) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartView.ring
4556 (2) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartController.ring
4559 pair: RingQt によるデスクトップとモバイル開発; WebLib および GUILib によるレポートの作成方法
4562 WebLib および GUILib によるレポートの作成方法
4563 =================================================
4565 WebLib には HtmlPage クラスがあります。
4567 このクラスにより WebLib と GUILib で手軽にレポートを作成できます。
4571 .. code-block:: ring
4581 open_window(:CustomersReportController)
4585 class CustomersReportController
4587 oView = new CustomersReportView
4593 mypage = new HtmlPage {
4594 h1 { text("Customers Report") }
4597 style = stylewidth("100%") + stylegradient(4)
4601 text("Customers Count : " ) }
4607 style = stylewidth("100%") + stylegradient(26)
4610 style = stylewidth("100%") +
4612 TD { text("Name " ) }
4614 TD { text("Country" ) }
4616 TD { text("Company" ) }
4621 TD { text("Test" ) }
4623 TD { text("Egypt" ) }
4624 TD { text("Sales" ) }
4625 TD { text("Future" ) }
4630 write("report.html",mypage.output())
4633 printer1 = new qPrinter(0) {
4635 setoutputfilename("report.pdf")
4641 system ("report.pdf")
4643 class CustomersReportView
4645 win = new window() {
4646 setwindowtitle("Report Window")
4647 setgeometry(100,100,500,500)
4648 web = new webview(win) {
4649 setgeometry(100,100,1000,500)
4650 loadpage(new qurl("file:///"+
4651 currentdir()+"/report.html"))
4653 new pushbutton(win) {
4654 setGeometry(100,20,100,30)
4656 setclickevent(Method(:PrintEvent))
4663 .. image:: ring15reportshot.png