我是一名学生程序员,我正在使用Qt构建一些用于工作的GUI应用程序,我一次又一次地遇到moc问题。我希望有一个解决方案来解决我目前的问题;但是,如果任何在Qt方面更有经验的人可以在修改您的cpp文件时提供一些关于如何正确处理这些文件的信息,我将非常感激。在我最近的更改中(对不起,我不能发布它看起来是什么样子,因为它显然已经被重构了),我通过在checkData函数中嵌套一个函数来验证数据。因为我希望为每个可能无效的字段显示一个特定的错误,所以我开始为每个QLineEdit创建一个函数。我意识到这不会起作用(或者至少做更多的工作),而不是仅仅提供信息的顺序检查。下面是没有原始嵌套函数的新代码:
void InjectionDialog::checkData() {
bool validateFluidVelocity;
QString tempStrFluidVelocity;
tempStrFluidVelocity = ui->lineEditFluidVelocity->text();
double convertedFluidVelocity =
tempStrFluidVelocity.toDouble(&validateFluidVelocity);
if (validateFluidVelocity == false) {
QErrorMessage validateErrorFluidVelocityError;
validateErrorFluidVelocityError.
showMessage("Fluid velocity input is invalid");
validateErrorFluidVelocityError.exec();
}
else {
transData.lineEditFluidVelocity = convertedFluidVelocity;
}
bool validateFluidMassFlow;
QString tempStrFluidMassFlow;
tempStrFluidMassFlow = ui->lineEditFluidMassFlow->text();
double convertedFluidMassFlow =
tempStrFluidMassFlow.toDouble(&validateFluidMassFlow);
if (validateFluidMassFlow == false) {
QErrorMessage validateErrorFluidMassFlowError;
validateErrorFluidMassFlowError.
showMessage("Fluid mass flow input is invalid");
validateErrorFluidMassFlowError.exec();
}
else {
transData.lineEditFluidMassFlow = convertedFluidMassFlow;
}
bool validateParticleVelocity;
QString tempStrParticleVelocity;
tempStrParticleVelocity = ui->lineEditParticleVelocity->text();
double convertedParticleVelocity =
tempStrParticleVelocity.toDouble(&validateParticleVelocity);
if (validateParticleVelocity == false) {
QErrorMessage validateErrorParticleVelocity;
validateErrorParticleVelocity.
showMessage("Particle velocity input is invalid");
validateErrorParticleVelocity.exec();
}
else {
transData.lineEditParitcle_sic_Velocity = convertedParticleVelocity;
}
bool validateParticleMassFlow;
QString tempStrParticleMassFlow;
tempStrParticleMassFlow = ui->lineEditParticleMassFlow->text();
double convertedParticleMassFlow =
tempStrParticleMassFlow.toDouble(&validateParticleMassFlow);
if (validateParticleMassFlow == false) {
QErrorMessage validateErrorParticleMassFlow;
validateErrorParticleMassFlow.
showMessage("Particle mass flow input is invalid");
validateErrorParticleMassFlow.exec();
}
else {
transData.lineEditParticleMassFlow = convertedParticleMassFlow;
}
}最初,我使用InjectionDialog::checkFluidVelociy进行第一次检查,但很快就决定不使用它。现在,重构代码后,我收到了错误:
In function 'InjectionDialog::checkFluidVelocity(QMetaObject::Call,int,void**)':此错误引用到moc_injectionDialog.o
对“InjectionDialog::checkFluidVelocity()”的引用未标识。此错误引用到moc_injectiondialog.cpp
在moc_injectiondialog中,我列出了以下内容:
/****************************************************************************
** Meta object code from reading C++ file 'injectiondialog.h'
**
** Created: Sat Jan 7 21:58:22 2012
** by: The Qt Meta Object Compiler version 62 (Qt 4.7.4)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include "../InjectionGUI/injectiondialog.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'injectiondialog.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.7.4. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_InjectionDialog[] = {
// content:
5, // revision
0, // classname
0, 0, // classinfo
2, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: signature, parameters, type, tag, flags
17, 16, 16, 16, 0x08,
29, 16, 16, 16, 0x08,
0 // eod
};
static const char qt_meta_stringdata_InjectionDialog[] = {
"InjectionDialog\0\0checkData()\0"
"checkFluidVelocity()\0"
};
const QMetaObject InjectionDialog::staticMetaObject = {
{ &QDialog::staticMetaObject, qt_meta_stringdata_InjectionDialog,
qt_meta_data_InjectionDialog, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &InjectionDialog::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *InjectionDialog::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *InjectionDialog::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_InjectionDialog))
return static_cast<void*>(const_cast< InjectionDialog*>(this));
return QDialog::qt_metacast(_clname);
}
int InjectionDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QDialog::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: checkData(); break;
case 1: checkFluidVelocity(); break;
default: ;
}
_id -= 2;
}
return _id;
}
QT_END_MOC_NAMESPACE我看过一些其他的moc_file帖子,他们中的大多数都说让Qt清理并重建项目。我已经运行了一个项目,清理和重建所有试图检修这个moc文件,但没有任何成功,以摆脱错误。这看起来像是一个bug,但我在网上找不到任何关于它的东西,所以可能是我不知道的东西。提前感谢您所能提供的任何帮助。
发布于 2012-01-08 14:51:30
每当我遇到MOC问题时,我都会构建->全部清理,然后构建->运行qmake (Qt Creator IDE)。如果这还不能解决我的问题,我会进入我的项目文件夹,删除moc_*文件和任何其他Clean不能删除的垃圾文件--基本上只留下头文件、源文件和资源。
发布于 2021-01-27 18:12:58
转到抛出错误的moc文件。在顶部,将有一个include语句,其中包含该窗口的头文件,而不是ui_.h,如果存在对导致错误的小部件的引用,则只需.h检查该文件。
https://stackoverflow.com/questions/8775643
复制相似问题