2013-07-29 1 views
0

QtCore 5.0에서 선 애니메이션을 그리려면 다음과 같이 코드를 작성하여 펜에 의해 픽셀별로 그려지는 것처럼 보입니다.QGraphicsLineItem에 애니메이션을 적용 할 때의 문제

내 아이디어는 타이머를 사용하고 QGraphicsLineItem :: setLine()을 호출하는 슬롯에 timeout()을 연결하여 회선을 그리는 방법과 루프를 만들고 점차적으로 회선을 그릴 SLOT move()를 만드는 방법입니다. myLine.h

#ifndef MYLINE_H 
#define MYLINE_H 

#include <QGraphicsLineItem> 

class myLine : public QObject, public QGraphicsLineItem 
{ 
    Q_OBJECT 

public: 
    myLine(); 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 

private slots: 
    void mySlot(); 
private: 
    QLineF thisline; 

}; 
#endif // MYLINE_H 

myLine.cpp

myLine::myLine() 
{ 
    thisline.setLine(0,0,50,50); 
} 

void myLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    painter->setRenderHint(QPainter::Antialiasing); 
    painter->setPen(QPen(Qt::red, 8, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); 
    painter->setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern)); 
    painter->drawLine(thisline); 
} 


void myLine::mySlot() 
{ 
    for (int i = 1; i < 100; i++) 
    { 
     QLineF line = this->line(); 
     line.setLine(0,0,50+i,50+i); 
     update(); 
    } 

} 

그런 다음 GraphicsScene

scene = new QGraphicsScene(this); 
ui->graphicsView->setScene(scene); 
ui->graphicsView->setSceneRect(0,0,700,700); 
ui->graphicsView->setRenderHint(QPainter::Antialiasing); 

myLine *line = new myLine(); 
scene->addItem(line); 

timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), line, SLOT(mySlot())); 
timer->start(100); 
전화

그러나 컴파일 할 때 즉시 한 줄만 그립니다. 그게 문제가 루프에있는 것 같아요,하지만 난 정확히 알아낼 수 없습니다. 누군가가 내게 힌트를 줄 수 있다면 정말 고맙습니다.

답변

0

귀하의 즉각적인 문제는 슬롯 구현에 있습니다. 루프 변수는 MyLine 클래스로 이동해야합니다. mySlot()은 호출 될 때마다 한 번 반복해야합니다. 또한 라인 멤버가 필요하지 않습니다. QGraphicsLineItem이 이미 수행합니다. 그래서 최소한의 수정 된 코드는 아래처럼 보일 것입니다.

#include <QApplication> 
#include <QGraphicsLineItem> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QBasicTimer> 

class MyLine : public QObject, public QGraphicsLineItem 
{ 
    QBasicTimer m_timer; 
    int m_i; 
    void timerEvent(QTimerEvent * ev) { 
     if (ev->timerId() == m_timer.timerId()) { 
      setLine(0, 0, 50+m_i, 50+m_i); 
      m_i ++; 
     } 
    } 
public: 
    MyLine() : m_i(0) { 
     setPen(QPen(Qt::red, 8)); 
     m_timer.start(100, this); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QGraphicsScene scene; 
    scene.addItem(new MyLine); 
    QGraphicsView view(&scene); 
    view.setRenderHint(QPainter::Antialiasing); 
    view.setSceneRect(0, 0, 300, 300); 
    view.show(); 
    return a.exec(); 
} 

당신이 Qt를 함께 제공하는 모든을 활용하지 않습니다 무슨 일을하는지 아아. 애니메이션 프레임 워크는 여러분이 필요로하는 것을 정확하게 할 것입니다. 아래 예제 코드.

#include <QApplication> 
#include <QGraphicsObject> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QPropertyAnimation> 

class MyLine : public QGraphicsObject 
{ 
public: 
    MyLine(QGraphicsItem *parent = 0) : QGraphicsObject(parent) {} 
    QRectF boundingRect() const { return QRectF(-60,-60,120,120); } 
    void paint(QPainter * p, const QStyleOptionGraphicsItem *, QWidget *) { 
     p->setPen(QPen(Qt::black, 8)); 
     p->drawEllipse(QPointF(0, 0), 50, 50); 
     p->setPen(QPen(Qt::red, 8)); 
     p->drawLine(0, 0, 0, 50); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QGraphicsScene scene; 
    QGraphicsObject * line = new MyLine; 
    scene.addItem(line); 
    QPropertyAnimation anim(line, "rotation"); 
    anim.setStartValue(0); 
    anim.setEndValue(360); 
    anim.setDuration(1000); 
    anim.setLoopCount(-1); // forever 
    anim.start(); 
    QGraphicsView view(&scene); 
    view.setRenderHint(QPainter::Antialiasing); 
    view.setSceneRect(-60, -60, 120, 120); 
    view.show(); 
    return a.exec(); 
} 
관련 문제