저는 QGraphicsView, QGraphicsScene 및 QGraphicsItem을 사용하여 애니메이션을 제작하고 있습니다. 누군가가 페인트 기능을 호출 할 때 나를 설명 할 수 있습니까? 항목의 변수는 변경하지 않지만 페인트 기능은 약 100ms마다 호출됩니다. 내가 그걸 막을 수있어, 내가 원하면 그 물건을 다시 칠할 수 있니?QGraphicsItem : 페인트 기능을 호출 할 때
답변
QGraphicsView의 viewportUpdateMode를 설정하여 업데이트 방법을 변경할 수 있습니다. 옵션은 다음과 같습니다 -
- 를 QGraphicsView :: FullViewportUpdate
- 를 QGraphicsView :: MinimalViewportUpdate
- 를 QGraphicsView :: SmartViewportUpdate
- 를 QGraphicsView :: BoundingRectViewportUpdate
- 를 QGraphicsView :: NoViewportUpdate
Qt docs explains 다른 옵션이하는 일은 무엇이겠습니까?하지만 모든 것을 원한다면 QGraphicsView :: NoViewportUpdate하고 QTimer 이벤트를 사용하여 직접 제어하십시오.
잘못된 방식으로 접근하고 있습니다. 항목은 필요할 때만, 즉보기 또는 위치를 변경할 때만 다시 칠해야합니다. 그게 바로 QGraphicsItem::update()
입니다. 나머지는 당신을 위해 처리됩니다. 당신이 일을 과장하는 것 같아요.
실제 시간을 사용하여 paint()
메서드 내에서 애니메이션의 현재 시간 종속 매개 변수를 결정하거나 (예 : update()
이 호출되기 직전에)이를 "닫아야"합니다. 애니메이션이 QAbstractAnimation
에서 파생 된 경우 이미 완료되었습니다. 그렇지 않은 경우 QElapsedTimer
을 직접 사용해야합니다.
관련 Qt는 설명서를 말한다 : 현재 시간이 변경 될 때
이애니메이션 프레임 워크는
updateCurrentTime()
를 호출합니다. 이 함수를 다시 구현하면 애니메이션 진행 상황을 추적 할 수 있습니다. 호출 간의 간격이나이 함수에 대한 호출 수가 정의되어 있지 않습니다. 하지만 일반적으로 초당 60 업데이트가됩니다.
이것은 Qt가 최선을 다해 애니메이션을 수행함을 의미합니다. 애니메이션에 의해보고 된 currentTime은 이벤트 루프에서 애니메이션이 업데이트 된 순간의 가장 최근 시간 스냅 샷입니다. 이것은 당신이 원하는 것입니다.
이 모든 것을 처리하는 가장 간단한 방법은 QVariantAnimation
을 QGraphicsObject
과 함께 사용하는 것입니다. 다음은 그 예입니다. 객체를 회전시키는 대신 자신의 슬롯을 가지고 다른 방법으로 수정할 수 있습니다. 신호 슬롯 연결을 사용하는 대신 맞춤형 QGraphicsItem
유도 클래스를 대상으로 맞춤화 된 QVariantAnimation
을 가질 수도 있습니다.
main.cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsObject>
#include <QPropertyAnimation>
#include <QGraphicsRectItem>
class EmptyGraphicsObject : public QGraphicsObject
{
public:
EmptyGraphicsObject() {}
QRectF boundingRect() const { return QRectF(0, 0, 0, 0); }
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) {}
};
class View : public QGraphicsView
{
public:
View(QGraphicsScene *scene, QWidget *parent = 0) : QGraphicsView(scene, parent) {
setRenderHint(QPainter::Antialiasing);
}
void resizeEvent(QResizeEvent *) {
fitInView(-2, -2, 4, 4, Qt::KeepAspectRatio);
}
};
void setupScene(QGraphicsScene &s)
{
QGraphicsObject * obj = new EmptyGraphicsObject;
QGraphicsRectItem * rect = new QGraphicsRectItem(-1, 0.3, 2, 0.3, obj);
QPropertyAnimation * anim = new QPropertyAnimation(obj, "rotation", &s);
s.addItem(obj);
rect->setPen(QPen(Qt::darkBlue, 0.1));
anim->setDuration(2000);
anim->setStartValue(0);
anim->setEndValue(360);
anim->setEasingCurve(QEasingCurve::InBounce);
anim->setLoopCount(-1);
anim->start();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene s;
setupScene(s);
View v(&s);
v.show();
return a.exec();
}
- 1. Pyplot 오류 축 기능을 호출 할 때 :
- 2. 레이블이 확대되지 않아야합니다. Qgraphicsitem
- 3. 투명 JPanel을 AWT에 추가 페인트 할 때
- 4. Jpanel 페인트 할 때 크기 조정
- 5. QGraphicsItem setPos는
- 6. QGraphicsItem 페인트가 호출되지 않음
- 7. AS3_Release를 호출 할 때
- 8. 페인트 이벤트 내에서 함수를 호출 할 수 없습니다.
- 9. NDK 기능을 처음 호출 할 때 조회 지연이 발생합니까?
- 10. 왜 비주얼 스튜디오는 기능을 호출 할 때 그 길을 잃을까요?
- 11. 두 가지 기능을 호출 할 때 Windows 양식이 멈추는 문제
- 12. 오디오 재생 기능을 호출 할 때 자바 이벤트가 종료됩니다.
- 13. 치명적인 오류 :이 기능을 호출 할 때 simplexmlelement
- 14. 다른 DLL에서 기능을 호출 할 때 플러그인 응용 프로그램이 중단됩니다.
- 15. 자바 스크립트 : 개인 기능을 호출 할 때 객체 컨텍스트가 손실되었습니다.
- 16. 아약스에서 동일한 기능을 계속 호출 할 때 도움이 필요합니다.
- 17. 동일한 기능을 호출 할 때 다른 결과가 나옵니다
- 18. 이 예에서 QGraphicsItem
- 19. QPainter가 begin을 호출 할 때 실패합니다.
- 20. TextView 페인트 텍스트가 업데이트 및 스크롤 할 때 깨졌습니다.
- 21. Qt4 : 스케일 불변 qgraphicsitem 개요
- 22. PHP를 사용하여 windows 프로그램 (ms 페인트) 호출
- 23. requestLocationUpdates가 호출 할 때?
- 24. QGraphicsItem :: paint가 호출되기 전에
- 25. :: 페인트()
- 26. 페인트
- 27. QGraphicsItem - 선택 및 회전
- 28. 다른 확장 기능을 호출 할 수 있습니까
- 29. CakePHP의보기에서 컨트롤러 기능을 호출 할 수 있습니까?
- 30. MarkerLayer가 경계 기능을 호출 할 준비가되지 않았습니다.