首先记录一个很牛的C++ QT博客
http://www.cnblogs.com/hicjiajia/category/350988.html
QT动画
在QT自带的demo中,有个一个2dpainting的范例,这个例子可以很好的阐述QT简单的动画效果机制。在main函数中创建一个Window对象实例,这个类是从QWidget继承来的,其构造函数中创建一个Widget类型对象,并创建一个QTimer对象,每隔50毫秒触发一次Widget对象的animate()槽函数。在animate中设置一个累计计数变量elapsed,每次被触发增加50(QTimer的触发间隔)并膜上1000,保证这个值不超过1000.而后调用repaint()函数触发调用paintEvent()函数,再次进行绘制即可。
void Widget::paintEvent(QPaintEvent *event)
{
//The QPainter class performs low-level painting on widgets and other paint devices
//QPainter类在Widget或其他绘制设备上执行底层的绘制操作
QPainter painter;
painter.begin(this);//开始在设备上绘图 一个设备上只能有一个绘制对象
painter.setRenderHint(QPainter::Antialiasing);//设置反锯齿
helper->paint(&painter, event, elapsed);//绘制
painter.end();
}
void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed)
{
painter->fillRect(event->rect(), background);
painter->translate(100, 100);//移动画板中心 使widget的中心点为原点
//设置保存点
painter->save();
painter->setBrush(circleBrush);//设置画刷
painter->setPen(circlePen); //设置画笔
painter->rotate(elapsed * 0.030); //按角度顺时针旋转设备 使画面看起来是动的
qreal r = elapsed / 1000.0; //设置微调 r的值从0到1.0循环
int n = 30;
//画30个圆圈
for(int i = 0; i < n; ++i){
painter->rotate(30); //旋转设备30度 绘制圆
qreal radius = 0 + 120.0 * ((i + r) / n);
qreal circleRadius = 1 + ((i + r) / n) * 20;//半径
painter->drawEllipse(QRectF(radius, -circleRadius, circleRadius * 2, circleRadius * 2));
}
painter->restore();
painter->setPen(textPen);
painter->setFont(textFont);
painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, "QT");
}
QT绘图提供了一个很好的机制,在绘制过程中,要绘制的图具有不同位置和旋转角度,但只需要平移和旋转画板对象(绘画设备),实现坐标映射后,在映射后的坐标的原点位置绘制图形,从而简化了对图形位置和角度的计算。
QML与类实例化
QT提供了QML机制,可用于设计界面,但qml也可以实现类对象的持久化。adding范例中定义了一个从QObject继承的类Person,使用Q_OBJECT宏声明,并使用Q_PROPERTY宏定义了两个属性name和shoeSize.这样就可以使用QT的反射机制从qml中加载类的属性了.在main函数中调用qmlRegisterType模板函数注册Person类并指定其版本号和qml中的库名称People.这样就可以从一个合法的qml文件中加载Person类实例了.
QML文件内容(格式类似于json):
import People 1.0
Person{
name: "Henreash"
shoeSize: 12
}
注册并创建实例:
qmlRegisterType<Person>("People", 1, 0, "Person");//将类person注册到qml中,注册类名为People 在qml中使用People标签定义person类对象
QDeclarativeEngine engine;//QDeclarativeEngine为实例化QML组件提供一个环境
QDeclarativeComponent component(&engine, QUrl("qrc:/adding/example.qml"));//QDeclarativeComponent封装了QML组件的定义,是一个数据提供者
Person *person = qobject_cast<Person *>(component.create());//使用导入的qml组件创建对象并做类型转换
if(person)
qWarning() << "The person's name is " << person->name();//使用导入的对象属性