日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt入门(3)——信号和槽

發布時間:2024/9/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt入门(3)——信号和槽 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
信號和槽用于對象間的通訊。信號/槽機制是Qt的一個中心特征并且也許是Qt與其它工具包的最不相同的部分。
在圖形用戶界面編程中,我們經常希望一個窗口部件的一個變化被通知給另一個窗口部件。更一般地,我們希望任何一類的對象可以和其它對象進行通訊。例如,如果我們正在解析一個XML文件,當我們遇到一個新的標簽時,我們也許希望通知列表視圖我們正在用來表達XML文件的結構。
較老的工具包使用一種被稱作回調的通訊方式來實現同一目的。回調是指一個函數的指針,所以如果你希望一個處理函數通知你一些事件,你可以把另一個函數(回調)的指針傳遞給處理函數。處理函數在適當的時候調用回調。回調有兩個主要缺點。首先他們不是類型安全的。我們從來都不能確定處理函數使用了正確的參數來調用回調。其次回調和處理函數是非常強有力地聯系在一起的,因為處理函數必須知道要調用哪個回調。

在Qt中我們有一種可以替代回調的技術。我們使用信號和槽。當一個特定事件發生的時候,一個信號被發射。Qt的窗口部件有很多預定義的信號,但是我們總是可以通過繼承來加入我們自己的信號。槽就是一個可以被調用處理特定信號的函數。Qt的窗口部件又很多預定義的槽,但是通常的習慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號。
信號和槽的機制是類型安全的:一個信號的簽名必須與它的接收槽的簽名相匹配。(實際上一個槽的簽名可以比它接收的信號的簽名少,因為它可以忽略額外的簽名。)因為簽名是一致的,編譯器就可以幫助我們檢測類型不匹配。信號和槽是寬松地聯系在一起的:一個發射信號的類不用知道也不用注意哪個槽要接收這個信號。Qt的信號和槽的機制可以保證如果你把一個信號和一個槽連接起來,槽會在正確的時間使用信號的參數而被調用。信號和槽可以使用任何數量、任何類型的參數。它們是完全類型安全的:不會再有回調核心轉儲(core dump)。
從QObject類或者它的一個子類(比如QWidget類)繼承的所有類可以包含信號和槽。當對象改變它們的狀態的時候,信號被發送,從某種意義上講,它們也許對外面的世界感興趣。這就是所有的對象通訊時所做的一切。它不知道也不注意無論有沒有東西接收它所發射的信號。這就是真正的信息封裝,并且確保對象可以用作一個軟件組件。

槽可以用來接收信號,但它們是正常的成員函數。一個槽不知道它是否被任意信號連接。此外,對象不知道關于這種通訊機制和能夠被用作一個真正的軟件組件。
你可以把許多信號和你所希望的單一槽相連,并且一個信號也可以和你所期望的許多槽相連。把一個信號和另一個信號直接相連也是可以的。(這時,只要第一個信號被發射時,第二個信號立刻就被發射。)
總體來看,信號和槽構成了一個強有力的組件編程機制。?

一個最小的C++類聲明:
class Foo{public:Foo();int value() const { return val; }void setValue( int );private:int val;};

一個小的Qt類如下:
class Foo : public QObject{Q_OBJECTpublic:Foo();int value() const { return val; }public slots:void setValue( int );signals:void valueChanged( int );private:int val;};

這個類有同樣的內部狀態,和公有方法來訪問狀態,但是另外它也支持使用信號和槽的組件編程:這個類可以通過發射一個信號,valueChanged(),來告訴外面的世界它的狀態發生了變化,并且它有一個槽,其它對象可以發送信號給這個槽。
所有包含信號和/或者槽的類必須在它們的聲明中提到Q_OBJECT。
槽可以由應用程序的編寫者來實現。這里是Foo::setValue()的一個可能的實現:
void Foo::setValue( int v ){if ( v != val ) {val = v;emit valueChanged(v);}}

這個類有同樣的內部狀態,和公有方法來訪問狀態,但是另外它也支持使用信號和槽的組件編程:這個類可以通過發射一個信號,valueChanged(),來告訴外面的世界它的狀態發生了變化,并且它有一個槽,其它對象可以發送信號給這個槽。
? ? 所有包含信號和/或者槽的類必須在它們的聲明中提到Q_OBJECT。
槽可以由應用程序的編寫者來實現。這里是Foo::setValue()的一個可能的實現:
void Foo::setValue( int v ){if ( v != val ) {val = v;emit valueChanged(v);}}

