1

В отдельном заголовочном файле описываю класс сцены

scene.h

#include "mainwindow.h"
#ifndef SCENE_H
#define SCENE_H
class Scene1: public QGraphicsScene{
Q_OBJECT
public:
    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world);
   public slots: void advance(){
};

private: b2World* world;

};

#endif // SCENE_H

Подключаю в

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow> ...
... class MainWindow : public QMainWindow { Q_OBJECT

public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();

private: Ui::MainWindow ui; Scene1 scene; QTimer* frametimer; b2World* world; };

#endif // MAINWINDOW_H

Ошибка возникает при добавлении следующей строчки в

mainwindow.cpp

 scene = new Scene1 (0,0,8,6,world);

(пишу ее в конструкторе)без нее все работает

Сама ошибка

debug/mainwindow.o: In function `ZN10MainWindowC2EP7QWidget':
E:\project\simple\test\build-qqq-Desktop_Qt_5_10_0_MinGW_32bit-        
Debug/../qqq/mainwindow.cpp:22: undefined reference to 
`Scene1::Scene1(double, double, double, double, b2World*)'
collect2.exe: error: ld returned 1 exit status

"ОЧИСТИТЬ"-"qmake"-"собрать все" я пробовал, эффект нулевой. в чем может быть проблема?

PS screenshot подсветки кода когда пишу название моего пользовательского класса в mainwindow.cpp, не могу продвинуться дальше не создав его объект( screenshot подсветки кода когда пишу название класса в mainwindow.cpp

проект.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qqq TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES +=
main.cpp
mainwindow.cpp
scene.h

HEADERS +=
mainwindow.h
Box2D/Box2D.h
scene.h

FORMS +=
mainwindow.ui

CONFIG += mobility MOBILITY =

win32: LIBS += -L$$PWD/./ -lBox2D

INCLUDEPATH += $$PWD/. DEPENDPATH += $$PWD/.

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/./Box2D.lib else:win32-g++: PRE_TARGETDEPS += $$PWD/./libBox2D.a

Gunik
  • 31

3 Answers3

2

У вас в .pro-файле допущена опечатка:

SOURCES += \
main.cpp \
mainwindow.cpp\
scene.h
^^^^^^^

Замените scene.h на scene.cpp в секции SOURCES.

А на данный момент ваш файл scene.cpp не участвует в компиляции, поэтому линковщик и не видит реализаций функций.

UPD:

Если вы сознательно не создаёте файл scene.cpp, тогда реализация объявленного вами конструктора класса Scene1 (как впрочем и других методов) должна быть добавлена в scene.h:

class Scene1 : public QGraphicsScene
{
    ...

    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world) :
        QGraphicsScene(x, y, width, height),
        world(world)
    { }

    ...
};

И в любом случае -- удалите упоминание scene.h из секции SOURCES в .pro-файле.

aleks.andr
  • 2,489
  • Scene.cpp нету, отдельный заголовочный файл нужен чтобы Q_OBJECT не ругался. В нем я просто описывают класс чтобы в mainwindow.cpp создать его объект и работать с ним(Q_OBJECT тянется из за того что класс наследует public от графической сцены) – Gunik Aug 23 '17 at 11:54
  • В вашем scene.h объявлен конструктор класса Scene1. Где определена реализация этого конструктора? Правильно вам линковщик говорит, что её нет. – aleks.andr Aug 23 '17 at 12:03
0

как минимум, в хедере mainwindow нужно сделать предварительное обьявление класса

сlass Scene1;

а в файл реализации

#include "scene1.h"
InTar
  • 46
  • Проблема не в этом. Автор приводит ошибку линковщика. Надо *.pro-файл смотреть. – aleks.andr Aug 23 '17 at 07:36
  • в хедере mainwindow добавил сlass Scene1; в файле реализации "scene1.h" подключен. ошибка та же – Gunik Aug 23 '17 at 10:07
  • добавил .pro в конец описания – Gunik Aug 23 '17 at 10:22
0

засунул определение класса в данном виде обратно в

mainwindow.H

сlass Scene1: public QGraphicsScene{
Q_OBJECT
public:
    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world);
   public slots: void advance();
 private:
    b2World* world;

};

в конце mainwindow.cpp определил класс,входные значения(вызовы функции коэфицента умножения), и определил виртуальную функцию таким образом

mainwindow.cpp

.....
MainWindow::~MainWindow()
{
    delete ui;
}

Scene1::Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world)

:QGraphicsScene (fromB2(x),fromB2(y),fromB2(width),fromB2(height))

{ this->world=world;

}

void Scene1::advance(){ }

Gunik
  • 31