標籤:widget extern 電腦 ati 讀取 read cli www. tail
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檔案,可以先去項目的檔案夾中找找,如果沒有可以按48316271中的方法解決
大概是這樣的目錄下吧
3.視窗迴圈(互相)跳轉
比如說我從A視窗->B視窗,再從B視窗->A視窗,這樣的話,按我們上面的方法,那麼A.h中一定會包含B.h,B.h中也一定會包含A.h,這樣的話在預先處理階段,標頭檔寫入的時候就會進入死迴圈,這時候也就需要用到另外的聲明方式extern,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的打包工具進行打包,詳情可以參考這篇部落格78167059?locationNum=6&fps=1
這次結對程式設計項目的收穫基本總結完畢,感謝助教的協助以及前輩們的總結,讓我在做學習的路上少走了很多彎路
關於socket方面主要參考的三篇篇部落格:
64923685
72566198
https://www.jianshu.com/p/3f42172f582b
再次感謝
Qt初體驗(二)