• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            QT 的信號與槽機制(3)

            QT 的信號與槽機制(3
              信號和槽是一種高級接口,應用于對象之間的通信,它是 QT 的核心特性。要正確的處理信號和槽,必須借助一個稱為 moc(Meta Object Compiler)的 QT 工具,該工具是一個 C
            ++ 預處理程序,它為高層次的事件處理自動生成所需要的附加代碼。 信號和槽能攜帶任意數量和任意類型的參數。我們可以將很多信號與單個的槽進行連接,也可以將單個的信號與很多的槽進行連接,(當這個信號被發射時,這些槽將會一個接一個地 執行,但是它們執行的順序將會是隨機的、不確定的,我們不能人為地指定哪個先執行、哪個后執行。)甚至于將一個信號與另外一個信號相連接,這時無論第一個信號什么時候發射系統都將立刻發射第二個信號。總之,信號與槽構造了一個強大的部件編程機制。

            信號(signals)

            信號只需要在頭文件中做聲明,不需要在cpp中實現。放在QT自定義關鍵字signals下,在此之前一定要加上Q_OBJECT宏!

            在編程中,一般使用的是控件內部定義好的信號。
            如:QTreeWidget類下的 signals:
            void    currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ) 
            void    itemActivated ( QTreeWidgetItem * item, int column ) 
            void    itemChanged ( QTreeWidgetItem * item, int column ) 
            void    itemClicked ( QTreeWidgetItem * item, int column ) 
            void    itemCollapsed ( QTreeWidgetItem * item ) 
            void    itemDoubleClicked ( QTreeWidgetItem * item, int column ) 
            void    itemEntered ( QTreeWidgetItem * item, int column ) 
            void    itemExpanded ( QTreeWidgetItem * item ) 
            void    itemPressed ( QTreeWidgetItem * item, int column ) 
            void    itemSelectionChanged () 


            也可以自定義信號,并通過emit在代碼中發射信號。

            // ------------ sender.h ----------- 
            class sender : public QObject 

                Q_OBJECT 

                 
            public
                    
            void doSend(); 
                signals: 
                    
            void send(int); 
            }; 


            // ------------ sender.cpp ----------- 
            #include "sender.h" 
            void sender :: doSend() 

                emit send(
            40); 


            槽(slots)

              槽和普通的C
            ++成員函數幾乎是一樣的(可以是虛函數,可以被重載,可以是public slots、protected slots、private slots,可以被其他C++成員函數直接調用;唯一不同的是:槽還可以和信號連接在一起,在這種情況下,信號被發射時,會自動調用這個槽。)槽不需要信號傳過來的參數時,可以不要參數;但槽一旦要參數,其參數個數,類型,順序必須要和對應的信號保持一致。另外,槽的參數不能有缺省值。

            // ------------ receiver.h ----------- 
            class receiver : public QObject 

                Q_OBJECT 
              
                
            public slots: 
                    
            void recv(int); 
            };



            // ------------ Receiver.cpp ----------- 
            void receiver :: recv(int n) 

                qDebug()
            <<"recv number: "<<n<<endl; 


            關聯信號和槽(connect)
            可以使用QObject類的靜態成員函數connect來建立信號的槽的關聯

            QObject::connect是靜態函數,返回值bool類型.
            static  bool QObject::connect ( const QObject * sender, const char * signal,const QObject * receiver, const char * member );  


            具體的調用為:connect(sender, SIGNAL(signal), receiver, SLOT(slot));   其中sender和receiver為QObject類對象的指針; SIGNAL宏和SLOT宏將信號的槽轉換成字符串。


            sender s; 
            receiver r; 
            QObject::connect(
            &s, SIGNAL(send(int)), &r, SLOT(recv(int))); 

            注:在connect函數中信號函數和槽函數若有參數,只能寫出參數類型,而不能也將變量名寫出;否則,連接會失敗!

            斷開信號和槽(disconnect)

            當信號和槽沒有必要繼續保持連接時,可以通過調用disconnect來斷開它們。

            static bool QObject::disconnect (const QObject * sender, const char * signal,  const Object * receiver, const char * slot)


            有三種情況必須使用 disconnect() 函數:
            1)斷開與某個對象相關聯的任何對象。
                disconnect(sender, 
            000) ; 
                
            //或者 
                sender->disconnect(); 


            2)斷開與某個特定信號的任何關聯。
                disconnect(sender, SIGNAL(signal()), 
            00); 
                
            //或者 
                sender->disconnect(SIGNAL(signal())); 


            3)斷開兩個對象之間的關聯。
                disconnect(sender, 
            0, receiver, 0); 
                
            //或者 
                sender->disconnect(receiver); 

            轉自:

            posted on 2012-08-25 10:52 天下 閱讀(600) 評論(0)  編輯 收藏 引用 所屬分類: QT

            <2013年3月>
            242526272812
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久婷婷是五月综合色狠狠| 久久久久久久波多野结衣高潮| 青青青国产精品国产精品久久久久 | 国产69精品久久久久9999APGF| 久久久久亚洲av无码专区| 久久综合久久久| 无码人妻久久一区二区三区蜜桃| 久久精品国产亚洲av麻豆小说| 99久久99久久精品免费看蜜桃| 久久久中文字幕日本| 少妇内射兰兰久久| 精品久久人人妻人人做精品| 无遮挡粉嫩小泬久久久久久久| 99热成人精品免费久久| 久久无码AV中文出轨人妻| 精品一区二区久久久久久久网站| 狠狠色丁香久久婷婷综合图片 | 少妇被又大又粗又爽毛片久久黑人| 一本一本久久A久久综合精品| 久久久久久久综合日本亚洲| 99精品久久久久久久婷婷| 久久激情亚洲精品无码?V| 国产午夜久久影院| 久久午夜无码鲁丝片| 久久青青草视频| 免费精品久久久久久中文字幕| 成人久久久观看免费毛片| 狠狠色狠狠色综合久久| 亚洲精品久久久www| 国产精品久久久久久久午夜片| 99久久人妻无码精品系列| 午夜欧美精品久久久久久久| 成人午夜精品无码区久久| 性做久久久久久久久久久| 久久久久九九精品影院| 日韩精品国产自在久久现线拍| 久久久av波多野一区二区| 久久久久久久久无码精品亚洲日韩| 一本色综合网久久| 天天爽天天狠久久久综合麻豆| 乱亲女H秽乱长久久久|