Ошибка, связанная с файлом Qt — moc

#c #qt #user-interface #logic

#c #qt #пользовательский интерфейс #Логические

Вопрос:

Я пишу проект. Я начал получать ошибки после того, как попытался выполнить статическую сборку. Я внес некоторые изменения, которые не могу вспомнить. Но я уверен, что если эту заглушку можно очистить, то и основной проект также можно очистить.

Это файл заголовка.

 #ifndef MYLABEL_H
#define MYLABEL_H

#include <QFileDialog>
#include <QLabel>
#include <QMouseEvent>
#include <QObject>
#include <QPaintEvent>

class MyLabel:public QWidget
{
private:
    QPixmap default_Pixmap;
    QPixmap pixmap;
    QFileDialog * fileDialog;
    Q_OBJECT
public:
    MyLabel();
    void setPixmap(QPixmap pixmap);
    void setDefault();
protected:
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent * event);
signals:
    void file_Selected(QString fileName);
private slots:
    void file_Got_Selected(QString fileName);

};

#endif // MYLABEL_H
  

Вот исходный файл

 #include "MyLabel.h"
#include "MyMessageBox.h"
#include <QFileDialog>
#include <QPainter>

MyLabel::MyLabel():QWidget()
{
    default_Pixmap = QPixmap("select.gif").scaled(250,100);
    this->fileDialog=new QFileDialog(this);
    fileDialog->setNameFilter("Image Files (*.BMP *.GIF *.JPG *.JPEG *.PNG *.PBM *.PGM *.PPM *.XBM *.XPM)");
    connect(fileDialog,SIGNAL(fileSelected(QString)),this,SIGNAL(file_Selected(QString)));
    connect(fileDialog,SIGNAL(fileSelected(QString)),this,SLOT(file_Got_Selected(QString)));
}

void MyLabel::setPixmap(QPixmap pixmap)
{
    this->pixmap = pixmap;
}

void MyLabel::setDefault()
{
    this->pixmap = default_Pixmap;
}

void MyLabel::mousePressEvent(QMouseEvent *event)
{
    fileDialog->show();
    //QString file_Name = file_Dialog.getOpenFileName();
}

void MyLabel::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,width(),height(),pixmap.scaled(QSize(width(),height())));
}

void MyLabel::file_Got_Selected(QString fileName)
{
    this->pixmap = QPixmap(fileName);
}

#include "myLabel.moc"
  

И это основной файл

 #include <QLabel>
#include <QPixmap>
#include <QtGui/QApplication>
#include "myLabel.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyLabel mm;
    //mm.setPixmap(QPixmap("dummy.jpg"));
    //mm.setPixmap(QPixmap());
    mm.setDefault();
    mm.show();

    return a.exec();
}
  

Я создал файл moc с помощью командной строки qt и команды

 moc myLabel.h -o myLabel.moc
  

После этого я попытался скомпилировать проект через Qt-Editor. Но я получил ошибку множественного определения следующим образом,

 debug/moc_myLabel.o:d:/TempInstallationFolder/Qt/Dynamic/qt/include/QtCore/../../src/corelib/global/qglobal.h:1381: multiple definition of `MyLabel::metaObject() const'
  

debug/myLabel.o: C:Documents and Settings prabhakaranDesktop CalendarNew-build-desktop/../CalendarNew//myLabel.moc:57: впервые определено здесь

debug/moc_myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/debug/moc_myLabel.cpp:62: множественное определение `myLabel::qt_metacast(char const*)’

debug/myLabel.o: C:Documents and SettingsprabhakaranDesktop CalendarNew-build-desktop/../CalendarNew//myLabel.moc:62: впервые определено здесь

debug/moc_myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/debug/moc_myLabel.cpp:70: множественное определение `myLabel::qt_metacall(QMetaObject::Call, int, void**)’

debug/myLabel.o: C:Documents and SettingsprabhakaranDesktop CalendarNew-build-desktop/../CalendarNew//myLabel.moc:70: впервые определено здесь

debug/moc_myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/debug/moc_myLabel.cpp:87: множественное определение `myLabel::file_Selected(QString)’

debug/myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/../CalendarNew//myLabel.moc:87: впервые определено здесь

debug/moc_myLabel.o:moc_myLabel.cpp :(.data 0x0): множественное определение `myLabel::staticMetaObject’

debug/myLabel.o:myLabel.cpp :(.data 0x0): впервые определено здесь

collect2: ld вернул 1 статус выхода

mingw32-создать[1]: * [debugCalendarNew.exe ] Ошибка 1

mingw32-ошибка make: * [debug] 2

Процесс «D:/TempInstallationFolder/Qt/Dynamic/mingw/bin/mingw32-make.exe » завершено с кодом %2. Ошибка при создании проекта CalendarNew (цель: рабочий стол) При выполнении шага сборки ‘Make’

Кто-нибудь, пожалуйста, избавьте меня от этой проблемы.

Ответ №1:

Попробуйте удалить строку include "MyLabel.moc" из исходного файла. Вам не нужно включать это в cpp файл.

Комментарии:

1. Вау! Вы чертовски правы. Но эта часть странная. Потому что без файла moc, как он может компилировать классы на основе Q_Object.

2. @prabhakaran: вы должны скомпилировать этот moc файл и связать его с ним, вам не нужно его включать. QT Reference предоставляет довольно хорошее руководство по использованию компилятора moc.