У меня есть небольшой класс, который не работает должным образом, и я не могу понять, что с ним не так. Компилятор выдает сообщение:
main.cpp: error: undefined reference to 'CDetails::CDetails()'
Это снимок из кода:
//main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"#include <QQmlContext>
#include <QDebug>
class CDetails : public QObject
{ Q_OBJECT
public:
CDetails() {}
~CDetails(void) {}public slots:
void cppSlot(const QString &msg)
{ qDebug() << "Called the C++ slot with message:" << msg;
}
};
int main(int argc, char *argv[])
{ QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/testqml/main.qml"));
viewer.showExpanded();
CDetails *test = new CDetails();
QObject::connect((QObject*)viewer.rootObject(),
SIGNAL(qmlSignal(QString)),test,
SLOT(cppSlot(QString)));
return app.exec();
}
И в main.qml:
import QtQuick 2.0
Rectangle {
id: guide
width: 360
height: 360
signal qmlSignal(string msg)
Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}
property double scaleFactor: 1.0
property string iconUrl: "image.png"MouseArea {
anchors.fill: parent
onClicked: {
guide.qmlSignal("Hello from QML")
}
}
}
Обновление: спасибо за предложение по конструктору. Теперь ошибка:
error: undefined reference to 'vtable for CDetails'
Что здесь упущено? Все предложения приветствуются.
Вам не хватает реализаций вашего конструктора и деструктора. Быстрая починка:
class CDetails : public QObject
{ Q_OBJECT
public:
CDetails() {}
~CDetails(void) {}
...
};
ошибка: неопределенная ссылка на ‘vtable for CDetails’
Что здесь упущено? Все предложения приветствуются.
Кажется, вам не хватает moc include перед основной функцией.
#include <QtGui/QGuiApplication>
#include <QQmlContext>
#include <QDebug>
class CDetails : public QObject
{ Q_OBJECT
public:
CDetails() {}
~CDetails(void) {}public slots:
void cppSlot(const QString &msg)
{ qDebug() << "Called the C++ slot with message:" << msg;
}
};
#include "main.moc"
int main(int argc, char *argv[])
{ QGuiApplication app(argc, argv);
QQuickView view;
viewer.setMainQmlFile(QStringLiteral("qml/testqml/main.qml"));
viewer.showExpanded();
CDetails *test = new CDetails();
QObject::connect((QObject*)viewer.rootObject(),
SIGNAL(qmlSignal(QString)),test,
SLOT(cppSlot(QString)));
return app.exec();
}
...
TEMPLATE = app
TARGET = main
QT += quick
SOURCES += main.cpp
...
Обратите внимание, что вам также нужно будет добавить свои пользовательские строки, которые были там раньше, например, иметь дело со средством просмотра приложений и др.
В качестве альтернативы вы также можете отделить класс и main.cpp, что означает, что вы поместите объявление класса в отдельный заголовок, а затем определение в отдельный исходный файл.
Файл main.cpp будет содержать только что созданный заголовок, и вам необходимо убедиться, что новый заголовок и исходный файл добавлены в HEADERS
SOURCES
переменные в файле проекта qmake, соответственно, для прохождения обработки moc.