setMainQmlFile`, rootObject и showExpanded не являются членами QQmlApplicationEngine

Я написал этот фрагмент кода, следуя некоторым учебникам для парней, но не могу его запустить. Ошибка говорит:

setMainQmlFile`, rootObject и showExpanded не являются членами
QQmlApplicationEngine

Он должен получить сигнал от QML и распечатать сообщение (в консоли). В основном я пытаюсь интегрировать C ++ и QML.

РЕДАКТИРОВАТЬ

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

   #include <QGuiApplication>
#include <QQmlApplicationEngine>

#include "qtquickglobal.h"#include <QQmlContext>
#include "myclass.h"#include <QtCore>
#include <QtDebug>
#include <QQuickWindow>int main(int argc, char *argv[]){

//Q_OBJECT;
QGuiApplication app(argc, argv);

QQmlApplicationEngine viewer;

viewer.load(QUrl(QStringLiteral("Qt/Versuch2/main.qml")));

myclass data;

viewer.rootContext() ->setContextProperty("myclassData", &data);
viewer.setMainQmlFile(QStringLiteral("qml/Versuch2/main.qml"));

QObject *viewerobject = viewer.rootObject();

QObject::connect(viewerobject, SIGNAL(qmlSignal(QString)), &data, SLOT(cppSlot(QString)));
viewer.showExpanded();

return app.exec();

}

void myclass::cppSlot(QString msg) {

qDebug() <<QString ("Called the cpp slot with message: %1").arg(msg);
}

Благодарю вас.

0

Решение

Я не знаю, где вы нашли учебник, но в отношении документации Qt нет таких методов, как setMainQmlFile ни showExpanded за QQmlApplicationEngine.

За setMainQmlFile(...)попробуйте использовать вместо setSource(...),

За showExpanded(), это QWidget функция и QQmlApplicationEngine не наследуй QWidget,

относительно rootObject(), это может быть опечатка, вы можете использовать rootObjects() которые возвращают QList<QObject*>,

Изменить: Похоже, вам придется использовать мастер приложений Qt Quick 2 Qt Creator, чтобы воссоздать его QtQuick2ApplicationViewer класс, используемый в учебнике, который вы нашли.

0

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

Используя Qt 5.4.0 и Qt Creator 3.3.0, создайте новый проект:

  1. Нажмите Новый проект
  2. Qt Quick Application
  3. Нажмите Выбрать …
  4. Назовите проект и выберите, где его разместить
  5. Нажмите кнопку «Далее
  6. Выберите Qt Quick 2.4 из выпадающего меню
  7. Нажмите кнопку «Далее
  8. Выберите желаемый комплект (ы)
  9. Нажмите кнопку «Далее
  10. Нажмите Готово

Теперь вы должны увидеть открытый файл main.qml со следующим кодом:

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
visible: true
MainForm {
anchors.fill: parent
mouseArea.onClicked: {
Qt.quit();
}

}
}

Внесите изменения в файл, чтобы он выглядел следующим образом:

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
visible: true

//### New Code ###

signal myQmlSignal(string msg)

//################

MainForm {
anchors.fill: parent
mouseArea.onClicked: {

//### New Code ###
//Replace "Qt.quit();" with

console.log("Sending myQmlSignal from QML...");
myQmlSignal("Hello from QML")

//################
}
}
}

Добавить новый класс в Ваш проект:

  1. Щелкните правой кнопкой мыши имя проекта в средстве просмотра проектов.
  2. Нажмите Добавить новый …
  3. Выберите C ++ Class, если еще не выбран
  4. Нажмите Выбрать …
  5. В поле Имя класса введите «MyCppClass»
  6. Установить базовый класс на QObject
  7. Нажмите кнопку «Далее
  8. Нажмите Готово

Откройте файл mycppclass.h, он должен выглядеть следующим образом:

#ifndef MYCPPCLASS_H
#define MYCPPCLASS_H

#include <QObject>

class MyCppClass : public QObject
{
Q_OBJECT
public:
explicit MyCppClass(QObject *parent = 0);
~MyCppClass();

signals:

public slots:
};

#endif // MYCPPCLASS_H

Внесите изменения в mycppclass.h, чтобы он выглядел так:

#ifndef MYCPPCLASS_H
#define MYCPPCLASS_H

#include <QObject>

//### New Code ###

#include <QDebug>

//################

class MyCppClass : public QObject
{
Q_OBJECT
public:
explicit MyCppClass(QObject *parent = 0);
~MyCppClass();

signals:

public slots:
//### New Code ###

void myCppSlot(const QString &msg);

//################
};

#endif // MYCPPCLASS_H

Откройте mycppclass.cpp, который должен выглядеть следующим образом:

#include "mycppclass.h"
MyCppClass::MyCppClass(QObject *parent) : QObject(parent)
{

}

MyCppClass::~MyCppClass()
{

}

Измените это на это:

#include "mycppclass.h"
MyCppClass::MyCppClass(QObject *parent) : QObject(parent)
{

}

MyCppClass::~MyCppClass()
{

}

void MyCppClass::myCppSlot(const QString &msg)
{
//### New Code ###

qDebug() << "Signal was received by C++. It contains follwoing message: " << msg;

//################
}

Откройте main.cpp, который выглядит так:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

И внесите следующие изменения:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

//### New Code ###

#include "mycppclass.h"
//################

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

//### New Code ###

MyCppClass myCppClass;

QObject::connect(engine.rootObjects().takeFirst(), SIGNAL(myQmlSignal(QString)), &myCppClass, SLOT(myCppSlot(QString)));

//################

return app.exec();
}

Нажмите большой зеленый треугольник, чтобы скомпилировать и запустить Ваше приложение. В области «Просмотр приложения» нажмите «Hello World». Вы должны увидеть следующее сообщение:

qml: отправка myQmlSignal из QML …

Сигнал был получен C ++. Он содержит следующее сообщение: «Привет из QML»

0

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