QT学习:概念解析
一、伙伴編輯模式
QLabel標簽和伙伴(buddy)窗口部件包括一個標簽 (QLabel) 和一個窗口部件,它們具有伙伴關系,指當用戶激活標簽的快捷鍵時,鼠標/鍵盤的焦點將會轉移到它的伙伴窗口部件上。只有QLabel標簽對象才可以有伙伴窗口部件,也只有在該QLabel對象具有快捷鍵(在顯示文本的某個字符前面添加一個前綴“&”,就可以定義快捷鍵)時,伙伴關系才有效。例如:
QLineEdit* ageLineEdit = new QLineEdit (this) ; QLabel* ageLabel = new QLabel ("&Age", this) ; ageLabel->setBuddy (ageLineEdit) ;代碼定義了ageLabel標簽的組合鍵為Alt+A,并將行編輯框ageLineEdit設為它的伙伴窗口部件。當用戶按下Alt+A組合鍵時,焦點將會跳至行編輯框ageLineEdit中。
Qt設計器提供了伙伴編輯模式,可以通過鼠標拖曳操作快捷地建立標簽QLabel和其他窗口部件的伙伴關系。
二、信號與槽機制
Qt提供了信號和槽機制用于完成界面操作的響應,信號和槽機制是完成任意兩個Qt對象之間的通信機制。其中,信號會在某個特定情況或動作下被觸發(fā),槽是等同于接收并處理信號的函數(shù)。例如,若要將一個窗口部件的變化情況通知給另一個窗口部件,則一個窗口部件發(fā)送信號,另一個窗口部件的槽接收此信號并進行相應的操作,即可實現(xiàn)兩個窗口部件之間的通信。每個Qt對象都包含若干個預定義的信號和若干個預定義的槽。當某一個特定事件發(fā)生時,一個信號被發(fā)送,與信號相關聯(lián)的槽則會響應信號并完成相應的處理。當一-個類被繼承時,該類的信號和槽也同時被繼承,也可以根據(jù)需要自定義信號和槽。
1、信號與槽機制的連接方式
(1)一個信號可以與另一個信號相連,代碼如下:
connect (Object1, SIGNAL (signall),Object2, SIGNAL(signall)) ;表示ObjectI的信號1發(fā)送可以觸發(fā)Object2的信號I發(fā)送。
(2)同一個信號可以與多個槽相連,代碼如下:
(3)同一個槽可以響應多個信號,代碼如下:
connect (Object1,SIGNAL (signa12) , Object2, SIGNAL (slot2)); connect (Object3, SIGNAL (signa12),Object2, SIGNAL(slot2));但是,常用的連接方式為:
connect (Object1,SIGNAL (signal),Object2, SLOT(slot)) ;其中,signal 為對象Object1的信號,slot 為對象Object2的槽。
SIGNAL()和SLOT()是Qt定義的兩個宏,它們返回其參數(shù)的C語言風格的字符串(const char*)。因此,下 面關聯(lián)信號和槽的兩個語句是等同的:
2、信號與槽機制的優(yōu)點
(1)類型安全。
需要關聯(lián)的信號和槽的簽名必須是等同的,即信號的參數(shù)類型和參數(shù)個數(shù)與接收該信號的槽的參數(shù)類型和參數(shù)個數(shù)相同。不過,一個槽的參數(shù)個數(shù)是可以少于信號的參數(shù)個數(shù)的,但缺少的參數(shù)必須是信號參數(shù)的最后一個或幾個參數(shù)。 如果信號和槽的簽名不符,編譯器就會報錯。
(2)松散耦合。
信號和槽機制減弱了Qt對象的耦合度。激發(fā)信號的Qt對象無須知道是哪個對象的哪個槽需要接收它發(fā)出的信號,它只需做的是在適當?shù)臅r間發(fā)送適當?shù)男盘柧涂梢粤?#xff0c;而不需要知道也不關心它的信號有沒有被接收到,更不需要知道是哪個對象的哪個槽接收到了信號。同樣,對象的槽也不知道是哪些信號關聯(lián)了自己,而一旦關聯(lián)信號和槽,Qt 就保證了適合的槽得到了調用。即使關聯(lián)的對象在運行時被刪除,應用程序也不會崩潰。
一個類若要支持信號和槽,就必須從QObject或QObject的子類繼承。注意,Qt信號和槽機制不支持對模板的使用。
3.信號與槽機制的效率
信號和槽機制增強了對象間通信的靈活性,然而,這也損失了一些性能。同回調函數(shù)相比,信號和槽機制運行速度有些慢。通常,通過傳遞一個信號來調用槽函數(shù)會比直接調用非虛函數(shù)的運行速度慢10倍。主要原因如下。
(1)需要定位接收信號的對象。
(2)安全地遍歷所有的關聯(lián)(如一個信號關聯(lián)多個槽的情況)。
(3)編組(marshal)/(解組(unmarshal) 傳遞的參數(shù)
(4)在多線程時,信號可能需要排隊等待。
然而,與創(chuàng)建堆對象的new操作及刪除堆對象的delete操作相比,信號和槽的運行代價很小。信號和槽機制導致的這點性能損失對實時應用程序是可以忽略的;同信號和槽提供的靈活性和簡便性相比,這點性能損失也是值得的。
三、Qt5元對象系統(tǒng)
Qt5元對象系統(tǒng)提供了對象間的通信機制(信號和槽)、運行時類型信息和動態(tài)屬性系統(tǒng)的支持,是標準C++的一個擴展,它使Qt能夠更好地實現(xiàn)GUI圖形用戶界面編程。Qt5的元對象系統(tǒng)不支持C++模板,盡管該模板擴展了標準C++的功能。但是,元對象系統(tǒng)提供了模板無法提供的一些特性。Qt5元對象系統(tǒng)基于以下三個事實。
(1)基類QObject:任何需要使用元對象系統(tǒng)功能的類必須繼承自QObject。
(2)Q_OBJECT宏:Q_OBJECT宏必須出現(xiàn)在類的私有聲明區(qū)中,用干啟動元對象的特性
(3)元對象編譯器( Meta-Object Compiler, moc): 為QObject 子類實現(xiàn)元對象特性提供必要的代碼實現(xiàn)。
四、布局管理器
在設計較復雜的GUI用戶界面時,僅通過指定窗口部件的父子關系以期達到加救和排列窗口部件的方法是行不通的,最好的辦法是使用Qt提供的布局管理器。
QGridLayout *mainLayout=new QGridLayout (this);// (a) mainLayout->addwidget (label1,0,0);// (b) mainLayout->addwidget (lineEdit,0,1); mainLayout->addwidget (labe12,1,0); mainLayout->addwidget (button,1,1); setLayout (mainLayout) ;// (C)其中,
(a) QGridLayout *mainLayout=new QGridLayout(this): 創(chuàng)建一個網格 布局管理器對象mainLayout,并用this)指出父窗口。
(b) mainLayout->addWidget(…):分別將控件對象label1、lineEdit、 label2 和button 放置在布局管理器中,還可以在創(chuàng)建布局管理器對象時不必指明父窗口。
? Qwidget::setLayout(…):將布局管理器添加到對應的窗口部件對象中。因為這里的主窗口就是父窗口,所以直接調用setLayout(mainLayout)即可。
總結
- 上一篇: QT学习:QT下载与安装
- 下一篇: QT学习:字符串类QString