QML学习笔记
1.一个 QML 文档有且只有一个根元素。
2.QML 元素名后所有内容使用 {} 包围起来。{} 之中是该元素的属性;属性以键值对 name : value 的形式给出。
3.QML 元素可以有一个 id 属性,作为该元素的名字。以后我们可以直接用这个名字指代该元素,相当于该元素的指针。需要注意的是,id 属性在整个 QML 文档中必须是唯一的。
4.QML 元素允许嵌套,一个 QML 元素可以没有、可以有一个或多个子元素。子元素可以使用parent关键字访问其父元素。正如上面的例子中显示的那样,我们可以用 id,也可以用 parent 关键字访问其他元素。
5.通常将根元素的 id 命名为 root。这样我们就可以很方便地访问到根元素。
6.QML 文档的注释使用//注释内容或者/*注释内容*/。这同 C/C++ 或者 JavaScript 是一致的。
7.QML 允许我们自定义属性。我们可以使用 property关键字声明一个自定义属性,后面是属性类型和属性名,最后是属性值。声明自定义属性的语法是 property <type> <name> : <value>。如果没有默认值,那么将给出系统类型的默认值。
8.我们使用 on + 信号名,信号名首字母大写的属性表示一个槽函数。也就是说,当 Text 元素发出 textChanged 信号时,onTextChanged 就会被调用。类似的,onSpacePressed 属性会在空格键按下时被调用。
9.每一个.qml即定义一个元素,如player.qml,那么就player元素可以供其他调用使用,成为一个QML元素。即 player {…}
10.所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。
信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。
槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。
11.QMetaObject::activate用于响应槽函数,即在emit发射后,该函数激活对应的槽函数。【由moc自动生成】
moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。
12.QML与C++交互方式:
context->setContextProperty("_login", m_loginManager);//用于将loginManager对象注册到qml里,在qml里的名字为_login,可通过该名字调用类的功能【loginManager是一个对象(类的实例),而不是类的名称】
13.Q_PROPERTY宏:
在外界看来,property跟类中数据成员没有什么区别,但是还是有几点不一样,参考qt文档,主要有以下几点:
1.必须有一个read函数。它用来读取属性值。因此用Const限定。它的返回值类型必须为属性类型或者属性类型的引用或者指针。不能是其他类型例如:QWidget::hasFocus().
2.有一个可选的write函数。它用来设置属性值,它的返回值必须为void型,而起必须要含有一个参数。例如:QWidget::setEnabled()
3.一个reset函数能够把property设置成其默认状态,它也是可选的。复位功能必须返回void,并且不带参数,
4.一个NOTIFY信号是可选的 。如果定义,它提供了一个信号这个信号在值发生改变时会自动被触发。
14.QML里连接信号与槽的方式:
1 Connections{ 2 3 target: nummake; 4 5 onNumchanged:{ 6 7 num_show.text = nummake.num; 8 9 } 10 11 }
当nummake元素里的onNumchanged信号函数发生(numchanged)时,后面的函数运行(num_show.text = nummake.num;)