技术标签: # QT学习记录
一般我们说一个类有什么属性,指的就是这个类有啥成员变量。比如People类中有个int age的私有成员变量,我们就可以说这个People类有个“年龄”属性可以更改读取。
Qt提供的属性系统,作用就是把类的信息暴露出来成为通用的、大家都认识的信息。比如用C++语言写的People类中中有个int age变量,但所如果用QML语言去读取就会出问题,因为QML有自己的规则,它不认识C++规则。用Qt的属性系统就可以解决这个问题,当一个类的成员变量或者成员函数用属性系统处理一下,它们就从C++内部中暴露出来,而且大家都认得。
属性系统是专门为元对象系统服务
Qt提供一个Q_PROPERTY()
宏可以定义属性,它也是基于元对象系统实现的。Qt的属性系统与C++编译器无关,可以用任何标准的C++编译器编译定义了属性的Qt C++程序。
在QObject的子类中,用宏Q_PROPERTY()
定义属性,其使用格式如下:
Q_PROPERTY(type name (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY int]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])
注意:
getFunction的返回值类型必须为type;
setFunction的返回值必须为空,而且必须带一个参数
例如:type getFunction();
、void setFunction(type n);
指定了MEMBER之后就能再指定READ和WRITE
Q_PROPERTY()宏定义一个返回值类型为type,名称为name的属性,用READ、WRITE关键字定义属性的读取、写入函数,还有其他的一些关键字定义属性的一些操作特性。属性的类型可以是QVarient支持的任何类型,也可以用户自定义类型。
Q_PROPERTY()宏定义属性的一些关键字的意义如下:
1. READ和WRITE
//头文件
Class Widget : public QObject
{
Q_PROPERTY(int age READ readAge WRITE setAge)
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
int my_age;
int readAge();
void setAge(int n);
}
//源文件
int Widget::readAge()
{
return my_age;
}
void Widget::setAge(int n)
{
my_age = n;
}
2. MEMBER
//头文件
Class Widget : public QObject
{
Q_PROPERTY(int age MEMBER my_age NOTIFY ageChanged)
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
int my_age;
int readAge();
void setAge(int n);
signal:
void ageChanged();
}
//源文件
int Widget::readAge()
{
return my_age;
}
void Widget::setAge(int n)
{
my_age = n;
}
如果是用READ、WRITE,直接调用指定的函数即可,例如:
Widget *w = new Widget;
w->setAge(true);
如果是用MEMBER,那么用QObject的property()
和setProperty()
两个函数,如:
Widget *w = new Widget;
w->property("age");
w->setProperty("age",18);
两种方法,使用WRITE效率更高、速度更快,而且在编译阶段就可以进行类型检查。缺点就是还没运行前你就得了解这个类使用
readAge()
这个函数。而采用MEMBER方式时,我们不需要知道这个类有啥函数、有啥变量,只需要知道这个类有一个叫“age”的属性值就可以。
属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义“名称–值”信息,如:
//头文件
Class Widget : public QObject
{
Q_CLASSINFO("author","Wang")
Q_CLASSINFO("version","3.0.1")
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
}
//使用
Widget *w = new Widget;
w->metaObject()->classInfo(0).name();
w->metaObject()->classInfo(0).value();
w->metaObject()->classInfo(1).name();
w->metaObject()->classInfo(1).value();
从事PI几年,以自己的经历谈谈PI的入门和进阶,个人一家之言,仅供参考1、从PROCESSBOOK开始,这是通常的入门第一课,画些图,作些曲线,如果没有专门的测点,可以使用PI提供的几个测点如SUNUSOID等,要点:值图、趋势图、多状态2、作报表,用DATALINK作些报表,要点:分清出在哪个场合下用哪些公式,内插值、历史值、存档值等概念3、熟悉了以上两个产品后,在好好看看PI的有关_pi数据库教程
为什么80%的码农都做不了架构师?>>> ..._js scrollview属性
基于MATLAB在GUI计算器设计的应用——matlab课程大作业姓名:卢伟峰学号:084633237班级:电科082指导教师:朱静摘要:matlab是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。使用 MATLAB,您可以较使用传统的编程语言(如C、C++和Fortran)更快地解决技术计算问题。matlab 的应用范围非常广,包括信号和图像处理、通讯、控制系...
一款多人在线即时战斗游戏的服务端设计文档整理,补充,备忘.
1、OR 和 ANDOR: 返回的结果是包含OR两边的任意关键词,比如: amazon OR ebayAND: 返回的结果是包含AND两边的关键词,比如: amazon AND ebay注意:OR, AND 必须是大写2、使用""完全匹配使用方法:”关键字”,通过给关键字加双引号的方法,得到的搜索结果就是完全按照关键字的顺序来搜。 例如:mac “microsoft offic..._谷歌搜索怎么加模糊
用IE的时候,地址栏的路径会多了一层或几层。在js用 window.location.href跳转,用相对路径,google是在项目名后,IE却多一层 。解答:其实这个不管iE和chrome不一样。其实也包括Firefox。这是浏览器对相对路径的解析不一样造成的。在项目中用window.location做跳转, @ie中跳转以当前路径开始跳转 @ff/c
关于如何来写一个misc设备,在前面有篇文章已经介绍了大致的流程,现在就让我们来实现一个最简单的misc设备驱动。http://blog.csdn.net/morixinguan/article/details/52700146关于前面的字符设备有以下四篇文章,可以做参考:http://blog.csdn.net/morixinguan/article/details/55002774http:/_misc驱动
C++ 单例模式的几种实现方式。_单例模式c++实现
菜鸟教程(runoob.com)h1{color: red;} - 我们设置了图片的相对地址,能正常显示是因为我们在 head 部分设置了 base 标签,该标签指定了页面上所有链接的默认 URL,所以该图片的访问地址为 "http://www.runoob.com/images/logo.png"菜鸟教程 - 这个链接会在新窗口打开,即便它没有 target="_blank" 属性,因为..._网页制作在头部添加照片
1 下载对应版本的opencv和contrib(版本一定要一致!)opencv版本在这[https://github.com/opencv/opencv/releases],contrib版本在这[https://github.com/opencv/opencv_contrib/tree/3.4.3],注意!要选择版本是在左上角Tag那里选。2 安装(1) 安装依赖项sudo a..._opencv_contrib-3.4.3
IsNullOrEmpty()方法代替null 或 ""的判断_isnullorempty
图像的几何变换cv.warpAffine函数cv.warpAffine函数可以实现图像的、平移、 旋转、仿射变换等功能。该函数的输入和输出如下:cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dstsrc - 输入图像M - 2*3的变换矩阵 是实现各种功能的关键dsize - 输出图像的大小。flags - 插值方法的组合(int 类型!)默认为 flags=cv2.INTER_LINE_cv.warpaffine()