簡體   English   中英

QT_INTERFACES和信號定義

[英]QT_INTERFACES and signal definitions

如何在接口中定義信號?

class ISomeInterface
{
    signals:
        virtual void added(const QString& id) = 0;
        virtual void removed(const QString& id) = 0;

    // bla, other methods
}

Afaik,信號不應該是虛擬的,但是如果我想定義一個信號需要在實現接口的類中實現=>怎么做? 還是只是簡單地使它們抽象化...但是接口在這里沒有Q_OBJECT聲明! 在這種情況下是否生成了正確的代碼? 最重要的是,如果要連接到信號,則需要對QObject進行錯誤的(f * * * g)轉換。

class ISomeInterface
{
    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

還是您嘗試以這種方式實現它?

class ISomeInterface : public QObject
{
    Q_OBJECT

    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

Q_DECLARE_INTERFACE(ISomeInterface, "ISomeInterface")

..但是這種方式只能從一個接口繼承(QObject不支持多重繼承)。

結論:正如建議的那樣,我會選擇第一個。

  1. 將信號定義為虛擬抽象保護方法。 (而不是受保護的,您可以使用signal:關鍵字)。
  2. 最終對象必須打入您的接口和QObject
  3. 使用dynamic_cast轉換指向QObject *接口的指針
  4. 將指針連接到必要的插槽

您可以檢查此主題以獲取一些解決方案。

不幸的是,Qt不能處理來自QObject的多重繼承(請參見本Q&A ),因此您不能從中繼承所有接口(否則您將無法從多個接口繼承)。 因此,相反,您可能具有類似IQObject接口的內容

virtual QObject* qObject() = 0

方法,因此您不需要一直將它們強制轉換為QObject。

至於提供信號接口-沒有這樣的事情。 您可以做的是使它們成為虛擬抽象,如果您確實需要執行此編譯時檢查(因為signals:只是protected:的別名),則可以使用它們。 如果不這樣做,則只需檢查connect()方法的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM