Qt初體驗(二)
QT初體驗(二)
1.視窗跳轉
想到視窗跳轉的實現方式,應該很容易想到新建開啟新的視窗,然後關閉當前視窗
首先我們得新建一個視窗的類,然後在當前類中建立這個類的物件,呼叫Show()函式顯示出新視窗,close()函式關閉當前視窗
實現的方式大概就是下面這個樣子:
ui2 = new Select(); ui2->show(); this->close();
接下來說一下建立新的視窗類的方法:
選擇widget,新增
注意,這裡只會給你生成一個.ui檔案,而.h和.cpp則需要自己再去建立,也就是說再新增一個類(新增類的方法就不再贅述),名字和這個最好保持一致
接下來就是給自己新增好標頭檔案之類的,因為這個是不會給你寫的,有幾個需要注意的是:
-
ui_xxx.h標頭檔案,這個需要你先把.ui檔案編譯一下(右鍵點選),然後重開一下VS才可以識別(當然不在意那些紅槓槓的話可以不用在意2333)
-
繼承類這樣的照著寫就可以了,然後這個Q_OBJECT是一定一定一定要寫的,因為Q_OBJECT相當於是一個巨集定義,裡面包含了很多QT的函式,如果沒有這個,這個視窗就是一死視窗,沒有任何功能,任何關於這個有一點需要注意的是這個需要一個moc_xxx.cpp檔案,可以先去專案的資料夾中找找,如果沒有可以按https://blog.csdn.net/sunxiaoju/article/details/48316271中的方法解決
大概是這樣的目錄下吧
3.視窗迴圈(互相)跳轉
比如說我從A視窗->B視窗,再從B視窗->A視窗,這樣的話,按我們上面的方法,那麼A.h中一定會包含B.h,B.h中也一定會包含A.h,這樣的話在預處理階段,標頭檔案寫入的時候就會進入死迴圈,這時候也就需要用到另外的宣告方式extern,https://blog.csdn.net/xiqingnian/article/details/41214539,大致上可以去看這篇部落格,裡面的strong沒什麼用...,看看extern的格式就好,也可以去了解extern的其他用法,比如共享變數?我也不知道該怎麼說...就是一個檔案中的變數,讓它在其他的檔案中也可以使用,並能修改 保留值。
新建視窗實現跳轉大概也就是這樣的過程吧
2.利用QTcpSocket類和QTcpServer類實現簡單的客戶端和伺服器之間的通訊
首先我們來了解一下socket通訊的流程(以下內容我不一定能解釋清楚...大概知道原理以及怎麼用...畢竟計算機網路我還沒有學...)
上圖中的左邊是clinet,右邊是server。
server的生命週期大致如下:
- 建立socket。
- 繫結(bind)地址埠
- 監聽網路連線
- 接受連線
- 關閉連線
clinet的生命週期則稍微簡單點:
- 建立socket
- 繫結地址
- 發起連線
- 關閉連線
下面來講一下具體的使用
1)伺服器
首先是伺服器的,我們先初始化QTcpServer和QTcpSocket類的物件
this->tcpServer = new QTcpServer(this); this->tcpSocket = new QTcpSocket(this);
接下來利用QT的connect函式連線server和acceptConnection函式
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
emmm,這段程式碼的意思就是在tcpServer接受到newConnection訊號之後執行acceptConnection函式,也就是接收到新的連線請求就接受連線,acceptConnection函式如下:
void Server::acceptConnection() { tcpSocket = tcpServer->nextPendingConnection(); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData())); }
這段程式碼的意思就是獲取tcp連線,然後賦值給tcpSocket,然後把Socket和receiveData函式連線起來,在接受到readyRead訊號之後執行receiveData函式,receiveData函式(需要自己寫,也不一定要叫這個名字)則是接收資訊之後的處理函式(看自己的需求),我只簡單的用到了readAll和write函式,分別是讀取和傳送,用法可以參考下面的程式碼
QString data = tcpSocket->readAll(); QString sendData; tcpSocket->write(sendData.toLatin1());
sendData就是伺服器傳送給客戶端的資訊,具體是什麼看自己的需求
回到正軌,光只是設計好連線還不夠,上面的listen(監聽並沒有實現),下面是監聽的方式
tcpServer->listen(QHostAddress::Any, 8000)
listen函式兩個引數分別是ip和埠,ip就可以利用這個函式來獲取,後面的埠則自己選擇(大於5000應該就可以了)
到這裡伺服器的解釋就結束了,下面是客戶端的
2)客戶端
客戶端的相對伺服器要做的準備要少一點
第一步,初始化Socket,方式和伺服器一樣
第二步,取消當前連線,連線伺服器
tcpSocket->abort(); //取消已有的連線 tcpSocket->connectToHost(ip, port); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessages()));
第三步,傳送接收資訊,這個與伺服器也是一樣的,readAll和write函式即可
3.程式打包
由於呼叫了QT的庫,所以要在別的電腦上也能執行的話(64位在32位電腦上還是不行的...不要問我為什麼知道...),可以利用Qt的打包工具進行打包,詳情可以參考這篇部落格https://blog.csdn.net/q651742112/article/details/78167059?locationNum=6&fps=1
這次結對程式設計專案的收穫基本總結完畢,感謝助教的幫助以及前輩們的總結,讓我在做學習的路上少走了很多彎路
關於socket方面主要參考的三篇篇部落格:
https://blog.csdn.net/u011964923/article/details/64923685
https://blog.csdn.net/tianya_team/article/details/72566198
https://www.jianshu.com/p/3f42172f582b
再次感謝