技术标签: # 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();
解决: 初步分析,应该对科目6598000010 折旧费 做FI凭证的时候没有传入成本中心,用AUVA - 不完全资产 检查,没有发现没有成本中心的资产卡片。那么应该是有成本中心,但是没有传入。估计是折旧过账的设置的规则问题。因为折旧科目是按成本中心分别记入的。科目6598000010被定义为一个成本要素。尚未给和成本会计相关的科目定义一个 CO 科目分配。这意味着必须始终指定一个 CO 科目分配。消息号 KI235 诊断。输入下列 CO 科目分配中的一个。事务代码 ACSET。_sap ki235
首先调用手机系统自带的录音功能需要相关权限以及读写SD卡的权限<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_S......_android调用系统录音机
此错误之所以出现,是因为mybatis在对parameterType="String"的sql语句做了限制,假如你使用<when test="username != null">这样的条件判断时,就会出现该错误在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名。正确的写法<!--用...
分析时难免会用到查看log日志,以及对log日志的操作,接下来我们就来log日志的操作。首先就是登陆服务器,至于方法不做介绍,每个人根据情况的不同会有自己的方法和途径,我这里只讲一下具体的操作:进来之后可以输入命令:cd /这个命令的意思是进入根目录,然后进入日志所在的文件夹,输入命令:cd var/log/program,各个项目的路径不一样,这个命令只是一个格式参考。当你不..._服务器连接log
Transforming DataFrames下面列举了pd常用的数据处理方法import pandas as pdDF = pd.DataFrame(xxxx)探索DF整体这里主要是看数据集里的整体部分,当你拿到数据集后应该是先对数据集的整体进行一个观察和探索看数据的前几行就用head()观察每列的信息用info()DF的数据大小用shape描述性统计每列用describe()!值得注意的是,df.shape 后面没有括号!-----------------
以下现象是否存在于您所在的组织中?员工每天不得不多次登陆多个系统,也不得不记住多个用户名、密码 员工入职或离职时,管理员不得不在多个系统中增加用户、授权或删除用户 多个系统各自维护一套组织数据,如:组织机构信息、...
ex2.m%% Machine Learning Online Class - Exercise 2: Logistic Regression%% Instructions% ------------% % This file contains code that helps you get started on the logistic% regression exerci..._机器学习ex2解析
消费级市场上的SSD固态硬盘在近年迅速普及,不过企业级应用方面,随着物联网设备和云计算业务的需求增加,企业的硬盘容量频频告急。鉴于数据资料的重要性,以及企业级SSD的较高价格,容量相对更大且数据易恢复的企业级HDD依然是大众之选。东芝 8TB企业级硬盘东芝最新发布了全新MG05系列8TB容量企业级大容量硬盘。目前MG05系列共有两款,MG05ACA800A和MG05ACA800E,分别对应支持标准..._东芝8t硬盘fio性能标准
【转载】世界上最牛的编辑器: Vim 1 (原创动图演示所有例子!)【转载】世界上最牛的编辑器: Vim 2 (原创动图演示所有例子!)【转载】世界上最牛的编辑器: Vim 3 (原创动图演示所有例子!)..._editer vim
最近因为客户那边有个地图的需求,于是用了下百度地图的API,版本是2.1,但在实际过程中发现跟demo一样的方式却用几何类Geometry在地图上建立覆盖图层并画线时无法在画出,最后用自己的代码切换到demo上,发现正常,在一点点的修改代码、配置等尝试后得出结论,项目的AndroidManifest.xml中设置了targetSdkVersion导致了无法显示画的线,从网络上查到该设置表示编译的应
1.硬盘技术(1)机械硬盘:机械硬盘大致由磁盘,磁头,马达和电路板等几大项组合而成。机械硬盘是上下盘面同时进数据读取的。而且机械硬盘的旋转速度要远高于唱片(目前机械硬盘的常见转速是 7200 r/min),所以机械硬盘在读取或写入数据时,非常害怕晃动和磕碰。另外,因为机械硬盘的超高转速,如果内部有灰尘,则会造成磁头或盘片的损坏,所以机械硬盘内部是封闭的,如果不是在无尘环境下,则禁止拆开机械硬盘。机械硬盘常见接口:1.IDE 硬盘接口(Integrated Drive Eectronics,并口,即电_存储sas3.0 接口