qt — C ++ с использованием сигнальных слотов для QML

У меня есть небольшой класс, который не работает должным образом, и я не могу понять, что с ним не так. Компилятор выдает сообщение:

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'

Что здесь упущено? Все предложения приветствуются.

8

Решение

Вам не хватает реализаций вашего конструктора и деструктора. Быстрая починка:

class CDetails : public QObject
{   Q_OBJECT
public:
CDetails() {}
~CDetails(void) {}
...
};
4

Другие решения

ошибка: неопределенная ссылка на ‘vtable for CDetails’

Что здесь упущено? Все предложения приветствуются.

Кажется, вам не хватает moc include перед основной функцией.

main.cpp

#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();
}

main.pro

...
TEMPLATE = app
TARGET = main
QT += quick
SOURCES += main.cpp
...

Обратите внимание, что вам также нужно будет добавить свои пользовательские строки, которые были там раньше, например, иметь дело со средством просмотра приложений и др.

В качестве альтернативы вы также можете отделить класс и main.cpp, что означает, что вы поместите объявление класса в отдельный заголовок, а затем определение в отдельный исходный файл.

Файл main.cpp будет содержать только что созданный заголовок, и вам необходимо убедиться, что новый заголовок и исходный файл добавлены в HEADERS SOURCES переменные в файле проекта qmake, соответственно, для прохождения обработки moc.

6

По вопросам рекламы [email protected]