Dessiner sous Qt4

Signaler
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013
-
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013
-
Bonjour.
Je faisais du Dessin sous MFC (pas de Probl)

En passant sous Qt, quelque chose coinse.

si je dessine un trait
Painter.drawLine(250000,-2500000,49000000,315000000);
tout ce passe bien.

Mais si je Zoom le Trait met de plus en plus de Temps à se Dessiner.
Qq milli-secondes sans Zoom -> à ~2s une fois Zommer

A Quoi est ce due ???
(J'effectue le Zoom avec .scale)

[i]Les nombres sont importants, mais cela ne devrait pas crée de Problème...
(Normalement)
avec MFC tout Roule (jusqu'a des Nombres de "2 000 000 000")/i

D'ou vient le Problème sous Qt ???

7 réponses

Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

J'ai l'Astuce :
[i] Painter.setClipping(TRUE);
Painter.setClipRect(-100,-100,200,200,Qt::ReplaceClip);/i

Mais c'est toujours très lent !!!!!!!!!!
Si j'ai plus de 30 Lignes, le Programme est comme 'Planté' !!!
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

Auriez vous une 'VRAIE' Astuce
ne pas utilisé QPainter ???
Ou prendre autre chose q'un QWidget comme parent ??????


QPainterEngine peut-il changer quelques choses ?!
Je suis ouvert à toutes propositions.
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
Hello,
Je vais ptet dire une connerie.
J'avais déjà remarqué que Qt avait dû mal avec les grandes coordonnées. Du coup, je translatais mon repère pour avoir les plus petite coordonnées possibles, en prenant le centre de la bounding box de mes objets comme origine...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

Je ne vois pas comment mettre ta proposition en oeuvre...

j'ai besoin de grandes coordonnées ET d'effectuer des Zooms

le coup du setClipRect ne Marche pas.
Même update(50,50,100,100), car même si la Zone update fais quelques Pixels, si il y a dans cette Zone
un 'Gros' Objet, il n'est qu'en partie représenté, mais le Proc. rame comme s'il avait tout l'Objet à représenter.


Personne n'a un Tuyau SVP

Je ne comprend pas que Qt puisse avoir un Tel Bug, il dois y avoir une Esquive toute simple, mais ça m'échappe !!
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

Merci Buno

En gros chuis dans la et je peux rien y faire



Tu as un Exemple de ce dont tu me parles.

Merci.
Messages postés
14952
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
25 janvier 2021
93
En gros chuis dans la m.. et je peux rien y faire

A coeur vaillant, rien d'impossible
Voici un exemple illustrant mes propos:
- tu as un objet donc le centre est en (5000,5000)
- tu calcules que pour dessiner ceci en (0,0), il te faut une translation de (-5000,-5000)
- tu stockes cette translation dans ton prog (idéalement, dans l'objet gérant l'affichage)
- dans ta fonction d'affichage, tu appliques la translation à ton objet
--> pas de changement de coordonnées en interne, juste une translation à l'affichage

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

(...)
- Ok donc ton Objet à un Rectangle englobant de -2500,-2500,2500,2500
et tu divise par 2 les Coordonnées.
----------------------------------------------


Mais ce n'est pas ce que je veux faire :
J'ai un petit rectangle en bas a droite : (250,250,700,700)
Et une grande Ligne qui traverse ce Rectangle : (-2000000000,-2000000000,2000000000,2000000000)

quand je DéZoom, la Ligne est entièrement visible dans l'Ecran et ne met pas longtemps à s'afficher
Et on ne voit pas le Rectangle ( Trops Petit )

Quand je Zoom pour voire le Rectangle,
La Ligne déborde completement de l'Ecran !
Et la ça Rame !!!

Qt Semble vouloir Essayer de Dessiner la Totalité de la Ligne :
(-2000000000,-2000000000,2000000000,2000000000) Unité Logique
mais environs
(-200000000000000,-200000000000000,200000000000000,200000000000000) Unité Device (Vu le Zoom )

J'était sur MFC.
MFC s'en fiche que la Ligne représente :
(-200000000000000,-200000000000000,200000000000000,200000000000000) Pixels
Il ne Dessine que les Coordonées Logiques




Qt Semble se soucier du nombre de Pixel que fait la Ligne puisqu'en deZoomant, le Problème n'est Plus.
Donc il faudrait que j'effectue une Transformation pour les Objets Débordant de l'Ecran.
C'est Très CN, sous MFC il suffit de signalé que seul la partie consernant l'Ecran est à redessiner
PS: update(Rectangle) ne marche pas ici ! (voir 5em Post)




Quel est la solution pour que Qt dessine uniquement la Zone de l'ecran (update(Rectangle))
Et que dans cette zone, il ne dessine que la Partie Visible des Objets. (Ce qui n'a pas l'air d'être le cas ici)



Ou Alors il y a un Problème dans ma mise en Oeuvre de :
[b]1)
update(50,50,100,100)

2)
Painter.setClipping(TRUE);
Painter.setClipRect(-100,-100,200,200,Qt::ReplaceClip); /b