QML中使用C++类的实现

之前用Qt写过串口的小软件。STM32 IAP工具 和 用qt写的一个简单到不能在简单的上位机 。后来接触了QML,觉得传统的那种界面太那个了,写样式也麻烦。所以很早就想过用QML来为串口上位机做界面。无奈没搞懂QML到底是如何去调用C++的。百度了一堆文章,多半是翻译官方的例子。不知所云。直到最近在csdn上看到一篇文章 Qt Quick 之 QML 与 C++ 混合编程详解 ,终于有点懂了。不过,文章似乎有点长了。博客园上面也有见过,有朋友写过类似的文章。今天,总算实现了QML访问一个自定义类中的属性。故写下这篇文章。

例子很简单,main.qml访问stringt类中的一个属性并显示其内容:m_String

注意:Qt版本 5.4.0 | Creater版本 3.3.0

首先创建一个新的 Qt Quick Application-->选择controls 1.3。选择带controls的,生成的main.qml的根是ApplicationWindow 而另一种则是Window,其他的看起来没什么区别。具体要查文档咯

项目中有个MainForm.ui.qml。把他删掉。然后修改main.qml文件。

1 ApplicationWindow {
2     title: qsTr("Hello World")
3     width: 640
4     height: 480
5     visible: true     //显示窗口
6
7
8 }

然后创建一个stringt类继承QObject。如果想要让一个类可以被qml访问。这个类必须是继承QObject或其派生类。

使用宏Q_PROPERTY可以让方法被moc感知。stringt类的代码如下

 1 #ifndef STRINGT_H
 2 #define STRINGT_H
 3
 4 #include <QObject>
 5
 6 class stringt : public QObject
 7 {
 8     Q_OBJECT
 9     Q_PROPERTY(QString Ttext READ Ttext WRITE setTtext)
10 public:
11     explicit stringt(QObject *parent = 0);
12     ~stringt();
13
14     QString Ttext(void) const;
15     void setTtext(const QString str);
16 signals:
17
18 public slots:
19
20 private:
21     QString m_String;
22 };
23
24 #endif // STRINGT_H

上边是头文件,接下来是源文件

 1 #include "stringt.h"
 2
 3 stringt::stringt(QObject *parent)
 4     : QObject(parent)
 5     , m_String("Text just")
 6 {
 7
 8 }
 9
10 stringt::~stringt()
11 {
12
13 }
14
15 QString stringt::Ttext() const
16 {
17     return m_String;
18 }
19
20 void stringt::setTtext(const QString str)
21 {
22     m_String = str;
23 }

接着就是main文件里面,注册这个类就可以了,用qmlRegisterType这个函数

 1 #include <QApplication>
 2 #include <QQmlApplicationEngine>
 3 #include <QtQml>
 4 #include "stringt.h"
 5
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication app(argc, argv);
 9
10     qmlRegisterType<stringt>("m.stringT", 1, 0, "StringT");
11                    //要导入的类  包名 主版本号 次版本号 元素名
12     QQmlApplicationEngine engine;
13     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
14
15     return app.exec();
16 }

最后就是QML文件了。这里定义了两个矩形。点击左边的矩形后,右边的矩形会改变颜色和文本。

 1 import QtQuick 2.4
 2 import QtQuick.Controls 1.3
 3 import QtQuick.Window 2.2
 4 import QtQuick.Dialogs 1.2
 5 import m.stringT 1.0    //导入类
 6
 7 ApplicationWindow {
 8     title: qsTr("Hello World")
 9     width: 640
10     height: 480
11     visible: true
12
13     StringT{    //创建一个元素
14         id: stringT
15     }
16
17     Rectangle {
18         id: rect1
19         x: 12; y: 12
20         width: 60; height: 60
21         color: "lightsteelblue"
22         MouseArea {
23             id: rect1_area
24             anchors.fill: parent
25             onClicked:
26             {
27                 rect2.color = "lightgreen"
28                 rect2_text.text = stringT.Ttext
29             }
30         }
31     }
32
33     Rectangle {
34         id: rect2
35         x: rect1.x + rect1.width + 10
36         y: rect1.y
37         width: rect1.width; height: rect1.height
38         border.color: "lightsteelblue"
39         border.width: 3
40         radius: 3
41         Text {
42             id: rect2_text
43             text: qsTr("Hello")
44             font.pixelSize: 12
45             anchors.centerIn: parent
46         }
47     }
48 }

效果大概是这样的。

时间: 2024-11-06 09:40:40

QML中使用C++类的实现的相关文章

QT之在QML中使用C++类和对象

QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的两个世界,如果想在QML中访问C++对象,那么必然要找到一种途径在两个运行环境之间建立沟通的桥梁. Qt提供了两种在QML环境中使用C++对象的方式: (1)在C++中实现一个类,注册为QML环境的一个类型,在QML环境中使用该类型创建对象 (2)在C++中构造一个对象,将这个对象设置为QML的上下

在Qt5的QML中使用QZXing识别二维码

前言 ZXing库是一个用来识别二维码的库,QZXing是一个基于Qt的Qt wrapper library,在本文我们使用它和qml开发一个android小应用. 添加QZXing项目 QZXing最常用是作为一个子项目包含在我们的项目中,在我们的项目的pro文件中添加如下的一句: include(./QZXing/QZXing.pri) QZXing和我们的pro文件在同一个目录. qml程序 import QtQuick 2.0 import QtQuick.Controls 1.3 im

OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗.. 注:那为什么基本类型不能存入到集合中呢? 原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有

C++中虚基类

摘自<C++程序设计> 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员. C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员. 下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类. 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

C#派生类中使用基类protected成员的方法

我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被protected修饰时,我们应该怎么在派生类中使用基类成员呢,下面将介绍使用方法. 首先我们贴一段错误的使用代码: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.ReadLine(); 6 7 } 8 } 9 pub

OC学习篇之---Foundation框架中的NSDictionary类以及NSMutableDictionary类

今天来看一下Foundation框架中的NSDictionary类,NSMutableDictionary类,这个和Java中的Map类很想,OC中叫字典,Java中叫Map,还有字典是无序的,这个和NSArray不一样,Java中的Map也是无序的,通过hash值去检索元素的. 一.NSDictionary类 [objc] view plain copy // //  main.m //  19_NSDictionary // //  Created by jiangwei on 14-10-

Java中各种(类、方法、属性)访问修饰符与修饰符的说明

类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所有类访问(使用),其他项目若想使用本项目中的类,必须将本项目打包为jar包,然后加入到classpath中 public类必须定义在和类名相同的同名文件中 (default) 只能被同一个包中的类访问(使用) 默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 修饰符 名称