1. 程式人生 > >QT/MFC面試題

QT/MFC面試題

1、QT訊號槽機制的優缺點
1)QT訊號槽機制的引用精簡了程式設計師的程式碼量
2)QT的訊號可以對應多個槽(但他們的呼叫順序隨機),也可以多個槽對映一個訊號
3)QT的訊號槽的建立和解除繫結十分自由
4)訊號槽同真正的回撥函式比起來時間的耗損還是很大的,所有在嵌入式實時系統中應當慎用
5)訊號槽的引數限定很多例如不能攜帶模板類引數,不能出現巨集定義等等

2、(1) 描述過程, 如何實現一個自定義按鈕, 使其在游標進入,按下,離開三種狀態下顯示不同的圖片.
建立一個類, 讓其從QPushButton類派生, 重寫該類中的事件處理器函式
1>. enterEvent() – 游標進入
2>. leaveEvent() – 游標離開
3>. mousePressEvent() – 滑鼠按下
4>. paintEvent() – 重新整理背景圖
在每個事件中切換不同的圖片, 通過paintEvent函式將新的圖片重新整理到按鈕上
手動重新整理函式: update()
(2) 描述在MFC檢視視窗中, 單擊滑鼠右鍵如何彈出一個右鍵選單?
1. 在檢視視窗中新增滑鼠右鍵的訊息處理函式
2. 建立並例項化一個選單物件
3. 呼叫CMenu類的TrackPopupMenu函式顯示右鍵選單
4. 給選單項新增事件處理函式

3、多執行緒情況下, Qt中的訊號槽分別在什麼執行緒中執行, 如何控制?
可以通過connect函式的第五個引數來控制, 訊號槽執行時所在的執行緒
1>. 直接連線 – 訊號槽函式在訊號發出者所線上程中執行
2>. 佇列連線 – 訊號在訊號發出者所線上程中執行,槽函式在訊號接收者所線上程中執行.
3>. 自動連線 – 多執行緒時為佇列連線方式, 單執行緒時為直接連線方式
預設情況為自動連線方式.

4、描述QT中的檔案流(QTextStream)和資料流(QDataStream)的區別, 他們都能幫助我們完成一些什麼事情.
QTextStream – 文字流, 操作輕量級資料(int, double, QString), 資料寫入檔案中之後以文字的方式呈現。
QDataStream – 資料流, 通過資料流可以操作各種資料型別, 包括類物件, 儲存到檔案中資料可以還原到記憶體。
QTextStream, QDataStream可以操作磁碟檔案, 也可以操作記憶體資料, 通過流物件可以將資料打包到記憶體, 進行資料的傳輸.

5、描述Qt下Tcp通訊的整個流程
伺服器端:
1. 建立用於監聽的套接字
2. 給套接字設定監聽
3. 如果有連線到來, 監聽的套接字會發出訊號newConnected
4. 接收連線, 通過nextPendingConnection()函式, 返回一個QTcpSocket型別的套接字物件(用於通訊)
5. 使用用於通訊的套接字物件通訊
1>. 傳送資料: write
2>. 接收資料: readAll/read
客戶端:
1. 建立用於通訊的套接字
2. 連線伺服器: connectToHost
3. 連線成功與伺服器通訊
1>. 傳送資料: write
2>. 接收資料: readAll/read

6、(1) 描述QT下udp通訊的整個流程
QT下udp通訊伺服器端和客戶端的關係是對等的, 做的處理也是一樣的.
1. 建立套接字物件
2. 如果需要接收資料, 必須繫結埠
3. 傳送資料: writeDatagram
4. 接收資料: readDatagram
(2) 描述QT下多執行緒的兩種使用方法, 以及注意事項
第一種方法:
1. 建立一個類從QThread類派生
2. 在子執行緒類中重寫 run 函式, 將處理操作寫入該函式中
3. 在主執行緒中建立子執行緒物件, 啟動子執行緒, 呼叫start()函式
第二種方法:
1. 將業務處理抽象成一個業務類, 在該類中建立一個業務處理函式
2. 在主執行緒中建立一QThread類物件
3. 在主執行緒中建立一個業務類物件
4. 將業務類物件移動到子執行緒中
5. 在主執行緒中啟動子執行緒
6. 通過訊號槽的方式, 執行業務類中的業務處理函式
多執行緒使用注意事項:
* 1. 業務物件, 構造的時候不能指定父物件
* 2. 子執行緒中不能處理ui視窗(ui相關的類)
* 3. 子執行緒中只能處理一些資料相關的操作, 不能涉及視窗

7、描述Windows下一個訊息從觸發到處理的整個路由過程.
應用程式啟動, 作業系統為程式建立一個對應的訊息佇列, 使用者對建立進行操作, 產生一系列訊息,
作業系統首先捕捉到這些訊息, 將訊息投遞到對應的訊息佇列中, 在應用程式中對應一個訊息迴圈
訊息迴圈每次從訊息佇列中取出訊息, 取出的訊息如果是虛擬鍵訊息, 會將其轉換成標準訊息, 將
轉換的訊息再次投遞到訊息佇列, 如果取出的是標準訊息, 會將該訊息傳送給作業系統, 作業系統
會呼叫對應的視窗過程函式, 下視窗過程函式中對對用的訊息程序處理.

8、在MFC視窗中製作一個逃跑按鈕(滑鼠永遠捕捉不到), 該如何實現
建立一個類MyButton, 讓該類從CButton類派生
在該子類中處理滑鼠移動事件, 滑鼠移動到該按鈕上, 計算隨機位置, 移動按鈕
在視窗中拖放一個CButton按鈕, 給該按鈕關聯一個MyButton型別的變數, 即可

9、描述MFC中文件檢視結構中都需要哪些類, 這些類之間是如何實現相互訪問的?
文件檢視結構:
文件類
檢視類
框架類
應用程式類
在MFC框架的任何位置都可以訪問視窗框架類: AfxGetMainWnd()
在MFC框架的任何位置都可以訪問應用程式類: AfxGetApp()
檢視類中訪問關聯的文件類: GetDocument()
框架類中訪問文件類: GetActiveDocument()
框架類中訪問檢視類: GetActiveView()

10、 描述MFC中的訊息對映
MFC中的訊息對映分為三個部分
1. 訊息對映宣告: DECLARE_MESSAGE_MAP()
2. 執行訊息對映的巨集
BEGIN_MESSAGE_MAP()
// 訊息對映入口
ON_WM_PAINT()
END_MESSAGE_MAP()
3. 新增訊息處理函式的宣告和定義

11、描述在MFC中如何使用ODBC訪問Mysql資料庫?
1. 安裝Mysql的odbc驅動
2. 使用嚮導新增資料來源
3. 建立MFC單文件/多文件檢視應用程式, 新增資料庫支援, 選擇資料來源, 給資料來源中的資料庫表繫結記錄集類
4. 通過繫結的記錄集物件訪問對應的資料庫表”

12、QT如果要進行網路程式設計首先需要在.pro中新增如下程式碼:QT += network
在標頭檔案中包含相關標頭檔案
include QHostInfo
include QNetworkInterface
(因無法顯示,略去#與< >)
2、QT的UdpSocket接收訊息使用原則
第一步:new一個UdpSocket
第二步:呼叫UdpSocket的bind方法,同時指定埠號
第三步:使用connect將接收訊息函式和UdpSocket物件做關聯
第四步:在接受訊息槽函式當中呼叫readDatagram接收訊息