【问题标题】:Q_PROPERTY must be fully defined error in Qt 6Q_PROPERTY 必须在 Qt 6 中完全定义错误
【发布时间】:2021-06-09 09:05:22
【问题描述】:

使用 Qt 5,可以使用如下代码:

// Test.h
#include <QObject>
#include <QMetaObject>

class LanguageModel;

class Test : public QObject
{
    Q_OBJECT
    Q_PROPERTY(LanguageModel*, ...)
public:
};


// Test.cpp
#include "Test.h"
#include "LanguageModel.h"



// LanguageModel.h
#include <QObject>
#include <QMetaObject>

class LanguageModel : public QObject
{
    Q_OBJECT
}

现在我正在尝试将项目转换为 Qt 6,但上述代码在生成的“debug\moc_Test.cpp”文件中失败,并显示以下错误消息:

C:\Qt\6.1.0\msvc2019_64\include\QtCore\qmetatype.h:778: error: C2338: Type argument of Q_PROPERTY or Q_DECLARE_METATYPE(T*) must be fully defined

将类前向定义替换为直接标头包含工作:

// Test.h
#include <QObject>
#include <QMetaObject>

#include "LanguageModel.h" //class LanguageModel;

class Test : public QObject
{
    Q_OBJECT
    Q_PROPERTY(LanguageModel*, ...)
public:
};

如何继续使用类定义而不是在 Qt 6 中包含标题?

问候,

【问题讨论】:

    标签: c++ qt qt6


    【解决方案1】:

    我不是专家,但由于静态断言,从 Qt 6.0 开始似乎需要它。证明:https://embeddeduse.com/2021/01/17/migrating-a-harvester-hmi-from-qt-5-12-to-qt-6-0/(章节'错误:'sizeof' 对不完整类型'IntegerRangeModel'的无效应用')

    【讨论】:

      【解决方案2】:

      我刚刚在 Qt 论坛上询问了here,因为我今天使用模型时遇到了同样的问题。 必须包含标题对我来说是有问题的。 VRonin 给了我两个解决方案:

      1. Q_MOC_INCLUDE 仅包含 moc 文件的标头:
      // Test.h
      #include <QObject>
      #include <QMetaObject>
      Q_MOC_INCLUDE("LanguageModel.h")
      
      class Test : public QObject
      {
          Q_OBJECT
          Q_PROPERTY(LanguageModel*, ...)
      public:
      };
      
      1. Q_DECLARE_OPAQUE_POINTER:告诉 Qt 我们要保留一个不透明的指针
      // Test.h
      #include <QObject>
      #include <QMetaObject>
      
      #ifndef OPAQUE_PTR_LanguageModel
        #define OPAQUE_PTR_LanguageModel
        Q_DECLARE_OPAQUE_POINTER(LanguageModel*)
      #endif // OPAQUE_PTR_LanguageModel
      
      
      class Test : public QObject
      {
          Q_OBJECT
          Q_PROPERTY(LanguageModel*, ...)
      public:
      };
      

      我个人更喜欢第二个选项,它可以节省一些编译时间。 我添加了宏,以防您在同一个项目的多个对象中使用它。

      【讨论】:

      • 谢谢。我会看看你的建议!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多