【发布时间】: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。不过还是谢谢你的评论。