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

Discussion :

Ajout de widget dans un QFrame

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut Ajout de widget dans un QFrame
    Bonjour,
    j'essaie actuellement de faire une petite IHM qui permettrait de mettre à jour une visualisation quand on click sur une action.

    En clair, j'ai un QMdiSubWindow dans lequel j'ai mis un Qframe (ce n'est pas obligatoire). Dans un premier temps, ce Qframe est vide. J'ai une action appelée Ajout Parametre (en s'en fout du nom c'est vrai ) et j'aimerais que celle-ci ajoute un QPlainText par exemple lorsqu'on clic dessus.

    Je n'ais pas de problème en ce qui concerne les actions mais je n'arrive pas à mettre à jour mon Qframe pour visualiser le Qplaintext lorsque j'en ajoute un.

    Faut-il que je supprime ma fenetre QSubWindow et que j'en recrée un derrière avec mon QplainText (car quand je l'ajoute avant de creer ma fenetre il est bien là).

    D'ailleur je ne veut pas forcement ajouter un QplainText main juste un rectangle ou je puisse ecrire des choses (sans pour autant pouvoir l'éditer, mais l'ecrire avec mon code).

    PS : quand j'utilise un Layout à la place de mon Qframe, j'arrive à ajouter un widget avec mon action mais ce n'est pas franchement la mise en page que je souhaite.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Par défaut
    Est-ce que tu pense à rafraichir ta QFrame (via update() ) ?
    Detruire pour reconstruire après n'est sûrement pas nécéssaire en tout cas

    Sinon, as-tu regardé QTextEdit ? Tout dépend de ce que tu veut en faire, à vrai dire

    P.S. Pour les layout, c'est casse-gueule au début car ça fait jamais ce qu'on veut. Pis un moment faut s'y mettre et on peut plus s'en passer. Essaye pas le grid layout qui n'est vraiment necessaire que dans des cas particuliers mais avec des combinaisons de Vertical Layouts, Horizontal Layouts et les Spacers, tu fait à peu près tout.
    Et au final, t'est toujours gagnant car une fenêtre qui fait toujours la même taille, ça n'existe pas ! Et qu'avec les layouts, tu auras toujours la même présentation.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Déjà merci pour les conseils. J'ai essayé update() ainsi que QtextEdit mais rien n'arrive.

    En fait je voudrais vraiment des objets statiques qui ne changent pas de taille si on modifie la fenetre et qui ne soit pas même pas editables, je voudrais juste recupérer un signal quand on clic dessus. Aprés je mettrais une fonction zoom ou un truc comme ça.

    A la limite je vais peut etre regarder au niveau du Qpainter, mais j'ai peur de ne rien pouvoir ecrire dans mes rectangles...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    En réflechissant mieux, je pense que ce quil faudrait c'est des images sur lesquels je puisse mettre un label.

    Donc je resume:

    Je souhaiterais avoir un QMdiSubwindow dans lequels je mets une Qframe (ou autre chose). A chaque appel d'une action je souhaiterais ajouter une image dans cette frame que je positionne de maniere absolue (x,y), sur laquel je puisse ecrire un label (non éditable). De plus l'image (ou le label) doit retourner un signal quand on clic dessus.

    Je vais essayer ça (tous au moins d'ajouter une image) mais il me semble que je vais toujours avoir le problème de frame qui ne s'update pas...

    Edit:
    Pour les images, j'utilise donc un label + setPixmap.
    Apparement il faudrait réimplémenter l'event paintEvent( QPaintEvent*) pour que la frame soit mise à jour. Mais je ne sais pas ce que ça veut dire. En plus j'utilise PyQt...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Par défaut
    Je ne connait pas du tout Python (le système est donc peut-être différend).

    Sinon:
    En fait je voudrais vraiment des objets statiques
    Attention, statique peut vouloir dire quelque-chose de complètement différend suivant le contexte, ...

    De plus l'image (ou le label) doit retourner un signal quand on clic dessus
    2 possibilités ici, car les labels n'émettent pas de signal clicked():
    -> Tu utilise des boutons dont tu met la propriété "flat" à true et tu utilise setText pour le texte et setIcon (si ton image est toujours de taille fixe) pour ton image.
    -> Vu que tes widgets ne bougent pas, tu peut réimplémenter mousePressEvent qui te donne la position de la souris lors de son appel. Tu pourra alors comparer la position de la souris avec les zones occupées par tes widgets et déterminer si la souris a cliqué sur un de tes widgets.

    P.S. Tient, je pense à un truc: si tu n'utilise pas de layout, est-tu sûr que ta frame ou ton label sont bien à l'intérieur de ta fenêtre et qu'ils ont une taille plus grande que 0 sur les 2 axes ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Le boutton c'est une bonne idée, merci.

    En fait je sais que mon label est bien créé car quand je l'implente avant d'ouvrir la fenetre tous va bien, mais quand je l'implente (le même) aprés la création de la fenetre ça ne marche pas.

    Par contre je suis débutant en programmation et j'ai du mal à comprendre ce que veut dire réimplanter (en terme de codage) un evennement.

    Je vais bien trouver un exemple si je cherche bien. Merci

    Edit:

    Alors je m'approche de la solution mais je suis encore bloqué

    En l'occurence je pense que je suis obligé de passer par un QPainter pour faire ce que je veux (drawPixmap+drawText)

    Voici deux fonctions dans la classe de mon Qframe
    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
     
    class Frame_project(QtGui.QFrame):     
     
        def __init__(self, parent):
            self.i=0
            QtGui.QFrame.__init__(self, parent)
            self.setWindowTitle('Draw Text')
            self.text = 'set this text'     
     
        #  def My_event(self):
        def paintEvent(self, event):
            self.qp = QtGui.QPainter()
            self.qp.begin(self)        
            self.drawText(self.qp)
            self.qp.end()
     
        def drawText(self, qp):   
            self.i+=10
            i=self.i
            qp.setPen(QtGui.QColor(168, 34, 3))
            qp.setFont(QtGui.QFont('Decorative', 10))
            qp.drawText(QtCore.QRect(0+i, 0+i, 951+i, 811+i), QtCore.Qt.AlignCenter, self.text)
    Quand il y a un paintEvent mon texte est bien ecrit.
    Par contre quand je met une fonction normale (dans l'exemple My_Event() )à la place de paintEvent, et que je l'appelle depuis ma mainwindow j'obtient les erreurs:
    QPainter::begin: Paint device returned engine == 0, type: 1
    QPainter::setPen: Painter not active
    QPainter::setFont: Painter not active
    QPainter::end: Painter not active, aborted

    Et là je ne comprend pas pourquoi...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Ca y est j'ai résolu mon problème:

    Je creé une classe spécifique pour mon QWidget dans lequel je veux dessiner.

    Je définie la fonction paintEvent dans la classe de ce Widget (en effet, le QPainter n'est actif que lors d'un paintEvent et un QPainter ne peut dessiner que pour self - ou this en C++ - ).

    Le QPainter dessine à chaque appel de painEvent donc l'ensemble des informations du dessin est mise en mémoire pour etre redesiné à chaque fois. De plus, une fonction spécifique dans ma classe Projet (MyEvent) permet de rapeller le paintEvent de mon Widget quand je veut grace à repaint().

    C'est surement ce qu'on appel réimplanter un evenement... Enfin je ne sais pas mais ça donne bien ce que je voulais.

    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
    class Ui_Projet(QtGui.QMdiSubWindow):   
     
        def __init__(self, parent=None):
     
            QtGui.QMdiSubWindow.__init__(self, parent)
     
            self.setStyleSheet(_fromUtf8("background:white;"))
            self.setObjectName(_fromUtf8("Projet"))
     
            self.ScrollArea_Projet = QtGui.QScrollArea(self)
            self.ScrollArea_Projet.setWidgetResizable(True)
            self.ScrollArea_Projet.setObjectName(_fromUtf8("ScrollArea_Projet"))
     
            self.ScrollArea_Projet.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.ScrollArea_Projet.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) 
     
            self.H_LayoutProjet_1 = QtGui.QHBoxLayout(self.ScrollArea_Projet)
            self.i=0
     
            self.ScrollArea_Projet_Widget = ScrollContent()
            # self.ScrollArea_Projet_Widget = QtGui.QWidget()
            # self.ScrollArea_Projet_Widget.setObjectName(_fromUtf8("ScrollArea_Projet_Widget")) 
     
            self.H_LayoutProjet_1.addWidget(self.ScrollArea_Projet_Widget) 
     
            self.ScrollArea_Projet.setWidget(self.ScrollArea_Projet_Widget)
     
            self.setWidget(self.ScrollArea_Projet) 
            self.resize(600,600)         
     
        def MyEvent(self):
            self.i+=10
            line=QtCore.QLine(10,10+self.i,30,30)
            self.ScrollArea_Projet_Widget.draw=1
            self.ScrollArea_Projet_Widget.LineList.append(line)
            self.ScrollArea_Projet_Widget.repaint()
     
    class ScrollContent(QtGui.QWidget):
        def __init__(self, parent=None):    
            QtGui.QWidget.__init__(self, parent)
            self.setObjectName(_fromUtf8("ScrollArea_Projet_Widget"))         
            self.LineList=[]
            self.draw=0
     
        def paintEvent(self,event):
            self.qp=QtGui.QPainter(self)
            self.qp.setPen(QtGui.QColor("black"))
            for line in self.LineList:
                self.qp.drawLine(line)
            self.draw=0
            self.qp.end()

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

Discussions similaires

  1. [Qt Designer] Afficher différents widgets dans une QFrame
    Par dida_plt dans le forum Outils
    Réponses: 2
    Dernier message: 24/03/2012, 23h51
  2. [Visual Studio] Ajouter un widget perso dans le designer
    Par guillaume07 dans le forum EDI
    Réponses: 6
    Dernier message: 28/10/2009, 15h39
  3. Ajouter des widgets GWT dans une simple application Web
    Par lanwer dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 30/03/2009, 18h50
  4. Ajout Widget dans QTableWidget
    Par Somato dans le forum Qt
    Réponses: 1
    Dernier message: 01/07/2008, 17h02

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