Qt moc_file 问题

问题描述 投票:0回答:3

我是一名学生程序员,我正在使用 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 进行第一次检查,但很快就决定不这样做。现在,代码重组后,我收到错误:

在函数“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 文件,但在消除错误方面没有取得任何成功。这看起来像是一个错误,但我在网上找不到任何有关它的信息,所以也许这是我不知道的事情。预先感谢您可以提供的任何帮助。

qt function user-input qlineedit moc
3个回答
4
投票

每当我遇到 MOC 问题时,我都会构建 -> 清理全部,然后构建 -> 运行 qmake(Qt Creator IDE)。如果这不能解决我的问题,我会进入我的项目文件夹并删除 moc_* 文件和 Clean 未删除的任何其他垃圾 - 基本上只留下标头、源代码和资源。


0
投票

转到引发错误的 moc 文件。在顶部,将有一个 include 语句,其中包含该窗口的头文件,不是 ui_.h,只是 .h 检查该文件中是否存在对导致错误的小部件的引用。


0
投票

moc
文件的这个问题神秘地包含对不存在方法的引用,可能是由遗留的 Q_PROPERTY 宏引起的...

图中

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.