1. 程式人生 > >Qt初體驗(二)

Qt初體驗(二)

QT初體驗(二)

1.視窗跳轉

  想到視窗跳轉的實現方式,應該很容易想到新建開啟新的視窗,然後關閉當前視窗

  首先我們得新建一個視窗的類,然後在當前類中建立這個類的物件,呼叫Show()函式顯示出新視窗,close()函式關閉當前視窗

  實現的方式大概就是下面這個樣子:

ui2 = new Select();
ui2->show();
this->close();

  接下來說一下建立新的視窗類的方法:

  

  

  選擇widget,新增

  注意,這裡只會給你生成一個.ui檔案,而.h和.cpp則需要自己再去建立,也就是說再新增一個類(新增類的方法就不再贅述),名字和這個最好保持一致

  接下來就是給自己新增好標頭檔案之類的,因為這個是不會給你寫的,有幾個需要注意的是:

  1.   ui_xxx.h標頭檔案,這個需要你先把.ui檔案編譯一下(右鍵點選),然後重開一下VS才可以識別(當然不在意那些紅槓槓的話可以不用在意2333)

  2. 繼承類這樣的照著寫就可以了,然後這個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的生命週期大致如下:

  1. 建立socket。
  2. 繫結(bind)地址埠
  3. 監聽網路連線
  4. 接受連線
  5. 關閉連線

  clinet的生命週期則稍微簡單點:

  1. 建立socket
  2. 繫結地址
  3. 發起連線
  4. 關閉連線

  下面來講一下具體的使用

  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

  再次感謝