我在一些人教程之后编写了这段代码,但我无法运行它。错误说:
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 :(得分:0)
我不知道你在哪里找到了教程,但是关于Qt文档,setMainQmlFile
没有showExpanded
和setMainQmlFile(...)
这样的方法。
对于setSource(...)
,请尝试使用showExpanded()
。
对于QWidget
,它是QQmlApplicationEngine
函数,而QWidget
不会继承rootObject()
。
关于rootObjects()
,它可能是拼写错误,您可以使用返回QList<QObject*>
的{{1}}。
编辑:您似乎必须使用Qt Creator的Qt Quick 2应用程序向导才能重新创建您找到的教程中使用的QtQuick2ApplicationViewer
类。
答案 1 :(得分:0)
使用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:从QML发送myQmlSignal ...
C ++收到了信号。它包含以下消息:“来自QML的Hello”