xyzghost
xyzghost在那呢
@jesse_時間到了, 要開始囉!
@lloyd_拍手..
@jesse_xyzghost: 等一下會有 URL
xyzghostOK
@jesse_拍手...
xyzghost拍手....
xyzghost
* jesse_ 拍拍拍
spke九點了...加油加油 .
* AceLan 鼓掌喝采!
kanru拍拍拍拍
@jesse_很高興這次請到 AceLan 上來
/*/ [In] anychris (any@sw70-158-77.adsl.seed.net.tw) has joined #debian.tw
@AceLanccc
@jesse_講 Qt 程式設計無痛起步
@jesse_我廢話不多說, 請 AceLan 開始囉!
@AceLan^^
@AceLan大家好,這次要講的題目是 "Qt 程式設計無痛起步"。
@AceLan相信大家都已經裝好所需的程式, 如果還沒裝好的話,趁我現在還在廢話的時後 apt-get 一下吧 ^^
@AceLan由於這是無痛起步,所以我不會講太多跟程式相關的東西,我會盡量使用 Qt 提供的 widget 來組合出程式,但是還是難免會需要寫些程式碼,請各位多多包含 m(_ _)m
@AceLan在開始之前,我先提一下我們可能會使用到的一些程式方面的技術,包括 C++、物件導向概念、STL…等。沒蓋念沒關係,用到的東西都很簡單,要是真的聽不懂,請問 google 大大 :p
@AceLan趁大家還在裝 Qt lib 的時間,我來貼點明哲大大之前寫的文章,稍微簡介一下 Qt,由於
@AceLan當時時空背景的關係,gtk 還不成氣候,所以請某位 gnome 派的大大稍微忍耐一下 :p
* AceLan 刀疤蔡竟然不在 :(
@AceLan[Quote]
@AceLanWhat is Qt ?
@AceLan在現有的window system ,如 MS Window, X Window ,Mac 等的操作上,都提供一些常見的
@AceLan視窗元件如 Button,Toolbar, Scrollbar 方便使用者操作, Qt 就是一套這樣的 library
@AceLan,它除了提供一些常見的視窗元件外,還有提供類似 STL 的 abstract data type,並且整
@AceLan合 BSD socket ,I/O control, 及一些在視窗程式設計上常見的功能,你可以把它視為一種提供與MFC,OWL 這些 library 相似功能的 library。
@AceLan除此之外, Qt 還是一套跨平台的 GUI (Graphic User Interface ) library ,除了有 API layer 的相容外也提供GUI介面的模擬。例如在麥金塔上,你可以使用 Mac Style 的GUI 介面,免除使用者重新學習一個新的操作介面。
@AceLan目前 Qt 最常使用的地方還是在 X Window 上,因為 X Window 本身在設計上只有提供一個 window system 所需的最基本功能,如畫線,設定視窗顏色,設定每個 pixel 的值等。所以像 Qt 這些提供較高階視窗操作的
@AceLan library 就很流行,加上目前有許多大型的計畫如 KDE , KDevelop 等都採用 Qt 作為內定的 GUI library 使得 Qt 在 X Window 上儼然有主流 GUI library 的姿態。
/*/ [In] asho (~asho@218-168-24-82.HINET-IP.hinet.net) has joined #debian.tw
@AceLan那 Qt 與其他 widgets set (這類 GUI library 在 X Window 上稱為 Widget Set,同理
@AceLan widget 就是指那些視窗元件如 Scrollbar 等)比起來,除了上面所講的跨平台外有何特
@AceLan別的地方:
@AceLan* 使用 C++ :可以利用 C++ 本身在 C++ 語法上的支援,及與現有的 c library 相容,這點在慣用 MS Windows 上的人看起來可能覺得沒什麼,可是在 Unix/X 上的環境相當複雜,有各種不同的 language ,依不同場合及需求同時使用,不像 Windows 上就那幾套工具及 library 。
@AceLan* 與 OpenGL 整合在一起,提供完整 2D/3D 的繪圖。
@AceLan* 提供幾乎與 stand c++ library 相容的 library ,如 QTL ,File I/O,network , compress ,composed graphic...,所以你的 Qt application 幾乎 只要重新 compile 就可在其他 platform 上跑。
@AceLan* 提供 signal/slot,作為 object 之間溝通的基本方式,這也是這裡所要講的重點,我們後面再做詳細的討論。
@AceLan[/Quote]
@AceLan好了,廢話完了,現在開始用 Qt Designer 來寫個 Hello World 程式,順便測試一下各位的 Qt 是否有安裝正確。
@AceLan首先,請大家開啟 Qt Designer,在 console 下輸入 designer 或 designer-qt3 或是在 K 選單中 程式開發->Qt Designer 或是跟我一樣用 CVS 版的
@AceLan KDE 可在 K 選單->Unknown->Qt Designer 開啟,開啟來的 Qt Designer 長的像這樣 http://kde.linux.org.tw/~acelan/irc_conference/qt01.png
-cancan:#debian.tw- 116: http://kde.linux.org.tw/~acelan/irc_conference/qt01.png from AceLan
/*/ [Out] asho (~asho@218-168-24-82.HINET-IP.hinet.net) has quit [Client exiting]
@jesse_http://gallery.debian.org.tw/20031018/qt01
-cancan:#debian.tw- 117: http://gallery.debian.org.tw/20031018/qt01 from jesse_
@AceLan問一下 有都開起來了嗎
@jesse_cancan: part
/*/ [Out] cancan was kicked from #debian.tw by jesse_ [jesse_]
@AceLan我們選擇 C++ Project 來建立一個新的 project(http://kde.linux.org.tw/~acelan/irc_conference/qt02.png)
kanru有^^
@AceLan^^
@jesse_http://gallery.debian.org.tw/20031018/qt02
/*/ [In] xpalex (~blahwins@210-85-211-15.cm.apol.com.tw) has joined #debian.tw
@AceLan在 Settings tab 的 Porject File 那,請設定好 project 的路徑,以免檔案太凌亂,然
@AceLan後選擇 C++ tab,看一下你所安裝的 Qt 有沒有 -mt 字樣,這是 multi-thread 版的 Qt lib,如果有的話,請在 Config 那加上 thread(http://kde.linux.org.tw/~acelan/irc_conference/qt03.png),然後就可以建立 project 了。
@jesse_http://gallery.debian.org.tw/20031018/qt03
@AceLan建立好 project 之後,我們還得要 new 一個 dialog,所以 File->New 選 Dialog,注意
@AceLan上方的 Insert into 是否是你 project 的名稱。new 完之後你就有個 dialog 可以在上面放東西了。
@AceLan首先我們先在左邊的 Toolbox 選擇 Common Widget 的 TextLabel,然後在 dialog 上隨意的拉出一塊方形的區域,然後再到 Common Widget 裡選擇 PushButton,一樣在 dialog 上隨意拉出區域(http://kde.linux.org.tw/~acelan/irc_conference/qt04.png)
@jesse_http://gallery.debian.org.tw/20031018/qt04
@AceLan然後我們在 textLabel1 上點兩下,來改一下它顯示的內容,把它改成 "Hello Wolrd!!"
@AceLan接著一樣在 pushButton1 點兩下,將內容改成 "離開" 或是 "再見" 隨你高興。
@AceLan最後,我們看上面的那個 Form1 字樣很不滿意,所以我們先在 dialog 上點一下,然後到右下角 Property Editor/Signal Handler 的 Property Editor tab 那邊去找到 caption 這個欄位,將它改成 "Hello",完成的 dialog 就會長成這樣 http://kde.linux.org.tw/~acelan/irc_conference/qt05.png。
@jesse_http://gallery.debian.org.tw/20031018/qt05
@AceLan完成了畫面,可以從 Preview->Preview Form 或是按下 C-t 可以看到畫面執行時的樣子。
@AceLan這樣會太快嗎?
@jesse_好像有一點點.. :)
@kevinwatt光用眼精看的話不會.. :P
@AceLan:p
@AceLan那我在慢一點 大家慢慢來喔
* AceLan 揉了揉 zzz 的雙眼, 打了個呵欠, 愛睏ㄍㄚˋ.
@jesse_@@
* AceLan 用很奇怪的眼神瞄 jesse_。
@jesse_繼續吧! :)
@AceLan到這邊有人有什麼問題嗎
xyzghost#_#
anychris可以在兩句話之間空一行嗎 這樣應該會清楚點@@
@AceLan是的
@AceLan
@AceLan這樣可以嗎 :p
/*/ [In] descent (a@u248-157.u61-71.giga.net.tw) has joined #debian.tw
jrgl沒問題... :-)
* AceLan 貪婪地舔了舔 descent 的臉。
anychris嗯:)
xyzghost.........
@AceLan那我要繼續囉
@AceLan接著我們要來加點程式,讓那個"離開"按鈕生效。
@AceLan
@AceLan點一下"離開"按鈕,然後到右下的 Property Editor/Signal Handler 的 Signal Handler tab 上的 clieked() 點三下
@AceLan
@AceLan它會跳出一個對話盒,詢問你是否要建立 .ui file,回答 Yes
@AceLan
@AceLan後你會看到一個編輯程式的畫面,在大括號裡面輸入 this->reject();
@AceLan
@AceLan這行的意思是說,呼叫 this 這個物件的 reject() method,this 就是我們的 dialog,而 reject() 的意思就是關閉 dialog (http://kde.linux.org.tw/~acelan/irc_conference/qt06.png)。
@jesse_http://gallery.debian.org.tw/20031018/qt06
@AceLan
@AceLan存檔完後,選有一個步驟要做,那就是建立 main() function。
@AceLan
/*/ [Out] descent (a@u248-157.u61-71.giga.net.tw) has quit [Leaving]
@AceLanFile->New 選 C++ Main-File(main.cpp),確定有 include Form1 之後按確定,然後就可以看到 main.cpp 的程式編輯畫面,直接存檔就可以了。
/*/ [In] descent (a@u248-157.u61-71.giga.net.tw) has joined #debian.tw
@AceLan
@AceLan接著,我們要來編譯程式了。
@AceLan
@AceLan開啟 console 切換到 project 的 hello 目錄,確定 QTDIR 有正確指到 Qt 的目錄,我的設定是 export QTDIR=/usr/share/qt3/
@AceLan
@AceLan然後輸入 qmake hello.pro
@AceLan
@AceLan它會幫我們產生 Makefile 檔,接著再執行 make 就可以產生出我們的 hello 程式了。(http://kde.linux.org.tw/~acelan/irc_conference/qt07.png)
@jesse_http://gallery.debian.org.tw/20031018/qt07
/*/ [Out] descent (a@u248-157.u61-71.giga.net.tw) has quit [Leaving]
@AceLan
@AceLan呼呼~~ 終於完成了 hello 程式,到這邊有什麼問題嗎。
/*/ [In] descent (~a@u248-157.u61-71.giga.net.tw) has joined #debian.tw
descenttesting
descent測試
@jesse_AceLan: dialog 是指這個程式嗎?
@AceLanjesse_:
@AceLanjesse_: 是的
@jesse_this->reject() 的 this 不是指該 button ?
@AceLanjesse_: 因為這個 hello 是以 dialog 為主體 所以用 dialog 來稱呼
@AceLan不的 this 指的是 dialog
@AceLanbutton clicked 之後 dialog 要關閉 呼叫的當然是 dialog 的 reject()
@jesse_oh, Form1::pushButton ...
@jesse_ok
@AceLan^^
/*/ [Out] xpalex (~blahwins@210-85-211-15.cm.apol.com.tw) has quit [Leaving]
@AceLan有人的 hello 成功了嗎
kanru沒QQ
@AceLan是什麼問題呢?
jrgl成功了...:-)
@AceLanjrgl: 恭喜 ^^
kanru.h檔找不到
@AceLankanru: echo $QTDIR
@AceLankanru: 看一下你的設定對嗎
kanru我的應該是在/usr/include/qt3
@AceLankanru: 那你試試 export QTDIR=/usr/include/qt3 之後在 make 試試
anychris有其他人是使用windows的嗎..
@AceLananychris: 你是用 windows?
anychris嗯..我右邊是空的 找不到 Property Editor/Signal Handler
@AceLananychris: windows->views 那邊可以點出來
kanru我設了以後make...結果還是g++ -c -pipe -Wall -W -O2  -DQT_NO_DEBUG -I/usr/share/qt3/mkspecs/default -I. -I/usr/share/qt3/include -I.ui/ -I. -I.moc/ -o .obj/main.o main.cpp
@AceLan錯誤訊息是?
kanrumain.cpp:1:26: qapplication.h: 沒有此一檔案或目錄
kanru等等
kanru都是這樣的錯誤
@AceLankanru: 你是用 debian 嗎?
anychrisAceLan: 我是有 Property View.. 不過找不到 Signal Handler
kanruAceLan:yes
@AceLananychris: 同一個窗 但是不同 tab
@AceLankanru: 那你的設定應該跟我一樣才對阿
@AceLankanru: export QTDIR=/usr/share/qt3
anychrisAceLan: 該怎麼說呢.. 我的 property view沒tab
@AceLananychris: 你是用 windows? Qt 2.3?
kanruAceLan:還是一樣...我覺得他好像還是沒改路徑
anychrisAceLan: 嗯, QT Designer 2.3.0
@AceLananychris: Qt 2.3 的 designer 沒辦法在上面編 code
@AceLananychris: 只能拉畫面而已 *_*
anychrisAceLan: @@
@AceLankanru: hmm
anychrisAceLan: 那麼win32下還有其他能code qt的軟體嗎.. 難怪我之前玩的時候就找不到寫code的部份..
kanruAceLan:我用locate找...qapplication.h是放在/usr/lib/qt3下耶
@AceLankanru: export 完之後 重新 qmake 一次
kanru錯..是/usr/include/qt3
@AceLananychris: 好像沒有耶 Qt 2.3 就是只能拉畫面 拉完之後在自己用其他的 editor 寫程式
@AceLankanru: 很多目錄都可以 但是 /usr/share/qt3 裡面是比較完整的
@AceLankanru: 不單單只有 header 還有 uic moc 等程式也在裡面
R7charsmm, bcbx /kylix?
@AceLananychris: 等一下我會講手動編譯程式的方法 你可能會用到那部份
anychrisAceLan: 嗯 :)
kanru會不會是因為我沒有裝qt3-apps-dev的關係?
@AceLankanru: 你裝看看吧 :p
/*/ [In] acechen (~acechen@circ.tcfsh.tc.edu.tw) has joined #debian.tw
kanruq
/*/ [Out] kanru (~kanru@ip097.puli18.ncnu.edu.tw) has quit [[BX] Pretzel Boy uses BitchX. Shouldn't you?]
/*/ [In] kanru (~kanru@ip097.puli18.ncnu.edu.tw) has joined #debian.tw
kanruQQ
@AceLan由於時間的關係 我們要繼續往下講了
anychrisAceLan: 請問qt designer win32下是都沒有辦法在designer下code? 還是只有non-commercial沒有?
@AceLankanru: 你成功了嗎?
kanruAceLan:沒...我等等再試?
@AceLananychris: non-commercial 只有 2.3 版 要 3.0 以上才能在 designer 裡面寫 code
@AceLankanru: ^^
@AceLan那我要繼續囉
@AceLan現在來講一下剛剛使用的 Qt 提供的編譯工具。
@AceLan
@AceLanqmake 可以從 Qt Designer 的 project 檔生出 Makefile 檔
@AceLan Makefile 檔裡頭會有 uic、moc 等 qt 的 preprocessor 來幫你將在 Qt Designer 上拉的畫面轉成 C++ 的 class。
@AceLan
@AceLanuic 的主要工能是將 .ui 檔轉成包含 widgets 的 .h 與 .cpp,裡面會有 dialog 上 widgets 的 constructor,還有那些 button clicked 之後會觸發的程式碼。
@AceLan
@AceLan而 moc 則是將這些轉換後的程式碼裡面有用到的 Qt 特有的東西再經過一次處理。
@AceLan
@AceLan因為現在 qmake 功能強大,以經不需要手動來執行 uic、moc 這些程式了,不過我們還是以剛剛的 hello 為例,說明一下不使用 qmake 來幫我產生 Makefile 檔時,我們所需要的步驟。
@AceLan
@AceLan首先先來看一下我們目前的目錄結構 等一下提到的檔案路徑就以這個為準
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/hello$ ls -a
@AceLan.   form1.ui    hello      main.cpp  .moc  .ui
@AceLan..  form1.ui.h  hello.pro  Makefile  .obj
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/hello$ ls .moc
@AceLanmoc_form1.cpp
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/hello$ ls .ui
@AceLanform1.cpp  form1.h
@AceLan
@AceLan執行 uic 來將 .ui 檔成 class 及其 constructor
@AceLan        uic form1.ui > .ui/form1.h      # 產生 header -- class 的定義
@AceLan        uic -impl .ui/form1.h form1.ui > .ui/form1.cpp  # 產生 constructor 及在 Qt Designer 中寫的程式碼
@AceLan
@AceLan        moc .ui/form1.h > .moc/moc_form1.cpp    # 將 .ui/form1.h 中用到的 Qt 特有的 macro 作處理
@AceLan        g++ -o hello .ui/form1.cpp .moc/moc_form1.cpp main.cpp -I/usr/share/qt3/include -I.ui -lqt-mt   # 編譯程式
@AceLan
/*/ [Out] anychris (any@sw70-158-77.adsl.seed.net.tw) has quit [Ping timeout]
@AceLan以上就是自己動手編譯程式所需的步驟。對於這些工具有什麼問題嗎?
jrglAceLan: 沒有....:)
@AceLan^^
kanruAceLan:有...我沒有/usr/share/qt3/include...是不是少裝了什麼?
jrglusr/share/qt3/include    libdevel/libqt3-dev,libdevel/libqt3-mt-dev
@AceLan呵呵 動作比我快
/*/ [In] anychris (any@sw68-104-104.adsl.seed.net.tw) has joined #debian.tw
@AceLankanru: ok 了嗎?
@AceLan後面一一堆廢話 還有時間讓你慢慢試
@AceLan我先把他貼完喔 :p
kanruk
@AceLan再來要講解 widget
@AceLan
@AceLanwidget 就是指構成視窗畫面的元件,像是 scrollbar、texteditor、combobox、pushbutton…等等
@AceLan
@AceLan就是在 Qt Designer 左手邊那欄整個都是,那些就是 widget 啦。
@AceLan
@AceLan關於 widget 的其他介紹,我想請各位到這個網站看就可以了,讓我偷懶一下吧 :p
@AceLan
@AceLanhttp://www.caterpillar.onlyfun.net/phpBB2/viewforum.php?f=15
@AceLan
@AceLan裡面有很多 widget 的使用範例,有需要的話到這邊看一下用法是最方便的。不過他的頻寬不大,大家一起進去看的話,可能會動不了喔 :p
@AceLan
@AceLan關於 signal/slot 機制的說明,也請大家來看這篇明哲大大的文章,再讓我偷懶一下吧 :p
@AceLan
@AceLanhttp://www.linuxfab.com/indexColumnDataFriendlyPrint.php?CID=33
@AceLan
@AceLansignal/slot 的內容在那篇文章大約 1/3 的地方(The Signal/Slot Method),從那邊開始看就可以了。
@AceLan
@AceLan休息三分鐘讓各位消化一下 ^^
/*/ [In] saviro (~Saviro@pc9.cable68.tku.edu.tw) has joined #debian.tw
@AceLan那我們要繼續囉
@AceLan
@AceLan剛剛 hello 程式的版面沒有經過排版,而且我們縮放視窗時,widget 也不會跟著改變相對位置,所以我們現在要來加上 widget 的 layout,好讓他能在 user 縮放視窗時也可以運作正確。
@AceLan
@AceLan再將 hello project 在 Qt Designer 中開起來,如果你的視窗沒出現任何東西的話,請選擇 Window->Views->Project Overview 然後將 form1.ui 給點出來,然後再將 Porject Overview 給關掉。
@AceLan
@AceLan首先我們要先想好我們希望 widget 的擺放方式,我們想要那個 textLabel 在上面,pushButton 在右下角
@AceLan
@AceLan所以我們選擇彈簧(spacer)(我自己亂叫的 :p)在 pushButton 的左側橫拉(http://kde.linux.org.tw/~acelan/irc_conference/qt08.png)
@jesse_http://gallery.debian.org.tw/20031018/qt08
@AceLan
@AceLan然後將 spacer 跟 pushButton 兩個一起框起來,並且選擇這個(http://kde.linux.org.tw/~acelan/irc_conference/qt09.png)
@AceLan
@jesse_http://gallery.debian.org.tw/20031018/qt09
@AceLan
@AceLan表示 spacer 跟 pushButton 兩個是橫向並排的(http://kde.linux.org.tw/~acelan/irc_conference/qt10.png)
@jesse_http://gallery.debian.org.tw/20031018/qt10
@AceLan
@AceLan然後兩將 textLabel 跟 spacer & pushButton 一起框起來,選擇這個(http://kde.linux.org.tw/~acelan/irc_conference/qt11.png)
@jesse_http://gallery.debian.org.tw/20031018/qt11
@AceLan
@AceLan表示他們是縱向直排的(http://kde.linux.org.tw/~acelan/irc_conference/qt12.png)
@jesse_http://gallery.debian.org.tw/20031018/qt12
@AceLan
@AceLan最後,是不是還覺得 dialog 內容跟外框不搭呢?我們直接點 dialog 一下,然後再選直排或橫排一下(執行結果沒有差別)
@AceLan
@AceLan這樣內容跟外框就合起來了,順便再調整一下 dialog 大小(http://kde.linux.org.tw/~acelan/irc_conference/qt13.png)。
@jesse_http://gallery.debian.org.tw/20031018/qt13
@AceLan
@AceLan存檔之後照剛剛的編譯步驟再編一次,就可以看到怎麼縮放都正常的 hello 了。
@AceLan
@AceLan以上的步驟在給各位三分鐘練習
/*/ [Out] acechen (~acechen@circ.tcfsh.tc.edu.tw) has left #debian.tw [acechen]
@AceLan插撥一下 -- 蔡豐安再見安打   兄弟象封王  三連霸!!!!!!!!!
anychrisAceLan: ..= =
saviro..............
@AceLan各位都不是象迷阿 :p
anychrisAceLan: 題外話..我比較在意古巴那邊的情形:)
jrglAceLan: 打完啦...:-)
saviro古巴怎麼了
@AceLananychris: 二連勝了 還有兩場可以進八強
@AceLan好啦 我們繼續吧 :p
anychrisAceLan: 嗯..不過要接下來兩場都贏..
@AceLan
@AceLanQt 雖然提供了很多好用的 class,但是有時後我們還是需要稍微增加些東西到物件中,或是改變 Qt 物件的行為,這時後我們得要自行另外撰寫程式。
@AceLan
@AceLan這個我們使用 hacker language translator 這個程式來當作範例。
@AceLan
@AceLan我先簡介一下這個程式是在做什麼的,他是用來將英文轉成駭客語言的,沒看過駭客語言的可以到 google 選一下語系介面,選駭客,就可以看到這樣的畫面(http://www.google.com/intl/xx-hacker/)
@AceLan
@AceLan我們準備用一些簡單的規則來將英文轉成駭客語。規則是這樣的:
/*/ [Out] descent (~a@u248-157.u61-71.giga.net.tw) has quit [Connection reset by peer]
@AceLano -> 0
@AceLanl -> 1
@AceLanz -> 2
@AceLane -> 3
@AceLana -> 4
@AceLans -> 5
@AceLang -> 6, 9
/*/ [In] descent (a@u248-157.u61-71.giga.net.tw) has joined #debian.tw
@AceLant -> 7
@AceLanb -> 8
@AceLano -> 0
@AceLanl -> 1
@AceLanz -> 2
@AceLane -> 3
@AceLana -> 4
@AceLans -> 5
@AceLang -> 6, 9
@AceLant -> 7
@AceLanb -> 8
@AceLan
@AceLan當然,這不是全部的規則,我們只是舉幾個規則當例子而已。
@AceLan
@AceLan我們預設的畫面長這樣 http://kde.linux.org.tw/~acelan/irc_conference/qt14.png
* AceLan 用很奇怪的眼神瞄 jesse_。
@jesse_http://gallery.debian.org.tw/20031018/qt14
@AceLanccc
@AceLan
@AceLan上面是正常的英文,當使用者
@AceLan輸入完之後按下 enter,下方就會出現翻譯好的 hacker 文。
@AceLan
@AceLan畫面上的元件有兩個 groupbox,裡面各包了一個 textedit(textEdit1、textEdit2),下方有一個 pushbutton(pbExit),就這樣而已,經過之前的講解,大家應該可以自行將這個畫面拉出來吧 ^^
@AceLan
@AceLan請大家動手拉一下畫面吧 ^^
@AceLan一樣 三分鐘 ^^
kanruAceLan:libqt3-mt-dev跟我的xfree4.3沖到...QQ
jrglAceLan: 請問什麼是駭客語言?
@AceLan@_@
saviro還真的沒聽過
@csardas
@AceLanjrgl: google 的語系有可以選
@AceLan其實是搞怪語言啦 :p
kanruAceLan:沒法玩嚕...只好用看的..哈
jrglAceLan: google還有克林貢語...@@
jrglAceLan: 是誰搞出來的阿?
@AceLankanru: 應該不會這樣吧 還是你試試 libqt3-dev
@AceLanjrgl: 不是我 *_*
@AceLan那我要繼續囉
@AceLan
kanruAceLan:因為會用到xlib-pic_4.2
@AceLanhmm
@AceLankanru: 那你先看好了 對話會有紀錄 到時在操作看看
@AceLan
@AceLan拉好之後,我們要使用一個簡單的 signal/slot 來讓輸入的英文(textEdit1)自動顯示到 hacker 那邊(textEdit2)。
@AceLan
@AceLan先選擇 textEdit1,然後選擇 Property Editor/Signal Handler 的 Signal Handler tab 上的 clieked() 點三下,還有 Exit 按鈕的 clicked(),加入如下的程式
@AceLanvoid Form1::textEdit1_returnPressed()
@AceLan{
@AceLan        textEdit2->setText( textEdit1->text());                                }
@AceLanvoid Form1::pbExit_clicked()
@AceLan{
@AceLan        this->reject();
@AceLan}
@AceLan
@AceLan然後再 new 一個 main() 之後,就可以試著去編譯看看,看看在 English 那邊輸入完之後按 enter,字會不會也出現在 Hacker 那邊(http://kde.linux.org.tw/~acelan/irc_conference/qt15.png)。
@jesse_http://gallery.debian.org.tw/20031018/qt15
@AceLan
* AceLan 突然發現 這個沒用到 signal/slot :p
@jesse_@_@
* AceLan 噓~~
saviroTT
@AceLan
jrgl@_@
@AceLan現在我們要進入重頭戲加入自己的程式碼了。
@AceLan
@AceLan我的構想是這樣的,取得 textEdit1->text() 的值,然後將值傳給我們自己寫的物件,經過轉換之後再將值傳給 textEdit2->setText()。
@AceLan
@AceLan但是由於所有的 .cpp .h 檔都是由 uic、moc 自動產生的,所以我們不能直接去修改那些程式,或是直接加入我們的 class 進去
@AceLan
@AceLan所以我們要再建立一個目錄 src/ 建立一個 h4x37.cpp,建立 include/ 建立一個 h4x37.h
@AceLan
@AceLan這時目錄結構長的像這樣
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/h4x37$ ls
@AceLanform1.ui  form1.ui.h  h4x37  h4x37.pro  include  main.cpp  Makefile  src
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/h4x37$ ls src
@AceLanh4x37.cpp
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/h4x37$ ls include/
@AceLanh4x37.h
@AceLan
@AceLanh4x37.h 裡面放 class H4x37 的宣告,程式碼長的像這樣
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/h4x37$ cat include/h4x37.h
@AceLan#include <qtextedit.h>
@AceLan#include <qmap.h>
@AceLan#include <qvaluevector.h>
@AceLanclass H4x37 : public QTextEdit
@AceLan{
@AceLanpublic:
@AceLan        H4x37( const QString&);
@AceLan        QString getText();
@AceLanprivate:
@AceLan        QString text;                   // 儲存英文字串
@AceLan        QMap<QString, QStringList> dict;// 轉換表
@AceLan};
@AceLan
@AceLanh4x37.cpp 裡面放 class H4x37 的定義
@AceLanacelan@acelan-nb:~/people/acelan/tech/irc_conference/h4x37$ cat src/h4x37.cpp
@AceLan#include <qfile.h>
@AceLan#include <qtextstream.h>
@AceLan#include <stdlib.h>
@AceLan#include "include/h4x37.h"
@AceLanH4x37::H4x37( const QString& text)
@AceLan{
@AceLan        this->text= text;
@AceLan        QFile file("h4x37.dic" );
@AceLan        if ( file.open( IO_ReadOnly ) )
@AceLan        {
@AceLan                QTextStream stream( &file );
@AceLan                QString line;
@AceLan                while ( !stream.atEnd() )
@AceLan                {
@AceLan                        line= stream.readLine();// line of text excluding '\n'
@AceLan                        QValueVector<QString> words;
@AceLan                        QStringList wordlist= QStringList::split(" ", line);
@AceLan                        QString id= *(wordlist.begin());// 第一個是 id
@AceLan                        dict.insert( QMap< QString, QStringList>::value_type( id, wordlist));
@AceLan                }
@AceLan                file.close();
@AceLan        }
@AceLan}
@AceLanQString H4x37::getText()
@AceLan{
@AceLan        QString str;
@AceLan        for( unsigned int i= 0; i< text.length(); i++)
@AceLan        {
@AceLan                if( dict.count( QString( text[ i])))
@AceLan                {
@AceLan                        QStringList temp( dict[ QString( text[ i])]);
@AceLan                        QStringList::iterator iter= temp.begin();
@AceLan                        iter+= rand()% temp.size();
@AceLan                        str.append( *iter);
@AceLan                }
@AceLan                else
@AceLan                        str.append( text[ i]);
@AceLan        }
@AceLan        return str;
@AceLan}
@AceLan
@AceLan程式碼有點長,有興趣的可以慢慢看 :p
@AceLan
@AceLan我們的程式寫好之後,到 Object Explorer 的 Members tab 那,在 Includes (in Declaration) 那加入我們的 .h 檔 "include/h4x37.h"
@AceLan
@AceLan然後選 toolbar 上的 Project->Add File... 加入 src/h4x37.cpp,這樣就大功告成啦。
@AceLan
@AceLan原本的 void Form1::textEdit1_returnPressed() 要改成這樣
@AceLanvoid Form1::textEdit1_returnPressed()
@AceLan{
@AceLan        H4x37 h4x37( textEdit1->text());
@AceLan        textEdit2->setText( h4x37.getText());
@AceLan}
@AceLan
@AceLan全部存檔之後從 qmake 開始作,make 完之後應該就會有個可以玩的 hacker language translator 了(http://kde.linux.org.tw/~acelan/irc_conference/qt16.png)。
@jesse_http://gallery.debian.org.tw/20031018/qt16
@AceLan
@AceLan到這邊有什麼問題嗎
@AceLan程式碼的部份用到了很多 Qt 的東西
@AceLan這邊要靠原本 C++ 個功力
@AceLan所以我就跳過沒有講解
@AceLan程式碼可以到這邊抓 http://kde.linux.org.tw/~acelan/irc_conference/h4x37/
@AceLan我們還有一個簡單的 image browser 要寫,打起精神來,不要打瞌睡喔,你們在台下作什麼,老師都看的一清二楚的 :p
saviro....
@jesse_ccc
@AceLanccCc
jrgl精神百倍...:p
@AceLan這個程式是比較難 demo 啦 如果沒有程式基礎的話 可能會看不懂
@AceLan不過下一個就簡單很多了
@AceLan我們就一口氣把他講完吧 :p
@AceLan
@AceLan其實 image browser 真的是非常簡單,只是要展示一下要如何選取檔案而已,那我們現在要開始囉。
@AceLan
@AceLan首先先拉出這樣的畫面(http://kde.linux.org.tw/~acelan/irc_conference/qt17.png)
@jesse_http://gallery.debian.org.tw/20031018/qt17
@AceLan
@AceLan上面是 pixmapLabel,下面是 lineEdit & pushButton。
@AceLan
@AceLan首先我們先來處理 pushButton clicked 的動作。
@AceLanvoid Form1::pushButton1_clicked()
@AceLan{
@AceLan        QString file = QFileDialog::getOpenFileName(
@AceLan                        ".",                            // 號徑
@AceLan                        "Images (*.png *.xpm *.jpg)",   // filter
@AceLan                        this,                           // Parent
@AceLan                        "open file dialog"              // Name caption
@AceLan                        "Choose a file" );
@AceLan                        lineEdit1->setText( file);
@AceLan}
@AceLan
@AceLan因為我們用到了 QFileDialog,所以在 Object Explorer 的 Members tab 裡的 includes(in Implementation) 那要加上 <qfiledialog.h>。
@AceLan
@AceLan然後在 new 一個 main() 之後試著去編譯看看,看看會不會跑出一個檔案選取的對話盒。
@AceLan
@AceLan選完之後 lineEdit 有沒有出現剛剛所選取的檔案路徑跟檔名。
@AceLan
@AceLan接著,我們要顯示出這張圖片非常的簡單,只要填入 pixmapLabel 的一個欄位值就可以了
@AceLan
@AceLan在 lineEdit1->setText( file); 的下面多這一行 pixmapLabel1->setPixmap( QPixmap( file));
@AceLan
@AceLan怎麼樣,夠簡單了吧,這樣就可以瀏覽圖片了(http://kde.linux.org.tw/~acelan/irc_conference/qt18.png)
@AceLan
@jesse_http://gallery.debian.org.tw/20031018/qt18
@AceLan小弟的 Qt 程式設計無痛起步就介紹到這邊,謝謝各位的蒞臨指教 m(_ _)m
@AceLan^_^
@jesse_感謝 AceLan !
@AceLan終於講完了 ^_^
@jesse_有朋友要提問題嗎?
jrglAceLan: 感謝感謝!^^
/*/ [In] drake___ (~drake@61-219-155-230.HINET-IP.hinet.net) has joined #debian.tw
anychris跟 java 蠻像的..
jrglAceLan: 會不會專門開一堂課講signal/slot?
@jesse_補充一下... log 稍晚我會整理到 http://ircconf.debian.org.tw/
@AceLanjrgl: 不會 :p
@jesse_圖片在 http://gallery.debian.org.tw/20031018 都可以找到
@AceLanjesse_: 那我的程式要放在 dot 上嗎
@jesse_jrgl: 下次再請 AceLan 來講 signal/slot.. :)
* AceLan 撲通地跌了一跤。
jrgljesse_: 好阿...鼓掌..鼓掌..
winfred鼓掌!
@AceLan不好啦 你看大家都睡著了
* jesse_ 鼓掌鼓掌.. 啪啪啪啪
@AceLan@_@
* winfred 啪啪啪啪啪啪啪啪啪啪啪啪
jrgl安可....安可...:-)
@AceLan...
@jesse_還有朋友要提問題嗎?
drake___慢上來的人,等著看 log :p
winfred能不能偵對qt和gtk稍作比較其優劣? :>
@AceLan我今天的講稿還有圖片 & 程式可以到這裡抓 http://kde.linux.org.tw/~acelan/irc_conference.tgz
@kevinwatt感謝 AceLan !
@AceLanwinfred: 幸好刀疤蔡不在 不然你要我說這種話題會被砍死 :p
jrgl感謝Acelan
descent啪啪啪啪啪啪啪啪啪啪啪啪
descent辛苦了哦
jrgl趁刀疤菜不在,就說一說吧
@jesse_我會放在 dot 上, 網址再公佈在 ircconf.deabin.org.tw 上
@AceLan講稿我剛剛在講的時候發現裡面漏了一小段
saviro怎麼查qt 已經有的 函式 和  物件  會比較快呢?
@AceLan所以 irc 上的 log 會比較完整一點
@AceLansaviro: qt3-doc
/*/ [Out] descent (a@u248-157.u61-71.giga.net.tw) has quit [Leaving]
/*/ [In] descent (a@u248-157.u61-71.giga.net.tw) has joined #debian.tw
@AceLansaviro: 裡面有完整的 Qt 說明網頁
descent下次是什麼時候
R7charshttp://www.trolltech.com/products/qt/classchart.html?cid=4 ? :P
@AceLansaviro: 內容跟這裡一樣 http://doc.trolltech.com/3.2/index.html
@jesse_descent: 會再公告 :)
@csardas趴趴啪拍
@AceLancandyz: 哼哼 你根本就睡著了
@AceLan亨錯人 :p
@jesse_XD
winfredXD
@AceLancsardas: 哼哼 你根本就睡著了
@csardas其實是看到刀鋒站士...XD
@jesse_今天的 ircconf 到這裡囉! 感謝 AceLan , 也感謝各位的參與! :)
@csardas就被電視黏走了..XD
@AceLan感謝各位 ^_^
@csardasAceLan++
* jesse_ 啪啪啪啪啪
anychris謝謝
jrglAceLan++++++++
@jesse_AceLan: 大家都這麼期待, 安可一下吧... 再來一場.. ^^
* AceLan 貪婪地舔了舔 jrgl 的臉。
* AceLan 撲通地跌了一跤。
jrgl安可....安可....安可....安可....安可....安可....
@csardas安可安可

Generated by irclog2html.pl 2.1 by Jeff Waugh - find it at freshmeat.net!