终终于找到一个可以编译成功的C++ 调用 Qml
S使用qmlengine 而不是 使用 qmlquick的版本
5.6的版本实在找不到QML quick viewer的东西 这个文档真是救命
用自定义属性类型
C++中使用QML对象
官方文档:http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
从C++中加载QML对象
按照官方文档写一直不对,也不知道问题出在哪里,就按照Qt Quick核心编程上的例子写了
通过C++改变QML文档中Item的宽度
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
objectName: "window"
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Item {
objectName: "item"
width: 100
height: 100
Rectangle {
anchors.fill: parent
border.width: 1
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QList>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
QList<QObject*> rootObjects = engine.rootObjects();
int count = rootObjects.size();
QObject *root = NULL;
for(int i=0; i<count; i++)
{
if(rootObjects.at(i)->objectName() == "window")
{
root = rootObjects.at(i);
break;
}
}
QObject *item = root->findChild<QObject*>("item");
//判断是否是空指针
if(item)
{
item->setProperty("width","200");
}
return app.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
QML中定义的是正方形,显示出来是长方形
从C++获取QML对象的成员
属性
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
objectName: "window"
visible: true
width: 640
height: 480
property int someNumber: 100
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlProperty>
#include <QList>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
QList<QObject*> rootObjects = engine.rootObjects();
int count = rootObjects.size();
QObject *root = NULL;
for(int i=0; i<count; i++)
{
if(rootObjects.at(i)->objectName() == "window")
{
root = rootObjects.at(i);
break;
}
}
qDebug() << "Property value:" << QQmlProperty::read(root, "someNumber").toInt();
QQmlProperty::write(root, "someNumber", 5000);
qDebug() << "Property value:" << root->property("someNumber").toInt();
root->setProperty("someNumber", 100);
return app.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
调用QML方法
在C++中调用QML中的方法
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
objectName: "window"
visible: true
width: 640
height: 480
title: qsTr("Hello World")
function myQmlFunction(msg) {
console.log("Got Message",msg)
return "some return value"
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QDebug>
#include <QMetaObject>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
QList<QObject*> rootObjects = engine.rootObjects();
int count = rootObjects.size();
QObject *root = NULL;
for(int i=0; i<count; i++)
{
if(rootObjects.at(i)->objectName() == "window")
{
root = rootObjects.at(i);
break;
}
}
QVariant returnedValue;
QVariant msg = "Hello from C++";
//参数含义:被调用对象的指针,方法名字,返回值,参数
QMetaObject::invokeMethod(root, "myQmlFunction",
Q_RETURN_ARG(QVariant, returnedValue),
Q_ARG(QVariant, msg));
qDebug() << "QML function returned:" << returnedValue.toString();
//这个是运行完毕删除图形界面
delete root;
return app.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
连接QML的信号
在C++中接收QML中发出的信号
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QDebug>
class MyClass : public QObject
{
Q_OBJECT
public slots:
void cppSlot(const QString &msg) {
qDebug() << "Called the C++ slot with message:" << msg;
}
};
#endif // MYCLASS_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QDebug>
#include <QMetaObject>
#include <myclass.h>
#include <QQuickView>
#include <QQuickItem>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
QList<QObject*> rootObjects = engine.rootObjects();
int count = rootObjects.size();
QObject *root = NULL;
for(int i=0; i<count; i++)
{
if(rootObjects.at(i)->objectName() == "window")
{
root = rootObjects.at(i);
break;
}
}
MyClass myClass;
QObject::connect(root, SIGNAL(qmlSignal(QString)),
&myClass, SLOT(cppSlot(QString)));
return app.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow {
objectName: "window"
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
signal qmlSignal(string msg)
MouseArea {
anchors.fill: parent
onClicked: window.qmlSignal("Hello from QML")
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18