目錄
1. 簡單說一下Qt
?2.?用過QT中的哪些模塊?
3. 說一些你常用的Qt控件??
?4. Qt中如何創建一個窗口?
5.?說一下QT中創建控件的方式?
6. 說一下Qt中信號和槽機制是什么?
7. 說一下QT信號與槽機制原理?
8. 如何自定義信號和槽,信號和槽怎么連接?
9. 說一下Qt的事件處理流程?
10.說一下事件過濾器的作用?
11.Qt 中 connect() 函數中參數有哪些,第五個參數的作用和可選類型呢?
12.為什么選擇?HTTP,不直接使用 TCP?
13.?說一下QT事件與信號的區別?
14.是否用過 Qt 的線程模塊?并簡單說明使用過的方式或類
15.Qt中怎么保證線程安全?
16.說一下TCP 三次握手的過程?
17.說一下TCP 連接斷開時的四次揮手流程?
18.?Qt 中的內存管理機制是如何實現的?
1. 簡單說一下Qt
Qt 是一個跨平臺的應用程序開發框架,它提供了一系列的工具和庫,用于開發圖形用戶界面(GUI)應用程序。
優點:
跨平臺,幾乎支持所有平臺
接口簡單,文檔詳細
開發效率高
缺點: Qt 作為一個軟件平臺,比較龐大、臃腫。
?2.?用過QT中的哪些模塊?
QtCore:提供基礎類,比如
QString
、QList
、QVariant
、QDateTime
、事件循環、定時器等,是所有模塊的基礎。QtGui:用于圖形界面相關類,如圖像處理、字體、顏色、繪圖(QPainter)。
QtWidgets:實現傳統桌面控件,如
QPushButton
、QTableWidget
、QMainWindow
,用于搭建 UI 界面。QtNetwork:用于實現 TCP/UDP 通信、HTTP 請求、Socket 服務等網絡功能。
QtMultimedia:用于音頻、視頻播放和錄制(如
QMediaPlayer
)。QtSerialPort:串口通信模塊,常用于與外部設備的數據交互。
QtConcurrent / QThread:實現多線程與并發處理。
QtSql:用于連接數據庫,如 SQLite、MySQL,執行查詢、增刪改等操作。
QtCharts:用于圖表展示,常用于可視化折線圖、柱狀圖等。
3. 說一些你常用的Qt控件??
QLabel
:標簽,用于顯示文字或圖像
QPushButton
:按鈕,支持點擊事件
QLineEdit
:單行文本輸入框
QSlider
:滑動條
QProgressBar
:進度條
QTabWidget
:標簽頁控件(多頁切換)
QScrollArea
:帶滾動條區域
QSplitter
:可調節大小的分隔窗口
QFrame
:基本容器,可自定義邊框樣式
QListWidget
:列表控件
QFileDialog
:文件/目錄選擇對話框
QColorDialog
:顏色選擇器
QMessageBox
:消息提示框(信息、警告、確認等)
QInputDialog
:獲取用戶輸入的簡易對話框
QCalendarWidget
:日歷選擇控件
QDateTimeEdit
:日期時間輸入框
QChartView
(QtCharts):圖表控件(柱狀圖、折線圖等)
?4. Qt中如何創建一個窗口?
在 Qt 中創建一個窗口通常是通過繼承
QMainWindow
或QWidget
來實現,構造窗口對象、設置標題、大小等屬性,然后調用.show()
顯示窗口,最后進入QApplication
的事件循環。
5.?說一下QT中創建控件的方式?
Qt 中創建控件的方式主要包括三種:代碼創建(手動 new)、UI 設計器創建(.ui 文件)、以及自定義控件(繼承 QWidget)。
6. 說一下Qt中信號和槽機制是什么?
Qt 中的信號和槽(Signal & Slot)機制是一種對象間通信機制,用于在對象狀態變化時通知其他對象,類似于發布-訂閱模式。
當一個對象發出信號時,所有與該信號連接的槽函數都會自動被調用,從而實現模塊間的解耦。
7. 說一下QT信號與槽機制原理?
?Qt 的信號與槽機制是基于 元對象系統(Meta-Object System) 實現的,核心依賴
QObject
和moc
(元對象編譯器)。
moc 掃描頭文件中的
signals
和slots
,生成信號和槽的元信息。把信號槽信息按聲明順序存儲到類的靜態成員
staticMetaObject
中,建立索引映射。
connect
調用時,根據信號和槽的索引,在連接表(內部數據結構)中記錄對應關系。
emit
發射信號時,調用QMetaObject::activate
,傳入信號索引、對象指針和參數列表。
activate
根據信號索引查找連接表,找到所有對應的槽函數索引。根據槽索引調用對應槽函數,支持直接調用或跨線程異步調用。
8. 如何自定義信號和槽,信號和槽怎么連接?
信號(signal):是類中定義的特殊成員(用
signals:
聲明),用于通知某些事件發生。槽(slot):是一個普通成員函數或用
slots:
標記的函數,用于接收信號觸發的處理邏輯。連接方式:通過
QObject::connect()
函數將信號與槽綁定。
9. 說一下Qt的事件處理流程?
在 Qt 中,事件由系統或用戶行為觸發后,會被加入事件隊列,并通過事件循環分發到對應的對象。
如果該對象或其祖先安裝了事件過濾器,事件會優先被過濾器處理;
否則,事件會傳遞給對象的
event()
函數,進而調用具體的事件處理函數(如mousePressEvent()
)。如果事件未被處理,可能會繼續向上傳遞或被忽略,從而完成整個事件處理流程。
10.說一下事件過濾器的作用?
用于在事件到達目標對象之前提前攔截和處理事件。
通過安裝事件過濾器,可以在不修改目標對象代碼的情況下,對其事件進行監聽、修改甚至阻止,常用于日志記錄、統一處理、特殊控件行為擴展等場景。
11.Qt 中 connect()
函數中參數有哪些,第五個參數的作用和可選類型呢?
sender:發送信號的對象
signal:發送的信號(用
SIGNAL()
宏包裹)receiver:接收信號的對象
slot:槽函數(用
SLOT()
宏包裹)connectionType(第五個參數):連接類型,控制信號和槽的調用方式
第五個參數(connectionType)可選值:
Qt::AutoConnection
:默認,自動判斷(跨線程→隊列連接,否則→直接連接)
Qt::DirectConnection
:立即同步調用槽函數(在發送信號的線程中)
Qt::QueuedConnection
:異步調用,槽函數在接收者線程中執行
Qt::BlockingQueuedConnection
:跨線程同步執行,發送線程會阻塞直到槽執行完(?不能用于主線程)
Qt::UniqueConnection
:防止重復連接(需與其他類型一起使用)
12.為什么選擇?HTTP,不直接使用 TCP?
TCP 是傳輸層協議,提供可靠的字節流傳輸,而 HTTP 是基于 TCP 之上的應用層協議,HTTP封裝了請求響應格式、狀態碼、頭部字段等,極大簡化了通信流程,提升了開發效率。
而使用 TCP 通信雖然更底層、性能好,但需要開發者自行處理協議設計、粘包拆包、加密安全等復雜細節,開發和維護成本高。
13.?說一下QT事件與信號的區別?
事件(Event) 是系統或用戶交互產生的底層通知,如鼠標點擊、鍵盤按下、窗口變化等,它們通過事件循環分發給對象,需重寫事件處理函數(如
mousePressEvent
)來響應。信號(Signal) 是 Qt 對象之間的通信機制,表示對象狀態變化或動作發生,配合槽(Slot)實現對象間的解耦通知。信號是程序內部主動發出的,用于組件間消息傳遞。
14.是否用過 Qt 的線程模塊?并簡單說明使用過的方式或類
繼承
QThread
重寫run()
方法,實現自定義線程任務使用
QObject
對象放到線程里,通過moveToThread()
把對象和它的槽函數移到新線程運行利用 Qt 的信號與槽機制實現線程間安全通信
使用
QtConcurrent
進行簡單的并發任務(如果用過)
15.Qt中怎么保證線程安全?
信號與槽機制:使用跨線程信號槽連接(
Qt::QueuedConnection
),自動在線程間傳遞消息,避免直接共享數據互斥鎖(QMutex):對共享資源加鎖,防止多個線程同時訪問導致數據沖突
讀寫鎖(QReadWriteLock):支持多個線程并發讀,寫操作時加寫鎖,提升性能
原子操作(QAtomicXXX):對簡單數據類型做無鎖的線程安全操作
線程局部存儲(QThreadStorage):為每個線程維護獨立數據,避免數據共享問題
16.說一下TCP 三次握手的過程?
第一次握手(客戶端 → 服務端):
客戶端發送一個帶 SYN 標志位 的數據包,表示請求建立連接,并隨機初始化一個序列號 seq=x。
第二次握手(服務端 → 客戶端):
服務端收到后,發送一個帶 SYN 和 ACK 標志位 的數據包,表示接受請求并同步自己的連接信息。它會回復 ack=x+1 表示收到了客戶端的 SYN,同時生成自己的序列號 seq=y。
第三次握手(客戶端 → 服務端):
客戶端收到后,發送一個帶 ACK 標志位 的數據包,ack=y+1,表示自己也收到了服務端的確認。至此,雙方建立連接,可以開始數據傳輸了。
17.說一下TCP 連接斷開時的四次揮手流程?
第一次揮手(客戶端 → 服務端)
客戶端發送一個 FIN 報文,表示“我沒有數據要發了”,請求關閉連接。
第二次揮手(服務端 → 客戶端)
服務端收到 FIN 后,發送一個 ACK 報文,表示“我知道你要斷開了”。但此時服務端可能還有數據要發,連接還沒完全斷。
第三次揮手(服務端 → 客戶端)
等服務端數據發送完畢后,主動發送一個 FIN 報文,告訴客戶端:“我也沒數據要發了”。
第四次揮手(客戶端 → 服務端)
客戶端收到 FIN 后,發送一個 ACK 報文,表示“我確認你也關閉了”。至此,連接關閉。
18.?Qt 中的內存管理機制是如何實現的?
Qt 的內存管理依賴于其 父子對象機制。當你用
new
創建一個 QObject 派生類對象,并將其父對象傳入構造函數中,Qt 會自動將該對象加入父對象的子對象列表中。當父對象銷毀時,它會自動銷毀所有子對象,從而避免內存泄漏。此外,Qt 的
deleteLater()
方法可用于安全地延遲刪除對象,確保不會在事件處理中立即銷毀自己。整體上,這種機制實現了自動層級釋放、生命周期托管和結構化內存管理。
19.QT界面卡頓遇到過嗎?怎么優化?
在使用 Qt 開發中,我確實遇到過界面卡頓的情況,主要原因通常是將耗時操作(如網絡請求、大量計算、文件讀寫等)放在主線程中執行,阻塞了 GUI 線程。
我主要通過將耗時任務放入子線程、使用
QThread
或QtConcurrent
進行后臺處理,再通過信號槽異步更新 UI,從而優化界面流暢性。簡答:Qt UI 卡頓多數是主線程阻塞導致的,關鍵優化思路是:UI 和邏輯分離,耗時操作異步執行,主線程專注渲染。