QML与C++交互
来源:互联网 发布:农村淘宝如何选址 编辑:程序博客网 时间:2024/05/17 07:08
Qt Quick 是一种高级用户界面技术,使用它可轻松地创建供移动和嵌入式设备使用的动态触摸式界面和轻量级应用程序。三种全新的技术共同构成了 Qt Quick 用户界面创建工具包:一个改进的Qt Creator IDE、一种新增的简便易学的语言 (QML) 和一个新加入 Qt 库中名为 QtDeclarative 的模块即Qt Declarative UI,这些使得 Qt 更加便于不熟悉 C++ 的开发人员和设计人员使用。
研究了几天QML,我想编程人员最关心的还是QML怎样与C++ Application交互了。发现网上QT中文资料很少,唉,只能参照官网文档:
一、QML引用C++对象
//main cpp
#include <QApplication>
#include <QDeclarativeView>
#include <QDeclarativeContext>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDeclarativeView view;
QDeclarativeContext *context = view.rootContext();
context->setContextProperty("backgroundColor", QColor(Qt::yellow));
view.setSource(QUrl::fromLocalFile("main.qml"));
view.show();
return app.exec();
}
//main.qml
import Qt 4.7
Rectangle {
width: 300
height: 300
color: backgroundColor
Text {
anchors.centerIn: parent
text: "Hello Yellow World!"
}
}
对于C++中自定义的类:
//main cpp
#include <QApplication>
#include <QDeclarativeView>
#include <QDeclarativeContext>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDeclarativeView view;
view.rootContext()->setContextProperty("palette", new CustomPalette);
view.setSource(QUrl::fromLocalFile("main.qml"));
view.show();
return app.exec();
}
//main.qml
import Qt 4.7
Rectangle {
width: 240
height: 320
color: palette.background //调用C++的类
Text {
anchors.centerIn: parent
color: palette.text
text: "Click me to change color!"
}
MouseArea {
anchors.fill: parent
onClicked: {
palette.text = "blue";
}
}
}
二、QML,C++方法相互调用
新建类:
//numbercount.h
#ifndef NumberCount_H
#define NumberCount_H
#include <QObject>
#include <QVariant>
class NumberCount : public QObject
{
Q_OBJECT
public:
explicit NumberCount(QObject *parent = 0);
Q_INVOKABLE int getTotal();
signals:
void resetData(QVariant num);//用于调用qml的javascript 方法
public slots:
int incre();
int decre();
void reset(int num);
private:
int count;
int total;
};
#endif // NumberCount_H
//==========================================================
//NumberCount.cpp
#include "numbercount.h"
#include <QDebug>
NumberCount::NumberCount(QObject *parent) :
QObject(parent)
{
this->total = 100;
}
int NumberCount::incre()
{
qDebug()<<"count=: "<< ++total;
count++;
return count;
}
int NumberCount::decre()
{
qDebug()<<"count=: "<< --total;
count--;
return count;
}
void NumberCount::reset(int num)
{
this->total = num;
count = 0;
emit resetData(QVariant(num));//调用qml的javascript 方法
}
int NumberCount::getTotal()
{
return total;
}
//==========================================================
//numbercount.qml
import Qt 4.7
Rectangle {
//signal resetData;
function resetData(text){
console.log("javascript resetData方法被C++调用!");
btn_decre.text = "增加<font color='#0000FF'>(0)</font>";
btn_incre.text = "减少<font color='#0000FF'>(0)</font>";
txt_show.text = "总数:" + text;
txt_reset.text = "总数重置为:"+text;
}
width: 300
height: 300
radius: 20
anchors.fill: parent
Text {
id: txt_show
x: 150
y: 0
text : "总数:" + numberCount.getTotal(100);
}
Rectangle{
x:100
y:50
width: 80
height: 25
Image{
anchors.fill: parent
width:parent.width
height: parent.width
source: "/ui/images/button.png"
}
Text {
id: btn_incre
anchors.centerIn: parent
text: "增加"
MouseArea{
anchors.fill: parent
onClicked: {
var num = numberCount.incre();
parent.text = "增加<font color='#0000FF'>(" + num +")</font>";
btn_decre.text = "减少<font color='#0000FF'>("+ num+")</font>";
txt_show.text = "总数:" + numberCount.getTotal();
}
}
}
}
Rectangle{
x:100
y:100
width: 80
height: 25
Image{
anchors.fill: parent
width:parent.width
height: parent.width
source: "/ui/images/button.png"
}
Text {
id: btn_decre
anchors.centerIn: parent
text: "减少"
MouseArea{
anchors.fill: parent
onClicked: {
var num = numberCount.decre();
parent.text = "减少<font color='#0000FF'>(" + num +")</font>";
btn_incre.text = "增加<font color='#0000FF'>("+ num+")</font>";
txt_show.text = "总数:" + numberCount.getTotal();
}
}
}
}
Rectangle{
x:100
y:150
width: 80
height: 25
Image{
anchors.fill: parent
width:parent.width
height: parent.width
source: "/ui/images/button.png"
}
Text {
id: btn_show
anchors.centerIn: parent
text: "重置总数"
MouseArea{
anchors.fill: parent
onClicked: {
numberCount.reset(200);
}
}
}
}
Text {
id: txt_reset
x: 100
y: 200
color: "#12ff12"
}
}
//==========================================================
//qml.qrc
<RCC>
<qresource prefix="/ui">
<file alias="qml/qml_main">Auto_Order_UI.qml</file>
<file>images/Alert_09.png</file>
<file>images/Alert_10.png</file>
<file>images/Alert_11.png</file>
<file>images/Alert_12.png</file>
<file>images/Alert_13.png</file>
<file>images/Alert_14.png</file>
<file>images/Alert_15.png</file>
<file>images/Alert_16.png</file>
<file>images/carmageddon2.png</file>
<file>images/counter-strike.png</file>
<file>images/X3.png</file>
<file alias="qml/qml_sw">sw.qml</file>
<file>images/button.png</file>
</qresource>
</RCC>
//==========================================================
//main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtDeclarative/QDeclarativeView>
#include <QtDeclarative/QDeclarativeComponent>
#include <QtDeclarative/QDeclarativeItem>
#include <QtDeclarative/QDeclarativeEngine>
#include <QtDeclarative/QDeclarativeContext>
#include "numbercount.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NumberCount *numberCount = new NumberCount();
QDeclarativeContext *context = view.rootContext();
context->setContextProperty("numberCount",numberCount);//注册C++对象到qml
view.setSource(QUrl("qrc:/ui/qml/qml_sw"));
QObject *rootObject = dynamic_cast<QObject*>(view.rootObject());
QObject::connect(numberCount, SIGNAL(resetData(QVariant)), rootObject, SLOT(resetData(QVariant)));//将C++信号与QML槽关联
view.show();
return a.exec();
}
官方文档:
It is possible to call methods of QObject derived types by either exposing the methods as public slots, or by marking the methods Q_INVOKABLE .
也就是说 getTotal()和incre()都能在QML中访问。
运行界面:
- QML与C++交互
- QML与c++交互
- QML与C++交互
- QML与C++交互
- QML与c++交互
- QML与C++交互
- QML与C++交互
- qml 与 c++交互
- QML与c++交互学习
- C++与QML交互基础
- QML与C++的交互
- qml与C++的交互
- QML与c++交互方法
- qml之与C++交互
- QML与c++交互学习笔记
- QML与c++交互学习笔记(一)
- QML与c++交互学习笔记(二)
- QML与c++交互学习笔记(三)
- 2.1 castle
- SimpleDateFormat的测试,此类不是线程安全的。
- HDU 1671 Phone list (Tire tree)
- java实现线程局部变量:ThreadLocal
- 等有钱了,别忘了咱爸妈!(感人) (阅75115) ---------
- QML与C++交互
- ActionScript3学习笔记(1) - 基本语法
- csdn 也欺负我
- Andriod 九宫格
- 【计算机体系结构】十进制小数转换成二进制小数
- 10-12-05
- 共用体union用法讲解
- java方向毕业设计谁能帮帮我啊
- 一个列别名引发的性能问题,兼谈产品设计等(2010-11-15)