涉及 moc 文件的 Qt 错误未通过清理项目修复

Posted

技术标签:

【中文标题】涉及 moc 文件的 Qt 错误未通过清理项目修复【英文标题】:Qt error involving moc files not fixed by cleaning project 【发布时间】:2020-10-16 03:39:40 【问题描述】:

代码是什么

我正在尝试通过学习 Qt 5 这本书来学习 Qt c++。这是后续代码。给出错误的特定部分用于编写预设的欢迎消息。 Qml 代码使用头文件中的 Q_PROPERTY 宏来访问该函数。 这是实际标头中的函数定义和有用的宏:

Q_PROPERTY( QString ui_welcomeMessage MEMBER welcomeMessage CONSTANT )

const QString& welcomeMessage() const;

错误无效使用非静态成员

错误分为两部分,但它们似乎相互关联。第一个似乎表明我没有正确使用 const QString& 作为我的成员函数的输出:

/home/sina/Documents/code/Qt/Learn Qt 5/client_management/client_management-lib/build/linux
/gcc/x64/debug/.moc/moc_master-controller.cpp:83: 

error: invalid use of non-static member function ‘const QString& 
cm::controllers::MasterController::welcomeMessage() const’

../../client_management/client_management-lib/build/linux/gcc/x64/debug/.moc/moc_master-
controller.cpp:83:56: error: invalid use of non-static member function ‘const QString& 
cm::controllers::MasterController::welcomeMessage() const’

   83 |         case 0: *reinterpret_cast< QString*>(_v) = _t->welcomeMessage; break;
      |                                                        ^~~~~~~~~~~~~~

对于 moc 文件中的错误,大多数建议只在开始时使用 moc 清理和删除所有文件。在那之后不起作用,我尝试删除自动生成的所有内容。

moc 文件中的错误 #error

错误的第二部分是指同一个文件。这是添加到 moc 文件顶部的几行代码:

#include <memory>
#include "../../../../../../controllers/master-controller.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'master-controller.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.15.1. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

【问题讨论】:

在第 83 行,如果你有 _t-&gt;welcomeMessage(); 而不是 _t-&gt;welcomeMessage; 怎么办 @NgocMinhNguyen 我检查标记的答案实际上最终起作用了,所以我没有尝试你的答案。唯一的问题是 moc 文件是自动生成的,因此更改它可能是最好的长期解决方案。 【参考方案1】:

正如我们在https://doc.qt.io/qt-5/properties.html 中看到的那样 Q_PROPERTY 必须有

(READ getFunction [WRITE setFunction] 或 MEMBER memberName [(READ getFunction | WRITE setFunction)])

您正在尝试使用此代码的两个部分。还有:

如果未指定 READ 访问器函数,则需要 MEMBER 变量关联。这使得给定的成员变量可读可写,而无需创建 READ 和 WRITE 访问器函数。如果您需要控制变量访问,除了 MEMBER 变量关联(但不能同时使用两者)之外,仍然可以使用 READ 或 WRITE 访问器函数。

因此,不仅要阅读书籍。另请阅读文档。在您的示例中,只需修复它:

Q_PROPERTY( QString ui_welcomeMessage READ welcomeMessage CONSTANT )

const QString& welcomeMessage() const;

【讨论】:

感谢您的回复,成功了!错误是否暗示这一定是问题所在?此外,我确实看到了您阅读文档的观点,我肯定也会开始更多地查看文档。

以上是关于涉及 moc 文件的 Qt 错误未通过清理项目修复的主要内容,如果未能解决你的问题,请参考以下文章

moc在Docker容器中使用Qt 5.10的“未定义接口”失败

Qt - moc 导致 C2504:基类未定义

Qt moc_mainwindow

将Qt moc文件添加到项目中

将 Qt moc 文件添加到项目中

关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误