Я написал этот фрагмент кода, следуя некоторым учебникам для парней, но не могу его запустить. Ошибка говорит:
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);
}
Благодарю вас.
Я не знаю, где вы нашли учебник, но в отношении документации Qt нет таких методов, как setMainQmlFile
ни showExpanded
за QQmlApplicationEngine.
За setMainQmlFile(...)
попробуйте использовать вместо setSource(...)
,
За showExpanded()
, это QWidget
функция и QQmlApplicationEngine
не наследуй QWidget
,
относительно rootObject()
, это может быть опечатка, вы можете использовать rootObjects()
которые возвращают QList<QObject*>
,
Изменить: Похоже, вам придется использовать мастер приложений Qt Quick 2 Qt Creator, чтобы воссоздать его QtQuick2ApplicationViewer
класс, используемый в учебнике, который вы нашли.
Используя Qt 5.4.0 и Qt Creator 3.3.0, создайте новый проект:
Теперь вы должны увидеть открытый файл 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")
//################
}
}
}
Добавить новый класс в Ваш проект:
Откройте файл 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»