emit valueChanged(v)這一行從對象中發射valueChanged信號。正如你所能看到的,你通過使用emit signal(arguments)來發射信號。
下面是把兩個對象連接在一起的一種方法:
Foo a, b;connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));b.setValue( 11 ); // a == undefined b == 11a.setValue( 79 ); // a == 79 b == 79b.value();

調用a.setValue(79)會使a發射一個valueChanged() 信號,b將會在它的setValue()槽中接收這個信號,也就是b.setValue(79) 被調用。接下來b會發射同樣的valueChanged()信號,但是因為沒有槽被連接到b的valueChanged()信號,所以沒有發生任何事(信號消失了)。
注意只有當v != val的時候setValue()函數才會設置這個值并且發射信號。這樣就避免了在循環連接的情況下(比如b.valueChanged() 和a.setValue()連接在一起)出現無休止的循環的情況。
這個例子說明了對象之間可以在互相不知道的情況下一起工作,只要在最初的時在它們中間建立連接。
預處理程序改變或者移除了signals、slots和emit 這些關鍵字,這樣就可以使用標準的C++編譯器。
在一個定義有信號和槽的類上運行moc。這樣就會生成一個可以和其它對象文件編譯和連接成引用程序的C++源文件。

轉載于:https://www.cnblogs.com/new0801/p/6176961.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Qt入门(3)——信号和槽的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲小视频在线播放 | 国产激情在线视频 | 亚洲欧洲一二三区 | 色综合天天 | 色av资源| 亚洲人成高清 | 爱上av| 免费福利在线 | 亚洲精品97 | 午夜写真片福利电影网 | 51国产视频 | jizz黄色片 | 69免费视频 | 久久综合爱 | 色妹av| 朝桐光在线观看 | 精品国产户外野外 | 扒下小娇妻的内裤打屁股 | 全部免费毛片在线播放 | 日韩激情文学 | 三级视频网站 | 国产视频欧美 | 亚洲成人 av | 污视频在线观看免费 | 亚洲图片在线观看 | 亚洲精品视频一区二区 | 男人天堂影院 | 久草久草| 三年中文在线观看免费观看 | 丝袜美女啪啪 | 精品欧美乱码久久久久久1区2区 | 人妻少妇精品一区二区 | 最新天堂在线视频 | 欧美巨鞭大战丰满少妇 | 国外av网站| 成人福利视频网站 | 婷婷久久久久久 | 国产精品jizz在线观看软件 | 国产高清一区二区三区四区 | 日日干日日摸 | 好看的国产精品 | 美女黄色在线观看 | 欧美成人午夜免费视在线看片 | 日本毛片在线看 | 久久色中文字幕 | 国产无码精品一区二区 | 一本av在线 | 性――交――性――乱a | 天天综合精品 | 国产噜噜噜噜噜久久久久久久久 | 伊人久久久久久久久久久 | 黑人巨大精品欧美黑白配亚洲 | 青娱乐在线播放 | 国模私拍在线 | 成人一区二区三区四区 | 日日骚视频| 伊人久久中文 | 九九影视理伦片 | 欧美黄色一区二区三区 | 国产精品一区三区 | 青青草国产 | 在线观看久草 | 亚洲不卡中文字幕无码 | 成人精品一区二区三区 | 国产成年人免费视频 | 中国美女一级黄色片 | a√在线观看 | 蜜桃一区二区 | 成人激情av | 爽爽窝窝午夜精品一区二区 | 国产裸体永久免费视频网站 | 一区二区在线免费视频 | 色优久久| 日韩精品一区二 | 一区二区导航 | 蜜臀av一区二区三区 | 亚洲欧美国产精品 | 人人射人人爱 | 亚洲精品一区二区三区新线路 | 日本欧美黄色 | 狠狠干婷婷 | 亚洲精品成人在线视频 | 能在线观看的av | 青娱乐久久| 9999视频 | 亚洲一级免费视频 | 男人添女人荫蒂国产 | 欧美黄页在线观看 | 91玉足脚交嫩脚丫在线播放 | 欧美一区二区在线视频观看 | 国产黄色大片网站 | 成人午夜精品一区二区三区 | 无码人妻久久一区二区三区蜜桃 | 精品一区二区三区在线免费观看 | 污污网址在线观看 | 在线黄色av | 99久久婷婷国产精品综合 | 美女网站免费视频 | 国产成人在线免费视频 |