[英]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'
所以我有兩個問題:
Q_DECLARE_METATYPE
宏,如果文檔說我不需要Q_GADGET
宏,因為它會自動注冊類型?提前致謝!
編輯:
這可能是相關的:我在 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.