您的位置:首页 > 编程语言 > Qt开发

Qt学习例子9——smile3

2011-04-08 13:14 246 查看
绘制笑脸,并使用事件

 

//smiley.h

 

#ifndef SMILEY_H

#define SMILEY_H

#include <QtGui/QWidget>

class Smiley : public QWidget

{

    Q_OBJECT

    Q_PROPERTY(int smileSize READ smileSize WRITE setSmileSize)

public:

    Smiley(QWidget *parent = 0);

    QSize sizeHint() const;

    int smileSize() const;

signals:

    void smileSizeChanged(int size);

public slots:

    void setSmileSize(int);

protected:

    void paintEvent(QPaintEvent *);

    void paintEye(QPainter *painter, const QPoint &pt, int size, const QPoint &focus = QPoint());

    void paintSmile(QPainter *painter, const QRect &r, int angle);

    void mousePressEvent(QMouseEvent *);

    void mouseMoveEvent(QMouseEvent *);

    void mouseReleaseEvent(QMouseEvent *);

private:

    QPoint focusPoint;

    int m_smileSize;

};

#endif // SMILEY_H

 

//smiley.cpp

 

#include "smiley.h"

#include <QPainter>

#include <QMouseEvent>

#include <cmath>

Smiley::Smiley(QWidget *parent)

    : QWidget(parent)

{

    m_smileSize = 100;

}

QSize Smiley::sizeHint() const {

    return QSize(200,200);

}

void Smiley::paintEvent(QPaintEvent *) {

    qDebug("paintEvent:  m_smileSize:%d",m_smileSize);

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);

    QPoint center = rect().center();

    // draw face

    painter.setPen(Qt::NoPen);

    painter.setBrush(Qt::yellow);

    int size = qMin(width(), height());

    painter.drawEllipse(center, size/2, size/2);

    // draw eyes

    int eyeHeight = center.y() - size/4;

    QPoint leftEye(center.x()-size/8, eyeHeight);

    QPoint rightEye(center.x()+size/8, eyeHeight);

    paintEye(&painter, leftEye, size/8, focusPoint.isNull() ? leftEye : focusPoint);

    paintEye(&painter, rightEye, size/8, focusPoint.isNull() ? rightEye : focusPoint);

    // draw smile

    int smileHeight = center.y()-size/8;

    paintSmile(&painter, QRect(center.x()-size/3, smileHeight, 2*size/3, size/2), 0.9*m_smileSize);

}

QPoint computePupil (const QPoint ¢er, const QPoint &focus, int eyeWidth, int eyeHeight)

{

    QPointF dPoint = focus-center;

    if (dPoint.x() == 0 && dPoint.y() == 0) {

        return center;

    } else {

        double angle = atan2 (dPoint.y(), dPoint.x());

        double cosa = cos (angle);

        double sina = sin (angle);

        double h = hypot (eyeHeight * cosa, eyeWidth * sina);

        double x = (eyeWidth * eyeHeight) * cosa / h;

        double y = (eyeWidth * eyeHeight) * sina / h;

        double dist = hypot (x*0.7, y*0.7); //?

        if (dist > hypot (dPoint.x(), dPoint.y())) {

            return dPoint.toPoint()+center;

        } else {

            return QPoint(dist*cosa+center.x(), dist*sina+center.y());

        }

    }

}

void Smiley::paintEye(QPainter *painter, const QPoint &pt, int size, const QPoint &focus) {

    painter->save();

    QPen pen(Qt::black);

    pen.setWidth(2);

    painter->setPen(pen);

    painter->setBrush(Qt::white);

    painter->drawEllipse(pt, size/2, size);

    pen.setWidth(0);

    painter->setPen(pen);

    painter->setBrush(Qt::black);

    painter->drawEllipse(computePupil(pt, focus, size/2, size), size/8, size/8);

    painter->restore();

}

void Smiley::paintSmile(QPainter *painter, const QRect &r, int angle) {

    painter->save();

   

    // enter your code here

    QPen pen(Qt::black);

    pen.setWidth(2);

    painter->setPen(pen);

    painter->drawArc(r,-180*16*(1-m_smileSize/100.0)/2.0,-180*16*(m_smileSize/100.0));

    painter->restore();

}

void Smiley::mousePressEvent(QMouseEvent *me) {

    focusPoint = me->pos();

    update();

}

void Smiley::mouseMoveEvent(QMouseEvent *me) {

    focusPoint = me->pos();

    qDebug("mouseMoving!");

    update();

}

void Smiley::mouseReleaseEvent(QMouseEvent *) {

    focusPoint = QPoint();

    update();

}

void Smiley::setSmileSize(int size) {

    qDebug("setSmileSize:  m_smileSize:%d",m_smileSize);

    if(size == m_smileSize)

            return;

    m_smileSize = size;

    qDebug("%d",m_smileSize);

    emit smileSizeChanged(size);

}

int Smiley::smileSize() const {

    return m_smileSize;

}

 

//main.cpp

 

#include <QtGui/QApplication>

#include <QLayout>

#include <QSlider>

#include "smiley.h"

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    QWidget w;

    QVBoxLayout *l = new QVBoxLayout(&w);

    Smiley *smiley = new Smiley;

    QSlider *slider = new QSlider(Qt::Horizontal);

    l->addWidget(smiley);

    l->addWidget(slider);

    slider->setRange(0,100);

    QObject::connect(slider, SIGNAL(valueChanged(int)), smiley, SLOT(setSmileSize(int)));

    QObject::connect(smiley, SIGNAL(smileSizeChanged(int)), slider, SLOT(setValue(int)));

    slider->setValue(smiley->smileSize());

    w.show();

    return a.exec();

}

 程序运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt signal