【问题标题】:Qt: moc Error 1: variable ' ' has initializer but incomplete typeQt:moc 错误 1:变量“”具有初始化程序但类型不完整
【发布时间】:2019-12-13 19:52:54
【问题描述】:

我是 Qt 和 Qml 的新手。为了使用 C++ 练习 QML 扩展,我构建了一个 qt 项目并按照 (https://doc.qt.io/qt-5/qtqml-tutorials-extending-qml-example.html#) 上的代码手动编码,但我收到了两条类型的错误消息:“moc Error 1: variable '' has initializer but compatible type”,在下面的代码中,一个用于“QPen pen”,另一个用于“painter”。
我在“piechart.h”中添加了#included <QPainter>,代码按预期编译和运行。但是,我也打开了实际的教程代码,它是我随 Qt 5.13 一起下载和安装的,代码在没有#included <QPainter> 的情况下编译和运行。你能解释一下造成这种差异的原因吗?!
PS:我注意到两个项目之间的“PieChart.pro”虽然都是基于qmake的,但我不确定1)这是否是邪恶的根源; 2)当我遵循 Qt Creator 项目向导时,为什么这些文件不同。此外,两个“moc_predefs.h”之间的 linux 命令行diff 显示两个项目之间存在一些差异。


void PieChart::paint(QPainter *painter)
{
    QPen pen(m_color, 2);
    painter->setPen(pen);
    painter->setRenderHints(QPainter::Antialiasing, true);
    painter->drawPie(boundingRect().adjusted(1, 1, -1, -1), 90 * 16, 290 * 16);

}

【问题讨论】:

  • 与 Qt 无关的常见 C++ 问题。要使用某些类,您必须包含它的声明。在您使用QPen 的情况下,您必须从文件#include <QPen> 中包含其声明。另一个 .h 文件已经可以包含它,在您的情况下为QPainter,因此您只能添加#include <QPainter>(不是#includeD !!!)。没有其他方法。如果你错过了声明,你会得到类似 incomplete type 错误,因为编译器不知道这个类型是什么。
  • @folibis:可以假设 标头可能已包含在 中。正如我在答案中解释的那样,我感到困惑的根源是教程的编写不佳。此外,我无法更正#included。不过还是谢谢你的评论。

标签: c++ qt qml


【解决方案1】:

我仔细检查了硬盘上的实际教程代码。 <QPainter> 实际上包含在“piechart.cpp”中,而我在“piechart.h”中寻找它,其中QPainter 对象作为参数传递给paint 函数。事实上,我在头文件中包含了`。不幸的是,在网站上,它没有在 cpp 文件中提及它,这是我感到困惑的原因。

【讨论】:

    【解决方案2】:

    当你懒得导入那个类的头文件时,这个问题总是会发生,当你这样做时,它会杀死错误。所以尝试添加这个:#include <QPainter>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多