Je crée une animation avec QGraphicsView, QGraphicsScene et QGraphicsItem. Quelqu'un peut-il m'expliquer quand la fonction de peinture est appelée? Bien que je ne change pas les variables de l'article, la fonction de peinture est appelée toutes les ≈100 ms. Puis-je arrêter cela, afin que je puisse repeindre l'objet quand je veux?QGraphicsItem: lorsque la fonction de peinture est appelée
Répondre
Vous pouvez définir viewportUpdateMode de QGraphicsView pour modifier la façon dont il est mis à jour. Les options sont les suivantes: -
- QGraphicsView :: FullViewportUpdate
- QGraphicsView :: MinimalViewportUpdate
- QGraphicsView :: SmartViewportUpdate
- QGraphicsView :: BoundingRectViewportUpdate
- QGraphicsView :: NoViewportUpdate
Le Qt docs explains ce que les différentes options font, mais si vous voulez un contrôle total, il suffit de définir à QGraphicsView :: NoViewportUpdate et contrôlez-le vous-même en utilisant un événement QTimer.
Vous vous en approchez de la mauvaise façon. L'article ne doit être repeint que lorsque cela est nécessaire - lorsque vous changez son aspect ou son emplacement. C'est quand vous appelez le QGraphicsItem::update()
. Le reste sera géré pour vous. Il semble que vous compliquez les choses. Notez que vous devez déterminer le paramètre actuel de l'animation en fonction du temps dans la méthode paint()
, ou le "fermer" (par exemple, juste avant l'appel de update()
), en utilisant le temps réel! Si vos animations sont dérivées de QAbstractAnimation
, c'est déjà fait pour vous. Si ce n'est pas le cas, vous devrez utiliser QElapsedTimer
.
La documentation Qt pertinente dit:
Le cadre d'animation appelle
updateCurrentTime()
quand a changé l'heure actuelle. En réimplémentant cette fonction, vous pouvez suivre la progression de l'animation. Notez que ni l'intervalle entre les appels ni le nombre d'appels à cette fonction ne sont définis; cependant, il sera normalement 60 mises à jour par seconde.
Cela signifie que Qt fera des animations au mieux. Le paramètre currentTime rapporté par l'animation est l'instantané le plus récent au moment où l'animation a été mise à jour dans la boucle d'événements. C'est à peu près ce que tu veux.
La façon la plus simple de traiter tout cela serait d'utiliser QVariantAnimation
avec QGraphicsObject
. Un exemple est ci-dessous. Au lieu de faire pivoter l'objet, vous pouvez avoir votre propre emplacement et le modifier d'une autre manière. Vous pouvez également, au lieu d'utiliser la connexion de tranche de signal, avoir un QVariantAnimation
personnalisé qui prend comme cible votre classe personnalisée QGraphicsItem
.
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. valeur de « ceci » lorsque la fonction est appelée différemment
- 2. Dessiner la bordure de QGraphicsItem
- 3. quelle fonction est appelée?
- 4. La méthode de peinture JPanel n'est pas appelée, pourquoi?
- 5. Est-il possible de modifier une fonction elle-même lorsque sa fonction de propriété est appelée?
- 6. Fonction ne fonctionne que lorsque l'URL est appelée manuellement?
- 7. exécuter du code php dans une fonction de script lorsque la fonction est appelée
- 8. Générer un vecteur uniquement lorsque la fonction de rappel appelée
- 9. QGraphicsItem redessiner problème déselectionner
- 10. comment est la fonction appelée dans xcode
- 11. C18: la fonction appelée est ignorée
- 12. La fonction Jquery est appelée en charge
- 13. comment vérifier si la fonction est appelée?
- 14. Pourquoi la fonction surchargée inappropriée est appelée?
- 15. DataGridView n'appelle pas la méthode Paint lorsque InvalidateCell est appelée
- 16. Comment obtenir la valeur de l'élément lorsque la fonction editItem est appelée dans jsGrid
- 17. La fonction de jeu virtuel Mongoose n'est pas appelée lorsque la valeur est un objet
- 18. Impossible de trouver la variable lorsque la fonction est appelée depuis onClick
- 19. La fonction de clic de division parent est appelée lorsque l'on clique sur Clic enfant
- 20. Quelle méthode est appelée lorsque je reviens de la navigation?
- 21. Seule la première partie de la fonction Javascript est appelée
- 22. Pourquoi la fonction de base est appelée à la place?
- 23. L'application se bloque lorsque UIActionSheet est appelée
- 24. Méthode appelée lorsque le clavier est caché
- 25. La fonction de réussite n'est pas appelée lorsque le formulaire est soumis
- 26. État MFC invalide lorsque la DLL est appelée via LoadLibrary
- 27. clearTimeout lorsqu'une fonction est appelée plusieurs fois
- 28. Comment puis-je savoir QGraphicsItem :: paint() est appelé pour l'impression?
- 29. La fonction 'didFinishLaunchingWithOptions' est appelée de manière inappropriée
- 30. Quand la fonction d'un dependentObservable est-elle appelée?