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

PyQt Python Discussion :

Graphique Qwt dans une fenêtre Qt existante


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut Graphique Qwt dans une fenêtre Qt existante
    Bonjour à toutes et à tous!
    J'ai besoin de mettre un graphique dans une fenêtre Qt déjà existante (qui contient des boutons, etc...) et pour cela vous l'aurez compris j'utilise le module python Qwt.
    J'ai fais un test pour voir si tout fonctionnait en sachant qu'il y aurait deux fenêtres séparées (la fenêtre principale et aussi le graphique dans une autre fenêtre).
    Voilà mon problème: Je n'arrive pas à trouver sur internet comment mettre mon graphique dans ma fenêtre principale et comment je pourrais changer sa taille et le positionner correctement comme une image.
    Est-ce que je dois utiliser un canvas?
    Une petite image pour illustrer tout cela:
    Nom : Screenshot_20180713_222729.png
Affichages : 2327
Taille : 181,8 Ko
    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Rien n'empêche de considérer une fenêtre de type Qwt comme un widget intégrable dans une fenêtre comme QWidget qui contient d'autres composants.

    Voilà un exemple:

    J'ai utilisé l'un des codes tests de pythonqwt: celui qui s'appelle "ReallySimpleDemo". Conformément à la doc, on exécute les tests avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from qwt import tests
    tests.run()
    Après avoir importé PyQt5, j'ai créé une fenêtre QWidget avec un bouton et la classe "SimplePlot" qui hérite de QwtPlot. Dans la fenêtre QWidget, j'ai intégré ces 2 objets graphiques avec un simple QGridLayout.

    Voilà le code que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    # -*- coding: utf-8 -*-
    #
    # Licensed under the terms of the PyQwt License
    # Copyright (C) 2003-2009 Gerard Vermeulen, for the original PyQwt example
    # Copyright (c) 2015 Pierre Raybaut, for the PyQt5/PySide port and further 
    # developments (e.g. ported to PythonQwt API)
    # (see LICENSE file for more details)
     
    SHOW = True # Show test in GUI-based test launcher
     
    import sys
    import numpy as np
     
    from qwt.qt.QtGui import QApplication, QPen
    from qwt.qt.QtCore import Qt
    from qwt import QwtPlot, QwtPlotMarker, QwtLegend, QwtPlotCurve, QwtText
     
    from PyQt5 import (QtWidgets, QtCore)
     
    class SimplePlot(QwtPlot):
        def __init__(self, *args):
            QwtPlot.__init__(self, *args)
            self.setTitle('ReallySimpleDemo.py')
            self.insertLegend(QwtLegend(), QwtPlot.RightLegend)
            self.setAxisTitle(QwtPlot.xBottom, 'x -->')
            self.setAxisTitle(QwtPlot.yLeft, 'y -->')
            self.enableAxis(self.xBottom)
     
            # insert a few curves
            cSin = QwtPlotCurve('y = sin(x)')
            cSin.setPen(QPen(Qt.red))
            cSin.attach(self)
            cCos = QwtPlotCurve('y = cos(x)')
            cCos.setPen(QPen(Qt.blue))
            cCos.attach(self)
     
            # make a Numeric array for the horizontal data
            x = np.arange(0.0, 10.0, 0.1)
     
            # initialize the data
            cSin.setData(x, np.sin(x))
            cCos.setData(x, np.cos(x))
     
            # insert a horizontal marker at y = 0
            mY = QwtPlotMarker()
            mY.setLabel(QwtText('y = 0'))
            mY.setLabelAlignment(Qt.AlignRight | Qt.AlignTop)
            mY.setLineStyle(QwtPlotMarker.HLine)
            mY.setYValue(0.0)
            mY.attach(self)
     
            # insert a vertical marker at x = 2 pi
            mX = QwtPlotMarker()
            mX.setLabel(QwtText('x = 2 pi'))
            mX.setLabelAlignment(Qt.AlignRight | Qt.AlignTop)
            mX.setLineStyle(QwtPlotMarker.VLine)
            mX.setXValue(2*np.pi)
            mX.attach(self)
     
            # replot
            self.replot()
     
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.resize(800, 600)
            self.setWindowTitle('Intégration Qwt dans QWidget')
     
            self.bouton = QtWidgets.QPushButton('Bouton', self)
            self.bouton.clicked.connect(self.clicbouton)
     
            self.demo = SimplePlot()
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            posit.addWidget(self.demo, 1, 0)
            self.setLayout(posit)
     
            self.encours = False
     
        def clicbouton(self):
            print("clic!")
     
    """
    def make():
        demo = SimplePlot()
        demo.resize(800, 500)
        demo.show()
        return demo
    """
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        fen.demo.exportTo("demo.png", size=(1600, 900), resolution=200)
        sys.exit(app.exec_())
    Et voilà ce que ça donne à l'affichage:

    Nom : qwtplot_test.jpg
