zoukankan      html  css  js  c++  java
  • Qt信号参数中使用QVariantList时编译问题

    今天调试代码时遇到一个奇怪的问题,不过一般感觉比较奇怪的问题,最后查到原因时,原因都比较简单!

    编译问题

    先来看一下qt的编译错误,提示一堆错误:

    In file included from D:QtQt5.10.05.10.0mingw53_32include/QtCore/qglobal.h:1173:0,
                     from D:QtQt5.10.05.10.0mingw53_32include/QtCore/qnamespace.h:43,
                     from D:QtQt5.10.05.10.0mingw53_32include/QtCore/qobjectdefs.h:48,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:46,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qtypeinfo.h: In instantiation of 'class QTypeInfo<QVariant>':
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:459:31:   required from 'void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = QVariant]'
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:813:22:   required from 'QList<T>::QList(const QList<T>&) [with T = QVariant]'
    tempmocmoc_test.cpp:103:82:   required from here
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qtypeinfo.h:67:26: error: invalid application of 'sizeof' to incomplete type 'QVariant'
             isLarge = (sizeof(T)>sizeof(void*)),
                              ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qtypeinfo.h:69:24: error: invalid application of 'sizeof' to incomplete type 'QVariant'
             sizeOf = sizeof(T)
                            ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h: In instantiation of 'void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = QVariant]':
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:813:22:   required from 'QList<T>::QList(const QList<T>&) [with T = QVariant]'
    tempmocmoc_test.cpp:103:82:   required from here
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:462:28: error: invalid use of incomplete type 'class QVariant'
                     current->v = new T(*reinterpret_cast<T*>(src->v));
                                ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:468:17: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
                     delete reinterpret_cast<T*>(current->v);
                     ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:468:17: warning: invalid use of incomplete type 'class QVariant'
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:468:17: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
                     delete reinterpret_cast<T*>(current->v);
                     ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:475:17: error: invalid use of incomplete type 'class QVariant'
                     new (current) T(*reinterpret_cast<T*>(src));
                     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:481:17: error: invalid use of incomplete type 'class QVariant'
                     (reinterpret_cast<T*>(current))->~T();
                     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h: In instantiation of 'void QList<T>::node_destruct(QList<T>::Node*, QList<T>::Node*) [with T = QVariant]':
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:865:18:   required from 'void QList<T>::dealloc(QListData::Data*) [with T = QVariant]'
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:827:16:   required from 'QList<T>::~QList() [with T = QVariant]'
    tempmocmoc_test.cpp:103:82:   required from here
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:494:31: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
             while(from != to) --to, delete reinterpret_cast<T*>(to->v);
                                   ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:494:31: warning: invalid use of incomplete type 'class QVariant'
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:49:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:494:31: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
             while(from != to) --to, delete reinterpret_cast<T*>(to->v);
                                   ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qlist.h:496:32: error: invalid use of incomplete type 'class QVariant'
             while (from != to) --to, reinterpret_cast<T*>(to)->~T();
                                    ^
    In file included from D:QtQt5.10.05.10.0mingw53_32includeQtCore/qobject.h:54:0,
                     from D:QtQt5.10.05.10.0mingw53_32includeQtCore/QObject:1,
                     from tempmoc../../../test/module_function/test.h:4,
                     from tempmocmoc_test.cpp:9:
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
         F(QVariant, 41, QVariant) 
                         ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
         class Name;
               ^
    D:QtQt5.10.05.10.0mingw53_32include/QtCore/qmetatype.h:1926:1: note: in expansion of macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
     QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
     ^
    Makefile.Debug:3709: recipe for target 'temp/obj/moc_test.o' failed
    mingw32-make[1]: Leaving directory 'E:/code/test-Debug'
    Makefile:36: recipe for target 'debug' failed
    mingw32-make[1]: *** [temp/obj/moc_test.o] Error 1
    mingw32-make: *** [debug] Error 2
    18:04:40: 进程"D:QtQt5.10.0Toolsmingw530_32inmingw32-make.exe"退出,退出代码 2 。
    Error while building/deploying project test (kit: Desktop Qt 5.10.0 MinGW 32bit)
    When executing step "Make"

    排查问题

    从这里面可以看出,基本上是与QVariant类型的使用有关系,查了下代码,里面没有直接使用QVariant类型的地方,到是有一个信号的参数类型,使用的是QVariantList,怀疑有可能是这个信号引起的,把这信号注释掉之后,编译不在报错。然后类里面的成员变量里使用QVariantList定义的成员变量,则不会导致这个编译错误!

    另外,通过查看编译错误,可以发现,是编译moc_test.cpp文件时开始报错的,也就是说,在编译moc文件时提示报错,moc文件里第9行是#include " tempmoc../../../test/module_function/test.h",引用的是测试类的头文件,也看不出什么错误。

    只是尝试给test.h里加了个头文件引用:#include <QVariantList>,再次编译错误没有了,编译通过!

     

    问题原因

    使用QVariantList作为信号的参数时,一定引用头文件:

    #include  <QVariantList>

    否则会编译错误,如果不作为信号的参数,只是作为成员变量用,或者成员函数的参数,不引用其头文件也不会报错。

    这两种情况编译是有点区别的,moc文件是qt编译器根据类源文件自动生成的代码。

     

    在此记录一下,以免以后调试遇到同样的问题而浪费时间。

     

     

  • 相关阅读:
    全面分析再动手的习惯:链表的反转问题(递归和非递归方式)
    Gatech OMSCS的申请和学习之奥妙
    java线程安全之并发Queue
    一篇文章看懂Java并发和线程安全
    java并发之如何解决线程安全问题
    Java并发/多线程系列——线程安全篇(1)
    当面试官问线程池时,你应该知道些什么?
    java 线程池 使用实例
    多线程-Executors和Executor,线程池
    从阿里Java开发手册学习线程池的正确创建方法
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436464.html
Copyright © 2011-2022 走看看