Qt有兩個重要概念:“信號和槽”和“布局”。
Qt用“信號和槽”代替windows編程中的callback機制,通過“信號和槽”來完成不同對象之間的通信,以及完成相應(yīng)用戶的操作,可以用于任何QObject的子類中。
槽和普通的C++成員函數(shù)幾乎是一樣的:可以是虛函數(shù),可以被重載,可以是共有的,保護的或私有的,并且也可以被其他C++成員函數(shù)直接調(diào)用,參數(shù)也可以是任意類型。
不同之處是:槽可以和信號連接在一起,在這種情況下,每當(dāng)發(fā)射這個信號的時候,就會自動調(diào)用這個槽。
connect()語句如下:connect(sender,SIGNAL(signal),receiver,SLOT(slot));
這里的sender和receiver是指向QObject的指針,signal和slot是不帶參數(shù)的函數(shù)名,“信號和槽”的一些性質(zhì)如下:
1.一個信號可以連接多個槽
在發(fā)射這個信號的時候,會以不確定的順序一個接一個地調(diào)用這些槽。
2.多個信號可以連接同一個槽
3.一個信號可以與另外一個信號相連接
connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SIGNAL(updateRecord(const QString &)));
當(dāng)發(fā)射第一個信號時,也會發(fā)射第二個信號,除此之外,信號與信號的連接,和信號與槽的連接是難以區(qū)分的。
4.連接可以被移除
disconnect(...)
5.signal和slot必須有相同的參數(shù)類型,如果信號的參數(shù)比它所連接的槽的參數(shù)多,那么多余的參數(shù)將會被簡單地忽略掉。如果參數(shù)類型不匹配,或在信號和槽的名字中包含了參數(shù)名,Qt也會發(fā)出警告。
布局:用來管理窗口中窗口部件的幾何形狀,能對其所負(fù)責(zé)的窗口部件的尺寸大小和位置進(jìn)行設(shè)置,Qt主要有三種布局管理器類:
QHBoxLayout:在水平方向上排列窗口部件,從左到右。
QVBoxLayout:在豎直方向上排列窗口部件,從上到下。
QGridLayout:把各個窗口部件排列在一個網(wǎng)格中。
emit是Qt中的關(guān)鍵字,它能發(fā)射信號,像其他Qt擴展一樣,它也會被C++預(yù)處理器轉(zhuǎn)換成標(biāo)準(zhǔn)的C++代碼。
元對象系統(tǒng)(meta-object system)
Qt的一個最主要的成功是對C++擴展,即把彼此獨立的軟件模塊連接起來,而不需要模塊間的任何細(xì)節(jié)。
這個機制就是Meta-Object系統(tǒng),它提供了兩個關(guān)鍵的用途:信號和槽 與 introspection(內(nèi)省)。introspection功能允許應(yīng)用程序在運行時得到QObjec它子類的“meta-information”,這對實現(xiàn)信號和槽是很必要的,包括全部信號和槽的列表,以及類的名字。這個機制還提供了屬性(在Qt Designer中使用)和文本翻譯(國際化)支持。它們構(gòu)成了QSA(Qt Script for Application)的基礎(chǔ)。
標(biāo)準(zhǔn)C++不提供Qt meta-object系統(tǒng)需要的動態(tài)meta-information。Qt提供了一個獨立的工具moc,通過定義Q_OBJECT宏實現(xiàn)到C++函數(shù)的轉(zhuǎn)變。moc是用純C++實現(xiàn)的,因此可以使用在任何C++編譯器中。
這個機制工作過程如下:
Q_OBJECT聲明了一些QObject子類必須實現(xiàn)的內(nèi)省函數(shù):metaObject(),TR(),qt_metacall()等。
Qt的moc工具實現(xiàn)Q_OBJECT宏聲明的函數(shù)和所有的信號。
QObject成員函數(shù)connect()和disconnect()使用這些內(nèi)省函數(shù)實現(xiàn)信號和槽的連接。
以上這些是通過qmake,moc和QObject自動處理的,程序員通常不用考慮它們。如果你感到對此好奇,可以查看QMetaObject類文檔和moc實現(xiàn)的C++代碼。
Qt用“信號和槽”代替windows編程中的callback機制,通過“信號和槽”來完成不同對象之間的通信,以及完成相應(yīng)用戶的操作,可以用于任何QObject的子類中。
槽和普通的C++成員函數(shù)幾乎是一樣的:可以是虛函數(shù),可以被重載,可以是共有的,保護的或私有的,并且也可以被其他C++成員函數(shù)直接調(diào)用,參數(shù)也可以是任意類型。
不同之處是:槽可以和信號連接在一起,在這種情況下,每當(dāng)發(fā)射這個信號的時候,就會自動調(diào)用這個槽。
connect()語句如下:connect(sender,SIGNAL(signal),receiver,SLOT(slot));
這里的sender和receiver是指向QObject的指針,signal和slot是不帶參數(shù)的函數(shù)名,“信號和槽”的一些性質(zhì)如下:
1.一個信號可以連接多個槽
在發(fā)射這個信號的時候,會以不確定的順序一個接一個地調(diào)用這些槽。
2.多個信號可以連接同一個槽
3.一個信號可以與另外一個信號相連接
connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SIGNAL(updateRecord(const QString &)));
當(dāng)發(fā)射第一個信號時,也會發(fā)射第二個信號,除此之外,信號與信號的連接,和信號與槽的連接是難以區(qū)分的。
4.連接可以被移除
disconnect(...)
5.signal和slot必須有相同的參數(shù)類型,如果信號的參數(shù)比它所連接的槽的參數(shù)多,那么多余的參數(shù)將會被簡單地忽略掉。如果參數(shù)類型不匹配,或在信號和槽的名字中包含了參數(shù)名,Qt也會發(fā)出警告。
布局:用來管理窗口中窗口部件的幾何形狀,能對其所負(fù)責(zé)的窗口部件的尺寸大小和位置進(jìn)行設(shè)置,Qt主要有三種布局管理器類:
QHBoxLayout:在水平方向上排列窗口部件,從左到右。
QVBoxLayout:在豎直方向上排列窗口部件,從上到下。
QGridLayout:把各個窗口部件排列在一個網(wǎng)格中。
emit是Qt中的關(guān)鍵字,它能發(fā)射信號,像其他Qt擴展一樣,它也會被C++預(yù)處理器轉(zhuǎn)換成標(biāo)準(zhǔn)的C++代碼。
元對象系統(tǒng)(meta-object system)
Qt的一個最主要的成功是對C++擴展,即把彼此獨立的軟件模塊連接起來,而不需要模塊間的任何細(xì)節(jié)。
這個機制就是Meta-Object系統(tǒng),它提供了兩個關(guān)鍵的用途:信號和槽 與 introspection(內(nèi)省)。introspection功能允許應(yīng)用程序在運行時得到QObjec它子類的“meta-information”,這對實現(xiàn)信號和槽是很必要的,包括全部信號和槽的列表,以及類的名字。這個機制還提供了屬性(在Qt Designer中使用)和文本翻譯(國際化)支持。它們構(gòu)成了QSA(Qt Script for Application)的基礎(chǔ)。
標(biāo)準(zhǔn)C++不提供Qt meta-object系統(tǒng)需要的動態(tài)meta-information。Qt提供了一個獨立的工具moc,通過定義Q_OBJECT宏實現(xiàn)到C++函數(shù)的轉(zhuǎn)變。moc是用純C++實現(xiàn)的,因此可以使用在任何C++編譯器中。
這個機制工作過程如下:
Q_OBJECT聲明了一些QObject子類必須實現(xiàn)的內(nèi)省函數(shù):metaObject(),TR(),qt_metacall()等。
Qt的moc工具實現(xiàn)Q_OBJECT宏聲明的函數(shù)和所有的信號。
QObject成員函數(shù)connect()和disconnect()使用這些內(nèi)省函數(shù)實現(xiàn)信號和槽的連接。
以上這些是通過qmake,moc和QObject自動處理的,程序員通常不用考慮它們。如果你感到對此好奇,可以查看QMetaObject類文檔和moc實現(xiàn)的C++代碼。