Affichages : 2102
Taille : 99,2 Ko

  3. #3
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Merci de votre réponse!
    J'ai tester d'un côté le code que vous m'avez fournis et de l'autre l'essai d'intégration dans le mien et cela nous donne ça (Sans toutes les lignes superflus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import sys
    import numpy as np
    from PyQt5 import QtGui, QtCore
    from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QAction, QDesktopWidget, QComboBox, QLabel, QPushButton, QMessageBox, QGridLayout
    from qwt.qt.QtGui import QApplication, QPen
    from qwt.qt.QtCore import Qt
    from qwt import QwtPlot, QwtPlotMarker, QwtLegend, QwtPlotCurve, QwtText
     
    class SimplePlot(QwtPlot):
        def __init__(self, *args):
            QwtPlot.__init__(self, *args)
            self.setTitle('ReallySimpleDemo.py')
            self.insertLegend(QwtLegend(), QwtPlot.RightLegend)
            self.setAxisTitle(QwtPlot.xBottom, 'x -->')
            self.setAxisTitle(QwtPlot.yLeft, 'y -->')
            self.enableAxis(self.xBottom)
     
            # insert a few curves
            cSin = QwtPlotCurve('y = sin(x)')
            cSin.setPen(QPen(Qt.red))
            cSin.attach(self)
            cCos = QwtPlotCurve('y = cos(x)')
            cCos.setPen(QPen(Qt.blue))
            cCos.attach(self)
     
            # make a Numeric array for the horizontal data
            x = np.arange(0.0, 10.0, 0.1)
     
            # initialize the data
            cSin.setData(x, np.sin(x))
            cCos.setData(x, np.cos(x))
     
            # insert a horizontal marker at y = 0
            mY = QwtPlotMarker()
            mY.setLabel(QwtText('y = 0'))
            mY.setLabelAlignment(Qt.AlignRight | Qt.AlignTop)
            mY.setLineStyle(QwtPlotMarker.HLine)
            mY.setYValue(0.0)
            mY.attach(self)
     
            # insert a vertical marker at x = 2 pi
            mX = QwtPlotMarker()
            mX.setLabel(QwtText('x = 2 pi'))
            mX.setLabelAlignment(Qt.AlignRight | Qt.AlignTop)
            mX.setLineStyle(QwtPlotMarker.VLine)
            mX.setXValue(2*np.pi)
            mX.attach(self)
     
            # replot
            self.replot()
     
    class MainWindow(QMainWindow):
    	def __init__(self):
    		self.labelProfiles = QLabel("Profiles", self)
    		self.labelProfiles.setText("List of printer profiles:")
    		self.labelProfiles.move(10, 35)
    		self.labelProfiles.resize(200, 20)
     
     
    		posit = QGridLayout()
    		posit.addWidget(self.demo, 1, 0)
    		self.setLayout(posit)
     
    		self.encours = False
     
     
    #Lancer la Fenêtre
    app = QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())
    Et ce code me donne ça:
    Nom : Screenshot_20180713_222729.png
Affichages : 1930
Taille : 30,3 Ko
    Avez-vous une solution?

    PS: Dans le terminal j'ai cette erreur: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
    Mais la fenêtre se lance quand même...

    Merci d'avance!

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par BlackoOSX Voir le message
    PS: Dans le terminal j'ai cette erreur: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
    Mais la fenêtre se lance quand même...
    Il y a 2 pb dans ton code:

    création du self.demo (voir dans mon code):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.demo = SimplePlot()
    L'intégration de widgets dans un QMainWindows ne marche pas de la même façon que dans un QWidget, parce que QMainWindow est un QWidget complexe qui a déjà des composants intégrés. Voilà ce qu'il faut faire dans ton cas, mais adapté à mon code précédent (tu feras la conversion en fonction de ton code):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            self.setCentralWidget(QtWidgets.QFrame())
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            posit.addWidget(self.demo, 1, 0)
            self.centralWidget().setLayout(posit)
    Et tu peux effacer la ligne "self.encours = False" qui vient d'une application antérieure et qui n'a rien à faire ici.

  5. #5
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Le problème c'est que j'ai appris à faire mes applications Qt avec un QMainWindow et avec un QtWigets et ce ne sont pas du tout les mêmes librairies...
    J'ai essayé d'adapter mon code à ce type de fenêtre sauf que je suis bloqué pour un simple petit menu.
    Le problème c'est que tous les tutos (en tout cas que j'ai trouvé utilisent tous un QMainWindow...
    Est-ce totalement obligé d'utiliser un QWigets pour pouvoir utiliser Qwt correctement?
    Sinon est-ce que je ne pourrais pas passer par d'autres librairies comme mathplotlib?
    Merci d'avance!

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    On ne te dit pas de ne pas utiliser un QMainWindow mais que tu dois d'abord y mettre un centralWidget et c'est dans celui-là que tu places tous tes autres widgets.
    Si tu crées ta fenêtre avec le Designer tu n'auras pas autre chose que cela.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 30/08/2008, 13h33
  2. Couleur du texte dans une fenêtre graphique
    Par luilui dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/06/2008, 23h02
  3. Réponses: 5
    Dernier message: 19/05/2008, 20h58
  4. Réponses: 9
    Dernier message: 09/03/2006, 18h59

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