pre.western { font-family: "DejaVu Sans Mono",monospace; }pre.cjk { font-family: "DejaVu Sans",monospace; }pre.ctl { font-family: "DejaVu Sans Mono",monospace; }p { margin-bottom: 0.21cm; }
1. 导出Person 类,并且一个Job 类,Job 类包含一个Person 的指针
pre.western { font-family: "DejaVu Sans Mono",monospace; }pre.cjk { font-family: "DejaVu Sans",monospace; }pre.ctl { font-family: "DejaVu Sans Mono",monospace; }p { margin-bottom: 0.21cm; }
1. 导出Person 类,并且一个PersonGroup 类,PersonGroup 类是Person 的一个组
2. 具体导出过程
1. 通过属性来实现,具体的请看代码
3. 具体代码
//
person.h
#ifndef
PERSON_H
#define
PERSON_H
#include
<QObject>
#include
<QDeclarativeListProperty>
#include
<QList>
class
Person
:
public
QObject
{
Q_OBJECT
Q_PROPERTY
(
QString
name
READ
getName
WRITE
setName
NOTIFY
sendNameChange)
Q_PROPERTY
(
int
age
READ
getAge
WRITE
setAge
NOTIFY
sendAgeChange)
public
:
explicit
Person(
QObject
*
parent
=
0
);
QString
getName(
void
)
const
;
void
setName(
const
QString
&
name);
int
getAge(
void
);
void
setAge(
int
age);
signals
:
void
sendNameChange(
void
);
void
sendAgeChange(
void
);
private
:
QString
m_Name;
int
m_Age;
};
class
PersonGroup
:
public
QObject
{
Q_OBJECT
Q_PROPERTY
(
QDeclarativeListProperty
<
Person>
members
READ
members)
public
:
explicit
PersonGroup(
QObject
*
parent
=
0
);
QDeclarativeListProperty
<
Person>
members(
void
);
Q_INVOKABLE
int
membersCount(
void
)
const
;
Q_INVOKABLE
Person
*
member(
int
index)
const
;
private
:
QList
<
Person*>
m_MemberList;
};
#endif
//
PERSON_H
|
//
person.cpp
#include
"person.h"
//---------------------------------
//
Person::
Person(
QObject
*
parent)
:
QObject
(
parent),
m_Name(
"unknow"
),
m_Age(
0
)
{
}
//---------------------------------
//
QString
Person::
getName(
void
)
const
{
return
m_Name;
}
//---------------------------------
//
void
Person::
setName(
const
QString
&
name)
{
m_Name
=
name;
emit
sendNameChange();
}
//---------------------------------
//
int
Person::
getAge(
void
)
{
return
m_Age;
}
//---------------------------------
//
void
Person::
setAge(
int
age)
{
m_Age
=
age;
emit
sendAgeChange();
}
//---------------------------------
//
PersonGroup::
PersonGroup(
QObject
*
parent)
:
QObject
(
parent)
{
}
//---------------------------------
//
QDeclarativeListProperty
<
Person>
PersonGroup::
members(
void
)
{
return
QDeclarativeListProperty
<
Person>(
this
,
m_MemberList);
}
//---------------------------------
//
int
PersonGroup::
membersCount()
const
{
return
m_MemberList.
size();
}
//---------------------------------
//
Person
*
PersonGroup::
member(
int
index)
const
{
return
m_MemberList.
at(
index);
}
|
//
main.cpp
#include
<QtGui/QApplication>
#include
<QtDeclarative/QDeclarativeView>
#include
<QtDeclarative/QDeclarativeEngine>
#include
<QtDeclarative/QDeclarativeComponent>
#include
"person.h"
int
main(
int
argc,
char
*
argv[])
{
QApplication
a(
argc,
argv);
qmlRegisterType<
Person>(
"People"
,
1
,
0
,
"Person"
);
//qmlRegisterType<Person>();
qmlRegisterType<
PersonGroup>(
"People"
,
1
,
0
,
"PersonGroup"
);
QDeclarativeView
qmlView;
qmlView.
setSource(
QUrl
::
fromLocalFile(
"../UICtest/UICtest.qml"
));
qmlView.
show();
return
a.
exec();
}
|
//
UICtest.qml
import
Qt
4.7
import
People
1.0
//
如果是qmlRegisterType<Person>();
导出就可以注释这条
Rectangle
{
width
:
640
height
:
480
property
int
pgcurIndex:
0;
PersonGroup
{
id
:
group;
members
:
[
Person
{
name
:
"A"
;
age
:
20},
Person
{
name
:
"B"
;
age
:
21},
Person
{
name
:
"C"
;
age
:
22},
Person
{
name
:
"D"
;
age
:
23},
Person
{
name
:
"E"
;
age
:
24}
]
}
//
显示这份工作的一些信息
Rectangle
{
x
:
100;
y
:
100;
width
:
100;
height
:
100;
Text
{
id
:
text1;
text
:
""
}
Text
{
id
:
text2;
y
:
20;
text
:
""
}
Text
{
id
:
text3;
y
:
40;
text
:
""
}
}
MouseArea
{
anchors.fill
:
parent;
onClicked
:{
//if
(pgcurIndex
<
group.membersCount()
-
1){
//
这里两种方法都可以
if
(pgcurIndex
<
group.members.length
-
1){
pgcurIndex++;
}else
{
pgcurIndex
=
0;
}
//
显示信息
text1.text
=
"PersonGroup
index:
"
+
pgcurIndex;
var
person
=
group.member(pgcurIndex);
text2.text
=
"Person
name:
"
+
person.name;
text3.text
=
"Person
age:
"
+
person.age;
}
}
}
|
说明 :
这里导出了两个类Person , PersonGroup , PersonGroup 保存来一个 Person 的组,
我们通过导出的函数来调用类面的成员 ,获取成员的信息.
QML与c++交互学习笔记(六) 关于qt c++中创建对象,QML获取此对象数据问题
1. 假设
1. 在c++ 中创建一个 Person 的对象,
2. 在 QML 中获取并显示数据
3. 在 c++ 中改变数据后,显示的数据能进行相应的改变
也就是说我们实际是在c++ 中new 一个对象出来,而把这个对象的数据在QML 里面进行显示
2. 具体代码
//
person.h
#ifndef
PERSON_H
#define
PERSON_H
#include
<QObject>
#include
<QDeclarativeListProperty>
#include
<QList>
#include
<QColor>
class
Person
:
public
QObject
{
Q_OBJECT
Q_PROPERTY
(
QString
name
READ
getName
WRITE
setName
NOTIFY
sendNameChange)
Q_PROPERTY
(
int
age
READ
getAge
WRITE
setAge
NOTIFY
sendAgeChange)
public
:
explicit
Person(
QObject
*
parent
=
0
);
QString
getName(
void
)
const
;
void
setName(
const
QString
&
name);
int
getAge(
void
);
void
setAge(
int
age);
//
一个简单的函数,
获取蓝色
Q_INVOKABLE
QColor
getColor(
void
)
const
;
Q_INVOKABLE
void
changeNameAndAge(
void
);
signals
:
void
sendNameChange(
void
);
void
sendAgeChange(
void
);
private
:
QString
m_Name;
int
m_Age;
};
#endif
//
PERSON_H
|
//
person.cpp
#include
"person.h"
//---------------------------------
//
Person::
Person(
QObject
*
parent)
:
QObject
(
parent),
m_Name(
"unknow"
),
m_Age(
0
)
{
}
//---------------------------------
//
QString
Person::
getName(
void
)
const
{
return
m_Name;
}
//---------------------------------
//
void
Person::
setName(
const
QString
&
name)
{
m_Name
=
name;
emit
sendNameChange();
}
//---------------------------------
//
int
Person::
getAge(
void
)
{
return
m_Age;
}
//---------------------------------
//
void
Person::
setAge(
int
age)
{
m_Age
=
age;
emit
sendAgeChange();
}
//---------------------------------
//
QColor
Person::
getColor(
void
)
const
{
return
QColor
(
Qt
::
blue);
}
//---------------------------------
//
void
Person::
changeNameAndAge(
void
)
{
setName(
"Luly"
);
setAge(
31
);
}
|
//
main.cpp
#include
<QtGui/QApplication>
#include
<QtDeclarative/QDeclarativeView>
#include
<QtDeclarative/QDeclarativeEngine>
#include
<QtDeclarative/QDeclarativeComponent>
#include
<QtDeclarative/QDeclarativeContext>
#include
"person.h"
int
main(
int
argc,
char
*
argv[])
{
QApplication
a(
argc,
argv);
Person
tmpPerson;
tmpPerson.
setName(
"Tom"
);
tmpPerson.
setAge(
25
);
QDeclarativeView
qmlView;
qmlView.
rootContext()->
setContextProperty(
"ps"
,&
tmpPerson);
qmlView.
setSource(
QUrl
::
fromLocalFile(
"../UICtest/UICtest.qml"
));
qmlView.
show();
return
a.
exec();
}
|
//
UICtest.qml
import
Qt
4.7
Rectangle
{
width
:
640
height
:
480
Text
{
text
:
"Person
name:"
+
ps.name;
}
Text
{
y
:
20;
text
:
"Person
age:"
+
ps.age;
}
Rectangle
{
x
:
20;
y
:
40;
width
:
20;
height
:
20;
color
:
ps.getColor();}
MouseArea
{
anchors.fill
:
parent;
//
当鼠标按下后改变名字和年龄
onClicked
:
{
ps.changeNameAndAge();
}
}
}
|
说明 :
我们在c++ 中创建来一个对象,并且在把这个对象导出给QML 调用用 ,我们设置来属性,QML 中可以直接使用属性来进行赋值.
QML与c++交互学习笔记(七)
QT 2011-01-10 20:31:01 阅读121 评论 字号:大 中 小 订阅
pre.western { font-family: "dejavu sans mono",monospace; }pre.cjk { font-family: "dejavu sans",monospace; }pre.ctl { font-family: "dejavu sans mono",monospace; }p { margin-bottom: 0.21cm; }a:link { }
1. 假设这样一种情况
我这里由一个Wideget 继承自QWidget 上面添加来一个QLabel, 一个QPushButton
我如何把这个Wideget 放到QML 中使用,那么我当QPushButton 按下后我怎么在QML 中进行处理呢?
我这里指出一种方法
让Wideget 继承QGraphicsProxyWidget ,对Wideget 进行导出,在QML 中创建
此对象,在他导出的信中进行处理, 具体代码。
还有就是这个网址上说明来很多QML 与c++ 之间通讯的方法,很悲剧的是我的assistant 中却没有者部分,不知道版本低还是怎么的。
http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html
2. 具体代码
//widget.h
#ifndef
WIDGET_H
#define
WIDGET_H
#include
<QWidget>
#include
<QGraphicsProxyWidget>
#include
<QPushButton>
#include
<QLabel>
#include
<QLineEdit>
class
Widget
:
public
QGraphicsProxyWidget
{
Q_OBJECT
public
:
explicit
Widget(
QGraphicsItem
*
parent
=
0
);
~
Widget();
Q_INVOKABLE
void
changeText(
const
QString
&
s);
signals
:
void
sendOnButton(
void
);
private
:
QPushButton
*
m_Btn;
QLabel
*
m_Label;
QWidget
*
m_MainWidget;
};
#endif
//
WIDGET_H
|
//widget.cpp
#include
"widget.h"
Widget::
Widget(
QGraphicsItem
*
parent)
:
QGraphicsProxyWidget
(
parent)
{
m_MainWidget
=
new
QWidget
;
m_Btn
=
new
QPushButton
(
m_MainWidget);
m_Label
=
new
QLabel
(
m_MainWidget);
m_Btn->
setText(
"PushButton"
);
m_Btn->
setGeometry(
10
,
10
,
100
,
30
);
m_Label->
setGeometry(
10
,
40
,
200
,
30
);
QObject
::
connect(
m_Btn,
SIGNAL
(
clicked()),
this
,
SIGNAL
(
sendOnButton()));
setWidget(
m_MainWidget);
}
Widget::~
Widget()
{
delete
m_MainWidget;
}
void
Widget::
changeText(
const
QString
&
s)
{
m_Label->
setText(
s);
qDebug(
"
call
Widget::changeText"
);
}
|
//
main.cpp
#include
<QtGui/QApplication>
#include
<QtDeclarative/QDeclarativeView>
#include
<QtDeclarative/QDeclarativeEngine>
#include
<QtDeclarative/QDeclarativeComponent>
#include
<QtDeclarative/QDeclarativeContext>
#include
"widget.h"
int
main(
int
argc,
char
*
argv[])
{
QApplication
a(
argc,
argv);
qmlRegisterType<
Widget>(
"UIWidget"
,
1
,
0
,
"Widget"
);
QDeclarativeView
qmlView;
qmlView.
setSource(
QUrl
::
fromLocalFile(
"../UICtest/UICtest.qml"
));
qmlView.
show();
return
a.
exec();
}
|
//
UICtest.qml
import
Qt
4.7
import
UIWidget
1.0
Rectangle
{
width
:
640
height
:
480
color
:
"black"
Widget
{
id
:
uiwidget;
x
:
100;
y
:
100;
width
:
400;
height
:
100;
//
关键在这里,当一个信号导出后他的相应的名字就是第1
个字母大写,前面在加上on
//
例如
clicked
--
onClicked
colorchange
--onColorchange;
onSendOnButton
:
{
uiwidget.changeText(textinput.text);
}
}
Rectangle
{
x
:
100;
y
:
20;
width
:
400;
height
:
30;
color
:
"blue"
TextInput
{id
:
textinput;
anchors.fill
:
parent;
color
:
"white"
}
}
}
|
说明:
这里实现的是当QPushButton 按钮按下后,获取QML 中TextInput 上的文本,
对QLabel 进行设置,关键点在于Widget 中的信号函数sendOnButton, 他导出后在QML 中
将引发的是onSendOnButton 只要在QML 中对这个编写处理就可以实现,具体看代码。
QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
QT 2011-01-11 10:18:01 阅读100 评论 字号:大 中 小 订阅
pre.western { font-family: "DejaVu Sans Mono",monospace; }pre.cjk { font-family: "DejaVu Sans",monospace; }pre.ctl { font-family: "DejaVu Sans Mono",monospace; }p { margin-bottom: 0.21cm; }
1. 这里主要是介绍,如何在c++ 中调用QML 中的函数和设置QML 中的属性的问题
2. 具体代码
//
UICtest.qml
import
Qt
4.7
Rectangle
{
id
:
mainWidget;
width
:
640
height
:
480
function
callbyc(v)
{
mainWidget.color
=
v;
return
"finish"
;
}
Rectangle
{
id
:
secondRect;
x
:
100;
y
:
20;
width
:
400;
height
:
300;
Rectangle
{
x
:
10;
y
:
20;
width
:
30;
height
:
40;
color
:
"#FF035721"
Text
{
objectName
:
"NeedFindObj"
;
anchors.fill
:
parent;
text
:
""
;
}
}
}
}
|
//
main.cpp
#include
<QtGui/QApplication>
#include
<QtDeclarative/QDeclarativeView>
#include
<QtDeclarative/QDeclarativeEngine>
#include
<QtDeclarative/QDeclarativeComponent>
#include
<QtDeclarative/QDeclarativeContext>
#include
<QtDeclarative/QDeclarativeItem>
#include
<QMetaObject>
int
main(
int
argc,
char
*
argv[])
{
QApplication
a(
argc,
argv);
QDeclarativeView
qmlView;
qmlView.
setSource(
QUrl
::
fromLocalFile(
"../UICtest/UICtest.qml"
));
qmlView.
show();
//
获取根节点,就是
QML
中
id
是mainWidget
的节点
QDeclarativeItem
*
item
=
qobject_cast<
QDeclarativeItem
*>(
qmlView.
rootObject());
item->
setProperty(
"color"
,
QVariant
(
"blue"
));
//
查找到我们需要的节点根均objectname
NeedFindObj
来获得,并设置他的文本属性
QDeclarativeItem
*
item1
=
item->
findChild<
QDeclarativeItem
*>(
"NeedFindObj"
);
if
(
item1)
{
item1->
setProperty(
"text"
,
QVariant
(
"OK"
));
}
//
调用QML
中的函数,
分别是
函数所在的对象,
函数名,返回值,
参数
QVariant
returnVar;
QVariant
arg1
=
"blue"
;
QMetaObject
::
invokeMethod(
item,
"callbyc"
,
Q_RETURN_ARG
(
QVariant
,
returnVar),
Q_ARG
(
QVariant
,
arg1));
qDebug(
"
%s"
,
returnVar.
toString().
toLocal8Bit().
data());
return
a.
exec();
}
|
说明:
这里的根节点是id 为mainWidget 的矩形元素,那么在C++ 中获取根节点后就可以,直接的设置他的属性了。其他属性也可以同样, 调用指定节点内的函数是通过QMetaObject 中的invokeMethod 来进行调用的。
最后所有关于QML 和c++ 交互部分就基本写完,如果想要更多的东西,或者一些其他方法,强烈看看
http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html ,或者帮助文档,(究竟是不是我的文档里面没有还是怎么的)