IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[QT4] QGraphicsView :: paintEvent


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut [QT4] QGraphicsView :: paintEvent
    Bonjour,

    J'ai récemment découvert la classe QGraphicsView. J'ai donc changé un peu mes classes et certains héritent maintenant de QGraphicsView.

    Par contre, le paintEvent ne fonctionne plus, bien qu'il compile ...
    J'obtiens toujours le même fond blanc alors que j'ai dessiné des rectangles/traits dans le paintEvent.

    QGraphicsView hérite pourtant de QWidget ... Je suis donc assez perplexe, si quelqu'un peut m'aider ... Merci.

  2. #2
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Salut, moi j'ai testé très rapidement le composant il y a deux jours. J'ai d'abord commencé à regarder la doc qui dit :

    QGraphicsScene scene;
    scene.addText("Hello, world!");

    QGraphicsView view(&scene);
    view.show();
    Bien évidemment, ça ne donne rien. Alors il me semble que j'ai regardé des exemples par ci par là et que j'ai fait autrement.
    J'ai un QGraphicsView posé sur une fiche avec un bouton, et lorsque je clique sur mon bouton, je charge une image et je l'affiche.

    Donc, comme toujours j'ai une classe testQGraphicsScene qui hérite de QMainWindow, et dont un membre est un QGraphicsScene :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class testQGraphicsScene : public QMainWindow
    {
    	Q_OBJECT
    public:
    	testQGraphicsScene(QWidget *parent = 0, Qt::WFlags flags = 0);
    	~testQGraphicsScene();
    public slots:
    	void createScene();
    private:
    	Ui::testQGraphicsSceneClass ui;
    	QGraphicsScene *scene;
    };
    voilà le constructeur de cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    testQGraphicsScene::testQGraphicsScene(QWidget *parent, Qt::WFlags flags)
    	: QMainWindow(parent, flags)
    {
    	ui.setupUi(this);
    	connect(ui.pushButton, SIGNAL(clicked()),this,SLOT(createScene()));  // relier le bouton au slot
    }
    et enfin voilà le code du slot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void testQGraphicsScene::createScene()
    {
    	QRectF bounds(ui.graphicsView->sceneRect());  // récupere le rectangle de tracé du QGraphicsView
    	scene = new QGraphicsScene(bounds,ui.graphicsView); // creer une nouvelle scene
    	ui.graphicsView->setScene(scene); // affecter la scene
    	scene->addPixmap(QPixmap("C:\\Documents and Settings\\mli\\Bureau\\Temp\\montagne2.jpg"));
    	scene->addText("Hello Michel!");
    	ui.centralWidget->show();
    }

    voilà, j'ai donc mon image qui est affichée (l'image etant plus grosse que les dimensions du QGraphicsView, les scrollbar apparaissent toutes seules. j'ai fait un test avec du texte et avec une image, çà fonctionne.

    en résumé, je pense que tu dois faire tes dessins avec les methodes fournies par le QGraphicsScene.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    Salut ok merci.

    Mais une petite question, j'aurais un background dessiné avec des traits/rectangles et j'aurais une liste de Widgets sous forme de GridLayout (un peu comme l'exemple EmbeddedDialogs).

    J'ai vu la méthode : QGraphicsScene::drawBackground ( QPainter * painter, const QRectF & rect )
    Mais comment puis-je avoir le painter ?! Avec un QGraphicsScene::paintEvent ?!

  4. #4
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    non, pas vraiment avec la methode paint event.

    (j'ai pas trouvé l'exemple embedded dialogs).

    la documentation donne :

    void QGraphicsScene::drawBackground ( QPainter * painter, const QRectF & rect ) [virtual protected]
    Draws the background of the scene using painter, before any items and the foreground are drawn. Reimplement this function to provide a custom background for the scene.
    All painting is done in scene coordinates. The rect parameter is the exposed rectangle.
    If all you want is to define a color, texture, or gradient for the background, you can call setBackgroundBrush() instead.
    See also drawForeground() and drawItems().
    .

    il faut que tu réimplémentes cette fonction, autrement dit que tu la redéfinisses et tu as bien saisi l'utilité qui est de te dessiner toi même ton background.
    Dans le corps de cette fonction, tu devras donc appeler les methodes du QPainter pour tracer tes lignes tes rectangles et tout ça.

    plus concretement, tu crees un QPainter *monPainter et un QRectF RectangleZoneDeDessin.
    Puis tu fixes certaines propriétés (pinceau, crayon ...) de monPainter du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    monPainter.setRenderHint(QPainter::Antialiasing, true);
    monPainter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
    monPainter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    pour le rectangle tu lui donnes la largeur et la hauteur de ton QGraphicsView.

    Puis tu appelles ta fonction QGraphicsScene::drawBackground en lui donnant le painter et le rectangle décrit ci dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGraphicsScene::drawBackground(monPainter,  RectangleZoneDeDessin)
    dans la réimplémentation de void QGraphicsScene::drawBackground ( QPainter * painter, const QRectF & rect ) tu peux faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void QGraphicsScene::drawBackground ( QPainter * painter, const QRectF & rect )
    {
         painter.drawEllipse(50, 50, 700, 900);
         painter.drawRect(10.0,20.0,80.0,60.0);
    }

    voilà, mes exemples ne sont pas syntaxiquement corrects mais l'idée principale est :

    Creer un QPainter et regler ses proprietes principales
    Creer un QRectF de preference aux dimensions de ton QGraphicsView (je suppose que c'est dedans que tu vas dessiner)
    reimplementer drawBackground(...) (note, elle est virtual protected, il faut donc que tu crees une classe qui herite de QGraphicsScene)
    faire tes dessins

    voilà, j'espere ne pas t'avoir dit trop d'âneries, parce que moi je suis encore un noob

Discussions similaires

  1. [Graphics View] paintEvent() de QGraphicsView et dessin dans la scène
    Par betsprite dans le forum Débuter
    Réponses: 1
    Dernier message: 23/05/2012, 11h34
  2. [Qt4] Linker error (vtable)
    Par titus55 dans le forum Qt
    Réponses: 7
    Dernier message: 23/05/2007, 10h04
  3. Problème avec paintEvent()
    Par Mast3rMind dans le forum Qt
    Réponses: 2
    Dernier message: 23/02/2006, 17h39
  4. Visual 2005 & Qt4 Opensource
    Par chkpos dans le forum MFC
    Réponses: 3
    Dernier message: 08/02/2006, 18h08
  5. Réponses: 1
    Dernier message: 28/11/2005, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo