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

编译问题

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

In file included from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qglobal.h:1173:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qnamespace.h:43,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qobjectdefs.h:48,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:46,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qtypeinfo.h: In instantiation of 'class QTypeInfo<QVariant>':
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:813:22: required from 'QList<T>::QList(const QList<T>&) [with T = QVariant]'
temp\moc\moc_test.cpp:103:82: required from here
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qtypeinfo.h:67:26: error: invalid application of 'sizeof' to incomplete type 'QVariant'
isLarge = (sizeof(T)>sizeof(void*)),
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qtypeinfo.h:69:24: error: invalid application of 'sizeof' to incomplete type 'QVariant'
sizeOf = sizeof(T)
^
In file included from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h: In instantiation of 'void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = QVariant]':
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:813:22: required from 'QList<T>::QList(const QList<T>&) [with T = QVariant]'
temp\moc\moc_test.cpp:103:82: required from here
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:468:17: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
delete reinterpret_cast<T*>(current->v);
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:468:17: warning: invalid use of incomplete type 'class QVariant'
In file included from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:481:17: error: invalid use of incomplete type 'class QVariant'
(reinterpret_cast<T*>(current))->~T();
^
In file included from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h: In instantiation of 'void QList<T>::node_destruct(QList<T>::Node*, QList<T>::Node*) [with T = QVariant]':
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:865:18: required from 'void QList<T>::dealloc(QListData::Data*) [with T = QVariant]'
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:827:16: required from 'QList<T>::~QList() [with T = QVariant]'
temp\moc\moc_test.cpp:103:82: required from here
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qlist.h:494:31: warning: invalid use of incomplete type 'class QVariant'
In file included from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:49:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/qobject.h:54:0,
from D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include\QtCore/QObject:1,
from temp\moc\../../../test/module_function/test.h:4,
from temp\moc\moc_test.cpp:9:
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:114:21: note: forward declaration of 'class QVariant'
F(QVariant, 41, QVariant) \
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/QtCore/qmetatype.h:1924:11: note: in definition of macro 'QT_FORWARD_DECLARE_STATIC_TYPES_ITER'
class Name;
^
D:\Qt\Qt5.10.0\5.10.0\mingw53_32\include/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:\Qt\Qt5.10.0\Tools\mingw530_32\bin\mingw32-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 " temp\moc\../../../test/module_function/test.h",引用的是测试类的头文件,也看不出什么错误。

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

问题原因

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

#include  <QVariantList>

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

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

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

Qt信号参数中使用QVariantList时编译问题的更多相关文章

  1. ASP.NET Core3.0 中的运行时编译

    运行时编译 通过 Razor 文件的运行时编译补充生成时编译. 当 .cshtml 文件的内容发生更改时,ASP.NET Core MVC 将重新编译 Razor 文件 . 通过 Razor 文件的运 ...

  2. Qt信号槽中槽函数为虚函数的一些感想

    有时候,在写connect的时候会去犹豫一个问题----我的槽函数到底需不需要为虚函数.这个问题在我每次写connect的时候我都会反问自己,因为确实,如果你不去深究里面的moc,你发现不了太多问题. ...

  3. Python2在Sublime Text3中print中文时编译报错解决办法

    如果是用记事本新建的python文件,有可能是由于记事本默认的ascii格式导致的,这个时候只需要在Sublime Text3中   文件->设置文件编码(utf-8),保存即可.这样能够解决的 ...

  4. Qt安装过程中: configure 时发生的经典出错信息之”Basic XLib functionality test failed!”(Z..z..) 之 MySQL support cannot be enabled due to functionality test!

    整出错信息是在./configure阶段Basic XLib functionality test failed!You might need to modify the include and li ...

  5. js传递参数中包含+号时的处理方法

    encodeURI(url).replace(/\+/g, '%2B') 例子: $scope.getAnesthesiawaystatistical = function (annual, anes ...

  6. QT信号槽 中的对象野指针

    例: connect(&objec1,&class::slot_func1,&object2,&class::slot_func2) 如果 &objec   传 ...

  7. 7z命令行参数中的路径

    最近在自动化的过程中用到了7z命令行工具,发现其参数中的路径挺有意思的,在此总结一下.本文中所有demo使用的7z版本为:15.14 x64. 压缩某个文件夹 下面的命令会把g:\temp\目录和目录 ...

  8. qt设计器中使用自定义控件

    当qt设计器中的控件不能满足需要时,这时就要自定义控件.然后再在qt设计器中使用. 在qt设计器中使用自定义控件时,可以用提升. 从控件派生出新的类: 然后在qt设计器中右键需要提升的控件: 填入提升 ...

  9. axios中get请求的params参数中带数组的处理方法

    axios中get请求的params参数中带数组时导致向后台传参失败报错:from origin 'http://localhost:8080' has been blocked by CORS po ...

随机推荐

  1. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  2. javascript知识梳理之数据类型

    javascript基础知识(在javascript中 = 是赋值符号) 变量 合法的变量命名规则:大小写英文.数字. $ 和 _ 的组合,且不能用数字开头. var a; //声明变量 var s ...

  3. 安装 VsCode 插件安装以及配置

    安装vscode 官方网站 https://code.visualstudio.com/ 下载后 1.双击vscode.exe 2.选择 我接受  3.一路下一步,遇到方框就选4.点击  安装按钮 v ...

  4. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  5. webpack源码-打包资源输出到本地

    webpack收集完依赖是怎么打包资源的呢? 入口compiler.js: this.applyPluginsParallel("make", compilation, err = ...

  6. 一文说通C#中的异步编程

    天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章.   一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...

  7. 解决react使用antd table组件固定表头后,表头和表体列不对齐以及配置fixed固定左右侧后行高度不对齐

    一.固定表头后表体列和表头不对齐 此问题可能在antd3.24.0版本之前都存在,反正3.16.2版本是存在这个问题的,如果是3.24.0之前的版本估计只能通过修改css样式解决. 按照官网说的: 1 ...

  8. SQL 更新删除

    -- 插入数据 INSERT INTO [ Salary ] VALUES(25451,4545,45 ) INSERT INTO [ Salary ] (编号,收入,支出) VALUES(25451 ...

  9. eclipse IDE usage of my own and tutorials link list

    设置 字符集 Eclipse 修改字符集 默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设 ...

  10. Ansible部署zabbix-agent

    playbook目录 zabbix/ ├── hosts ##定义的主机列表 ├── install_zabbix_agent.yml ##安装入口文件 └── roles ├── install_z ...