QT范例解析

首先记录一个很牛的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();//使用导入的对象属性


你可能感兴趣的:(QT范例解析)