6
votes

Programmatic QGraphicsview Saufliger ne pas mettre à jour correctement

J'ai une classe personnalisée dérivée de qgraphicsview qui implémente un appel de slot Scrollhorizontal (INT DX), à l'intérieur du code est simplement xxx pré>

mon problème est, défilant comme ça marche mais ne fonctionne pas Mettez à jour la scène correctement, à la place des pixels trouvés sur le bord de la vue sont répétés au lieu d'avoir un nouvel appel à la méthode de la peinture ) de l'élément () p>

J'ai tenté d'appeler mise à jour () code> après, mais rien ne se passe. J'ai essayé d'activer le défilement en faisant glisser et mettre à jour le travail bien! Mais j'en ai besoin de le faire par programme, et puisque j'ai les barres de défilement des choses cachées comme horizonontalscrollbar () -> SetValue () code> Ne faites pas défiler la vue. P>

J'ai aussi essayé: xxx pré>

update: p>

connect(eventView, SIGNAL(horizontalScroll(int)), headerView, SLOT(horizontalScroll(int));


2 commentaires

J'aimerais vraiment jeter un coup d'œil à un exemple minimal de code qui le reproduit.


Je pense aussi que la meilleure idée est de créer un exemple de code minimal. Seules ces deux vues avec leur connexion. Pouvez-vous faire cela? Cela aidera beaucoup. Peut-être que vous trouverez la solution en le faisant, cela se produit souvent. ;)


3 Réponses :


3
votes

Vous n'êtes pas censé appeler ScrollContentsBy Comme expliqué ici: http://qt-project.org/doc/qt-4.8/qabstractScrollarea.html#scrollConty

Je ne sais pas si vous pouvez toujours appeler la barre de défilement cachée pour le faire défiler. Sinon, Traduire est un option.


7 commentaires

Appeler Traduire (DX, 0) ne fait rien sur la scène.


Bien. Cela devrait fonctionner. Mais essayez ensuite le Centreon un point de scène. Vous devez calculer le point vous-même.


Void CustomVoir :: horizontalscroll (int dx) {qpointf centre = maptoscène (fenêtrePort () -> rect (). Centre ()); centeron (centre.x () + dx, centre.y ()); mettre à jour(); } ne fonctionne pas non plus


Qpointf centre = maptoscène (fenêtrePort () -> rect (). Centre ()); centeron (centre.x () - dx, centre.y ()); mettre à jour(); travaille, mais maintenant ma vue de dessus fait défiler plus lentement que ma vue de dessous, qui constitue un nouveau problème.


Si l'objectif est de suivre un ensemble de visualisation et de scène à une autre, et que les 2 scènes ont la même taille, je regarderais en dupliquant la transformation de la vue. Chaque fois que la vue de conduite change, définissez la vue pilotée pour avoir la même transformation.


Êtes-vous en train de dire que QGraphicsView fait toutes ses modifications via SetTransform () appelle-t-elle elle-même?


Essayé, aucun appel passe à settransform () sur les rouleaux.



2
votes

Avez-vous essayé d'utiliser les barres de défilement? Les cacher ne les rend pas inexistants et La documentation indique que vous devriez devoir Utilisez qscrollbar :: setValue pour faire défiler jusqu'à une position donnée.

Une autre option serait d'utiliser qgraphicsview :: centeron (qpointf) conjointement avec le point central actuel - comme vous avez également essayé - mais en calculant directement le point central dans votre Méthode ( Ne pas précalculer et stocker le point central ), en utilisant qgraphicsview :: MAPTOSCENE (int, int) : xxx

Veuillez noter que si vous avez, comme vous l'avez dit, comme vous l'avez dit". ScrollContentsBy (INT DX, INT DY) AVERTISIDED POUR EMIT HORIZONTSCROLL (DX) ", vous devez également appeler la méthode Super Class afin que la vue puisse se défiler: < / p> xxx


3 commentaires

J'appelle déjà la méthode Superclass, et lorsque la région QscrollBar est cachée, ils ne initialisent pas, alors qscrollbar :: SetValue n'entraîne aucun comportement. DX est soustrait parce que lors de l'ajout de DX Les rouleaux sont allés dans la direction opposée. Mon origine de la vue est (0,0) en haut à gauche, les nombres positifs entraînent une position plus basse dans la vue.


J'ai essayé votre méthode horizontalscroll (), il fait défiler mon point de vue ... et ensuite horizontalement dans la direction opposée que la vue émettrice fait défiler. changer sur ViewCenter + = qpointf (-1 * dx, 0); La définit dans la bonne direction, mais il est toujours en train de faire défiler vers le bas (je soupçonne que le Maptoscène () le cause).


Essayez ce qui suit: Supprimez la ligne d'addition de point et voyez ce qui se passe lorsque vous appelez horizonontalscroll (n'importe quoi) (ou voyez ce qui se passe lorsque vous appelez horizontalscroll (0) ). Le problème peut être: la largeur () / 2, la hauteur () / 2 est une division entière et des arrondis si la taille est impair. Définissez la taille à des chiffres même et réessayez, tout comme un test. Vous pouvez également essayer (largeur () + 1) / 2 afin d'arrondir au lieu de bas.



10
votes

J'ai travaillé avec qgraphicsview code> dans qt 4.6.3 - 4.7.2 et devez faire valoir que vous peut em> utiliser le qscrollbar code> De la manière suivante:

//graphics view initialization
QGraphicsView *graphicsView = new QGraphicsView(parent);
QGraphicsScene *scene = new QGraphicsScene(0,0,widthOfScene,heightOfScene,parent);
graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
graphicsView->setScene(scene);

//in another method
QScrollBar* yPos=graphicsView->verticalScrollBar();
yPos->setValue((int) newValue);


2 commentaires

Il se trouve que j'essayais de scollier.scroll () qui était à la fois une fonction de Qwidget publique héritée par une barre de défilement. En fin de compte, j'ai fini par synchroniser les fenêtres avec émettant / attraper cela-> horizontalscrollbar () -> valeur () et setValue ()


Très bonne réponse! Cela m'a simplement sauvé une tonne de temps.