1. 程式人生 > >基於Qt的區域網即時通訊軟體

基於Qt的區域網即時通訊軟體

以前寫的一篇日誌,不小心刪了,竟然沒得恢復。萬惡的CSDN,重排版。

第一個寫的軟體。基本上還是很粗糙,而且程式碼也大多不是自己寫的,不過也著實讓我過了一把癮。接下來簡單地講講整個過程和學到的東西吧。

首先是軟體的框架,自己主觀地YY了很久,因為之前沒有相關的經驗,所以好多東西都一廂情願地想當然了,以至於到真正動手的時候才恨不得一掌劈死自己。

(以下此段是自我YY,可跳過)我想像中的框架應該是首先有一個自定義類,暫且管它叫freeTalk類(實際上我也是這麼命名的,汗),它主要負責完成區域網內線上使用者列表的獲取更新等。另外有一個類叫chat,用於使用者間的即時通訊,也就是發發文字資訊。還有一個類用於檔案傳輸,它老人家叫transmission,傳責完成檔案的傳輸。

然後我就天真地開始工作了,首先是啃Qt的書,《C++ GUI Qt4程式設計》這本書還不錯,雖然我到目前為止只看了幾章。為了比較瞭解網路方面的協議什麼的,還看了一些《UNIX網路程式設計 卷1》和計算機網路(結果發現沒啥作用)。

先是在XP下安裝Qt4,之前只有fedora16下面裝過,都是用yum直接搞定的。。。這真是一個漫長的過程,被虐死了好幾次。最後總結到的方法是:

1、下載mingw.rar,qt-win-opensource-4.8.4-mingw.exe和qt-creator-windows-opensource-2.7.1.exe,不要問我從哪裡下的,因為我也忘了,還有這個是用Qt Creator整合開發環境進行開發的環境搭建,其他的像VS 2008、eclipse什麼的請參考別的;

2、解壓mingw.rar到D盤(當然也可以到別的盤,自己喜歡),安裝qt-win-opensource-4.8.4-mingw.exe,過程中指定mingw資料夾,安裝qt-creator-windows-opensource-2.7.1.exe;

3、開啟Qt Creator,找到工具->選項,配置如下圖所示:


4、配置環境變數(不知道是不是必要),我的電腦 》》屬性 》》高階 》》環境變數 》》系統變數 》》Path,編輯,增加D:\Qt\bin\;D:\mingw\bin\(相對於安裝目錄而言),另外有一點值得注意的是,這貨在windows下好像不能支援中文路徑,所以專案不要建立在中文路徑下,不然會出錯。

然後可以開始了,建立專案,新增檔案等等東西就不說了。總的來說實際做出來的東西分4個類,一個主視窗freeTalk類,一個聊天視窗chat類,一個tcpClient類,一個tcpServer類,像我YY的結果,不過檔案傳輸被拆成了兩半。實際的效果圖如下所示:


整個過程中我覺得比較有意思的幾個地方是:

1、要怎麼實現按下Enter按鍵傳送資訊呢?一開始我覺得只要把sendButton的設定autoDefault屬性即可,不過沒成功,我想了一下可能的原因是焦點設在了textEdit上,沒有求證過,原諒我這個初學者吧,後來還找到一個辦法,就是用textChange訊號來捕捉‘\n’換行符,然後直接呼叫on_sendButton_clicked()槽(原來槽還可以直接呼叫),不過這種方法缺點是會連‘\n’一起在內容被髮送顯示。所以最後找到了一個方案,如下:

boolchat::eventFilter(QObject*target,QEvent*event)

{

if(target==inputEdit)

{

if(event->type()==QEvent::KeyPress)

{

QKeyEvent*k=static_cast<QKeyEvent*>(event);

if(k->key()==Qt::Key_Return)

{

on_sendButton_clicked();

returntrue;

}

}

}

returnQWidget::eventFilter(target,event);

}

用一個事件過濾器,來捕獲鍵盤輸入事件,圓滿解決。

2、對於要使用到的圖片什麼的,要先載入資原始檔中,背景圖片可以jpg格式的,作為一些控制元件的圖示需要是png格式的。還有應用程式的圖示是ico格式的,設定應用程式圖示的步驟如下:

首先準備個ICO圖示。例如:myappico.ico;用記事本新建個檔案,裡面就寫一行:IDI_ICON1          ICON   DISCARDABLE   "myappico.ico"

儲存改名為 myapp.rc並把它和你的圖示myappico.ico一起復制到你的QT工程專案的目錄。用記事本開啟你的QT工程檔案(如 "myapp.pro" ),在裡面最後新添一行:RC_FILE = myapp.rc

3、每次建立聊天視窗之後,假如用close()關閉,因為chat是作為freeTalk的子視窗,所以實際上該部分記憶體還沒有釋放的,視窗只是隱藏了起來,只有等父視窗退出後才會釋放。以下是從Qt Creator幫助中看到的一段:First it sends the widget a QCloseEvent.The widget is hidden if it accepts the close event. If it ignores the event,nothing happens. 當然也有可能是我誤解了,畢竟我只是個菜鳥。所以為了保險起見,我每次都特地捕獲這個事件,然後顯式釋放掉記憶體;

4、比起在建構函式中設定背景圖片,在Qt Designer裡用修改樣式表來得更好一些,因為就填充來說,假如用了圓角控制元件的話,前者可能會出現填充不完整的現象,不過這只是個人的使用經驗而已;

5、關於字型的事一直沒弄明白,總是顯示亂碼,最後用一句:

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));

就好了,windows不是說好的用GB2312的嗎,節操呢?

6、關於釋出,靜態編譯各說各話,都不知道該相信誰了,最後沒輒,弄個動態編譯,於是就拖家帶口200多個M的dll檔案一起吧,相對於靜態編譯的麻煩來說我還是不介意的。值得說一下的是VS2008有個工具叫depends的軟體還挺好用的,可以用來檢測依賴關係,看看到底需要哪些動態連結庫,再包含到工程目錄下就行了。

大概就這麼多吧,其他有一些遇到的問題都忘了,畢竟是三個星期前做的東西,下次要及時點做個總結才行。