Qt学习例子9——smile3
2011-04-08 13:14
246 查看
绘制笑脸,并使用事件
//smiley.h
//smiley.cpp
//main.cpp
程序运行结果:
//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学习例子10——Compsegraphicsitem
- Qt线程学习 一个QThread例子
- Qt多线程学习-用例子来理解多线程(转)
- Qt学习例子11——Transformedsmiley
- QT学习之二:Qt命令模式下建立编译的第一个例子
- Qt学习例子12——Movablesimley
- Qt学习之旅---2.绘图,时钟小例子
- Qt学习例子13——Customitem
- Qt多线程学习-用例子来理解多线程(转)
- Qt学习 之 Socket通信(世界上最简单的例子了)
- Qt学习例子14——Interactiveitem
- QT中QTreeView学习的两个例子
- qt fortuneserver 例子学习 ( 给客户端发送消息)
- Qt学习例子1——HelloWorld
- Qt学习例子15——objectitem
- Qt学习例子2——CalculatorInterface
- Qt学习例子15——objectitem
- Qt学习 之 Socket通信(一个简单的例子)
- Qt学习例子3——test
- Qt学习之旅---3.文件处理,小例子文本编辑器