2010-12-01 13 views
17

J'utilise QT pour développer une application UI riche.Comment définir la position absolue des widgets en qt

  1. J'ai besoin de placer des widgets à des positions absolues
  2. je devrais être en mesure de mettre le widget en arrière-plan/premier plan pour ajouter quelques effets.

Un exemple simple serait, je dois montrer une chaudière avec le niveau d'eau à l'intérieur du réservoir d'alimentation. Prenez une image de réservoir d'alimentation et incorporez-la dans une étiquette.

  1. Positionnez une barre de progression au centre du réservoir pour afficher le niveau d'eau.

Maintenant, dans ce cas, la barre de progression serait au premier plan et l'étiquette en arrière-plan.

Cordialement,

Répondre

25

Il vous suffit de créer votre widget, indiquer son QWidget parent puis l'afficher. Ne l'ajoutez pas à la mise en page parente, sinon vous ne pourrez pas le déplacer comme vous le souhaitez. N'oubliez pas d'indiquer son parent, sinon il sera affiché comme widget indépendant. Dans ces conditions, votre widget sera considéré comme un enfant du QWidget mais pas comme un membre de la mise en page du parent. Ce sera donc un enfant "flottant" et vous devez gérer son comportement lors du redimensionnement de QWidget par le parent.

30

Utilisez QWidget :: move() pour définir la position, QWidget :: resize() pour définir la taille et réimplémenter le gestionnaire resizeEvent() du parent si vous devez repositionner les widgets si leur parent est redimensionné.

+0

C'est bien, en effet :) – mlvljr

3

En plus des réponses par Patrice Bernassola et Frank Osterfeld l'ordre d'empilement peut être intéressant. Il correspond à l'ordre des enfants que vous obtenez par findChildren et les façons de manipuler la commande utilisent raise_ (avec le trait de soulignement), lower ou stackUnder.

Un exemple en changeant l'ordre avec chacune des 3 fonctions disponibles à l'aide PySide est ici:

from PySide import QtGui 

app = QtGui.QApplication([]) 

window = QtGui.QWidget() 
window.resize(400, 300) 
window.show() 

rA = QtGui.QLabel() 
rA.name='square' 
rA.resize(100, 100) 
rA.setStyleSheet('background-color:red;') 
rA.setParent(window) 
rA.show() 

text = QtGui.QLabel('text') 
text.name='text' 
text.setParent(window) 
text.show() 

# text was added later than rA: initial order is square under text 

rA.raise_() 
rA.lower() 
text.stackUnder(rA) 

children = window.findChildren(QtGui.QWidget) 
for child in children: 
    print(child.name) 

app.exec_() 
0

je le fais en créant une classe basée sur Qwidget mis sa position dans le constructeur

ex: QPointer a = new QWidget (0, posx, posy, largeur, hauteur)

dans le constructeur de ce Qwidgetclass ajouter ces integrers POSX, posy, largeur, hauteur, puis faire this.move (posx, posy); this.resize (largeur, hauteur);