Проблемы с Qt moc_file - PullRequest
       31

Проблемы с Qt moc_file

0 голосов
/ 08 января 2012

Я студент-программист и использую Qt для создания приложений с графическим интерфейсом для работы, и я снова и снова сталкиваюсь с проблемами с 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-файл, но не смог добиться успеха в устранении ошибки.Это похоже на ошибку, но я не смог найти в Интернете ничего об этом, так что, может быть, это то, о чем я не знаю.Заранее благодарим за любую помощь, которую вы можете предложить.

1 Ответ

3 голосов
/ 08 января 2012

Всякий раз, когда у меня возникают проблемы с MOC, я собираю-> Очистить все, а затем собираю-> Запустить qmake (IDE Qt Creator). Если это не решает мою проблему, я захожу в папку своего проекта и удаляю файлы moc_ * и любой другой мусор, который Clean не удаляет - в основном ничего не оставляя, кроме заголовков, источника и ресурсов.

...