簡體   English   中英

當 Q_GADGET 結構位於單獨的 header 文件中時,在 QML 中出現“未注冊數據類型”錯誤

[英]Getting 'unregistered datatype' error in QML when Q_GADGET struct is in a separate header file

我有一個自定義struct ,我在QMediaPlayer派生的 class 中用作Q_PROPERTY類型。 但這里的代碼:

struct VideoMeta
{
    Q_GADGET

    Q_PROPERTY(int width MEMBER width)
    Q_PROPERTY(...)
    ....

public:

    int width;
    ...
};

Q_DECLARE_METATYPE(VideoMeta)

class FrameProvider : public QMediaPlayer
{
    Q_OBJECT

    Q_PROPERTY(VideoMeta videoMeta READ getVideoMeta WRITE setVideoMeta NOTIFY videoLoaded)

    VideoMeta m_videoMeta;

    ...
}

我在Label中使用它:

Label {
    text: "Cached frames: " + cacheLoaded + " / " + frameProvider.videoMeta.framecount
}

這很像魅力,但出現了轉折:如果我使用Q_DECLARE_METATYPE宏將struct的聲明復制並粘貼到單獨的 header 文件中(並且顯然包含它),我會收到以下錯誤:

QMetaProperty::read: Unable to handle unregistered datatype 'VideoMeta' for property 'FrameProvider::videoMeta'

所以我有兩個問題:

  1. 不太重要的:為什么我需要使用Q_DECLARE_METATYPE宏,如果文檔說我不需要Q_GADGET宏,因為它會自動注冊類型?
  2. 更重要的是:為什么我不能將聲明移到另一個 header 文件中? 我錯過了什么?

提前致謝!

編輯:

這可能是相關的:我在 Visual Studio (MSVC v142) 項目中使用 Qt v5.15。 (不在 Qt Creator 中。)

Q_GADGET主要用途是允許非 QObject 類型進行自省。

Q_GADGET 宏是 Q_OBJECT 宏的輕量級版本,適用於不從 QObject 繼承但仍希望使用 QMetaObject 提供的某些反射功能的類。 就像 Q_OBJECT 宏一樣,它必須出現在 class 定義的私有部分中。

Q_GADGET 可以有 Q_ENUM、Q_PROPERTY 和 Q_INVOKABLE,但它們不能有信號或槽。

Q_GADGET 使 class 成員 staticMetaObject 可用。 staticMetaObject 是 QMetaObject 類型,並提供對使用 Q_ENUMS 聲明的枚舉的訪問。

它沒有說明注冊類型。

Q_DECLARE_METATYPE也不注冊類型,而是聲明它。

要注冊VideoMeta ,您需要調用qRegisterMetaType<VideoMeta>() Qt 文檔明確指出,必須調用qRegisterMetaType<T>()才能使類型在 Qt 屬性系統中工作。

此外,要將類型 T 與 QObject::property() API 一起使用,必須在使用之前調用 qRegisterMetaType(),通常在使用 T 的 class 的構造函數中,或者在 main() ZC1C425268E68394F1C1

https://doc.qt.io/qt-5/qmetatype.html#qRegisterMetaType-1

暫無
暫無

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

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