1. 程式人生 > >Qt中Signal與Slot引數問題

Qt中Signal與Slot引數問題

Referenced by:

應注意的問題

訊號與槽機制是比較靈活的,但有些侷限性我們必須瞭解,這樣在實際的使用過程中做到有的放矢,避免產生一些錯誤。下面就介紹一下這方面的情況。

1 .訊號與槽的效率是非常高的,但是同真正的回撥函式比較起來,由於增加了靈活性,因此在速度上還是有所損失,當然這種損失相對來說是比較小的,通過在一臺 i586-133 的機器上測試是 10 微秒(執行 Linux),可見這種機制所提供的簡潔性、靈活性還是值得的。但如果我們要追求高效率的話,比如在實時系統中就要儘可能的少用這種機制。

2 .訊號與槽機制與普通函式的呼叫一樣,如果使用不當的話,在程式執行時也有可能產生死迴圈。因此,在定義槽函式時一定要注意避免間接形成無限迴圈,即在槽中再次發射所接收到的同樣訊號。例如 , 在前面給出的例子中如果在 mySlot() 槽函式中加上語句 emit mySignal() 即可形成死迴圈。

3 .如果一個訊號與多個槽相聯絡的話,那麼,當這個訊號被髮射時,與之相關的槽被啟用的順序將是隨機的。

4. 巨集定義不能用在 signal 和 slot 的引數中。

既然 moc 工具不擴充套件 #define,因此,在 signals 和 slots 中攜帶引數的巨集就不能正確地工作,如果不帶引數是可以的。例如,下面的例子中將帶有引數的巨集 SIGNEDNESS(a) 作為訊號的引數是不合語法的:

						 #ifdef ultrix 
    #define SIGNEDNESS(a) unsigned a 
    #else 
    #define SIGNEDNESS(a) a 
    #endif 
    class Whatever : public QObject 
    { 
    [...] 
    signals: 
        void someSignal( SIGNEDNESS(a) ); 
    [...] 
    };

5. 建構函式不能用在 signals 或者 slots 宣告區域內。

的確,將一個建構函式放在 signals 或者 slots 區內有點不可理解,無論如何,不能將它們放在 private slots、protected slots 或者 public slots 區內。下面的用法是不合語法要求的:

						 class SomeClass : public QObject 
    { 
        Q_OBJECT 
    public slots: 
        SomeClass( QObject *parent, const char *name ) 
            : QObject( parent, name ) {}  // 在槽宣告區內宣告建構函式不合語法
    [...] 
    };

6. 函式指標不能作為訊號或槽的引數。

例如,下面的例子中將 void (*applyFunction)(QList*, void*) 作為引數是不合語法的:

						 class someClass : public QObject 
    { 
        Q_OBJECT 
    [...] 
    public slots: 
        void apply(void (*applyFunction)(QList*, void*), char*); // 不合語法
    };

你可以採用下面的方法繞過這個限制:

      typedef void (*ApplyFunctionType)(QList*, void*); 
    class someClass : public QObject 
    { 
        Q_OBJECT 
    [...] 
    public slots: 
        void apply( ApplyFunctionType, char *); 
    };

7. 訊號與槽不能有預設引數。

既然 signal->slot 繫結是發生在執行時刻,那麼,從概念上講使用預設引數是困難的。下面的用法是不合理的:

						 class SomeClass : public QObject 
    { 
        Q_OBJECT 
    public slots: 
        void someSlot(int x=100); // 將 x 的預設值定義成 100,在槽函式宣告中使用是錯誤的
    };

8. 訊號與槽也不能攜帶模板類引數。

如果將訊號、槽宣告為模板類引數的話,即使 moc 工具不報告錯誤,也不可能得到預期的結果。 例如,下面的例子中當訊號發射時,槽函式不會被正確呼叫:

						 [...] 
   public slots: 
       void MyWidget::setLocation (pair<int,int> location); 
   [...] 
   public signals: 
       void MyObject::moved (pair<int,int> location);

但是,你可以使用 typedef 語句來繞過這個限制。如下所示:

						 typedef pair<int,int> IntPair; 
   [...] 
   public slots: 
       void MyWidget::setLocation (IntPair location); 
   [...] 
   public signals: 
       void MyObject::moved (IntPair location);

這樣使用的話,你就可以得到正確的結果。

9. 巢狀的類不能位於訊號或槽區域內,也不能有訊號或者槽。

例如,下面的例子中,在 class B 中宣告槽 b() 是不合語法的,在訊號區內宣告槽 b() 也是不合語法的。

						 class A 
    { 
        Q_OBJECT 
    public: 
        class B 
    { 
        public slots:   // 在巢狀類中宣告槽不合語法
            void b(); 
        [....] 
        }; 
    signals: 
        class B 
    { 
        // 在訊號區內宣告巢狀類不合語法
        void b(); 
        [....] 
        }: 
    };

10. 友元宣告不能位於訊號或者槽宣告區內。

相反,它們應該在普通 C++ 的 private、protected 或者 public 區內進行宣告。下面的例子是不合語法規範的:

						 class someClass : public QObject 
    { 
        Q_OBJECT 
    [...] 
    signals: // 訊號定義區
        friend class ClassTemplate; // 此處定義不合語法
    };

今天在用訊號槽的時候遇到一個關於引數的問題:

訊號傳遞的引數是一個指向class A型別的指標,槽函式可以接收到,但是其中這個類中的char*成員會出錯,所以想到直接傳遞A型別的物件,誰知道槽函式根本接收不到,

所以它的引數應該是不能傳遞類型別的,暫且這麼認為,但是char*的成員為什麼會出錯呢?再看看。


相關推薦

QtSignalSlot引數問題

Referenced by: 應注意的問題 訊號與槽機制是比較靈活的,但有些侷限性我們必須瞭解,這樣在實際的使用過程中做到有的放矢,避免產生一些錯誤。下面就介紹一下這方面的情況。 1 .訊號與槽的效率是非常高的,但是同真正的回撥函式比較起來,由於增加了靈活性,

【golang-GUI開發】qtsignalslot(一)

類型 取消 htm return 所在 turn hang nbsp type 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 1 class Counter : public QOb

Python requests.post方法datajson引數區別

在通過requests.post()進行POST請求時,傳入報文的引數有兩個,一個是data,一個是json。 data與json既可以是str型別,也可以是dict型別。 區別: 1、不管json是str還是dict,如果不指定headers中的content-type,預設為application/

QtQString基本型別的轉換問題

之前寫過幾篇文章,後來由於部分原因刪除掉了,最近剛好希望在Qt方面寫一點東西,方便大家查詢,也希望大家可以相互關注,多做交流,我會堅持在今後的Qt的工作學習中,不斷地更新遇到的技術問題與Qt的一些基礎

PyQt5學習教程11:幾種signalslot處理事件的方法

    所有的GUI應用程式都是基於事件驅動的,事件不僅可由應用程式產生,諸如Internet連結、窗體管理器,定時器等都可以產生事件。PyQt通過signal和slot處理事件,本文以例項的方式進行講解4種signal與slot處理事件的方法。 1、本文加入LCDNumb

關於C#refout引數的理解

/*ref與out引數的使用*/using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace conapp_6_out與ref的使用{    //定義類

qtnewdelete的使用

#include "mainwindow.h" #include <QApplication> #include <QTextCodec> #include <QLabel> int main(int argc, char *argv[]) {     QApplicati

qtQStringStringint,double,char*之間的轉換

本文介紹的是Qt 各種資料型別轉換,病沒有多少內容,只是例項操作了一下,多多參考!如果你是初學者的話。在程式設計的過程中,總是不斷的去轉換資料型別。先來看看內容。 1、QString --> string QString.toStdString(); 2、string --> QString

QtSignalSlot機制(二)

!-->![endif]-->!-->![endif]-->!-->!-->![endif]-->!-->![endif]-->!-->!-->![endif]-->!-->![endif]--&g

QT視窗-視口的轉換

      在QPainter中存在兩個函式,分別是setWindow和setViewPort,分別用來設定繪圖視窗和繪圖的視口。       首先要說明的是,這個視窗和視口和可能和其它地方說明的視窗和視口含義不一樣;另外,在《C++ GUI Qt4程式設計》一書中也沒用很詳細的講解這兩個概念。所以筆者經過測

Qt訊號事件的小結

這幾天在使用Qt的時候,遇到一些關於訊號、事件的一些問題。發現對訊號,事件的區別不是很瞭解。於是上網找了一些資料,做了一點筆記總結下,方便自己也方便他人。要是有不對的地方,還望大家指出,大家一起進步

訊號(Signal)槽(Slot)-Qt的典型機制

    因為下一篇關於Boost的文章會涉及到事件處理的問題,裡面用的是訊號和槽的機制,先拿Qt裡的這個機制預研一下。誒,Boost這是夠厲害的,什麼先進就包含什麼!要知道我以前一直以為這是Qt的專利呢。當然,這也是大多數厲害的開源軟體庫的高人之處,像Qt這種GUI庫也包含了

QT 關鍵字講解(emit,signal,slot

Qt中的類庫有接近一半是從基類QObject上繼承下來,訊號與反應槽(signals/slot)機制就是用來在QObject類或其子類間通訊的方法。作為一種通用的處理機制,訊號與反應槽非常靈活,可以攜帶任意數量的引數,引數的型別也由使用者自定。同時其本身也是型別安全的,任何一個從QObject或

QT程式碼設計器控制元件訊號SLOT連線

  雙擊testqt.ui 託一個push button到窗體中,雙擊,可以輸入字元 按F4或 menu->edit->edit signals/slots 定義SLOT 選擇已定義好的SLOT,點確定就可以進行關聯了。 定義自定義SLO

QT的線程事件循環理解(2)

註釋 由於 做什麽 hid post 適用於 tsig call 循環 1. Qt多線程與Qobject的關系   每一個 Qt 應用程序至少有一個事件循環,就是調用了QCoreApplication::exec()的那個事件循環。不過,QThread也可以開啟事件循環

【轉載】Qt圖像的顯示基本操作

繪制 nta pen 位置 產生 縮放 eas urn mod Qt可顯示基本的圖像類型,利用QImage、QPxmap類可以實現圖像的顯示,並且利用類中的方法可以實現圖像的基本操作(縮放、旋轉)。 參考:Qt中圖像的顯示與基本操作 - ykm0722的專欄 - 博客頻道

Qt圖像的顯示基本操作

png matrix wid qstring 文件 圖像 ans etop 出了 博客轉載自:https://blog.csdn.net/lg1259156776/article/details/52318598 Qt可顯示基本的圖像類型,利用QImage、QPxmap類可

[Python筆記]函式關鍵字引數,收集引數分配引數的使用例項

Stock類 class Stock: def __init__(self): self.itemList = [] def addItem(self, name, price): # 建立商品 return {'name': name

Javaeclipse命令列向main函式傳遞引數

  我們知道main函式是java程式的入口,main函式的引數型別是String[]。 1.Eclipse中向main方法傳遞引數 例如: public class Mytest { public static void main(String[] args) {

QTchar變數QString變數QByteArray變數區別

轉載自http://blog.sina.com.cn/s/blog_539d078401014eoh.html   QByteArray可以用來儲存原始位元組(包括‘\0’)和傳統的8位‘\0'結束的字串。它比使用const char*更方便。 通常它能保證資料末尾是'\0'空