web-dev-qa-db-fra.com

Comment définir la position absolue des widgets dans qt

J'utilise QT pour développer une application d'interface utilisateur riche. 

  1. J'ai besoin de positionner les widgets en positions absolues
  2. Je devrais pouvoir mettre le widget en arrière-plan/avant-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. 

  1. Prenez une image de réservoir d'alimentation et intégrez-la dans une étiquette.
  2. Placez une barre de progression au centre du bac d'alimentation 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,

18
chai

Il vous suffit de créer votre widget, d'indiquer son QWidget parent, puis de l'afficher.

Ne l'ajoutez pas à la mise en page parent, sinon vous ne pourrez pas le déplacer comme vous le souhaitez.

N'oubliez pas d'indiquer son parent sinon il sera affiché comme un widget indépendant.

Dans ces conditions, votre widget sera considéré comme un enfant du QWidget mais pas un membre de la présentation du parent. Ce sera donc un enfant "flottant" et vous devez gérer son comportement lors du redimensionnement de QWidget du parent.

25
Patrice Bernassola

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

32
Frank Osterfeld

En plus des réponses de Patrice Bernassola et Frank Osterfeld l’ordre d’empilement pourrait présenter un intérêt. Cela correspond à l'ordre des enfants que vous obtenez par findChildren et les manières de manipuler cet ordre utilisent raise_ (avec le tiret bas), lower ou stackUnder.

Voici un exemple de modification de l'ordre avec chacune des 3 fonctions disponibles à l'aide de PySide:

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_()
3
Trilarion

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

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

dans le constructeur de cette Qwidgetclass, ajoutez ces intégrateurs posx, posy, width, height puis faites this.move (posx, posy); this.resize (width, height);

0
Drl Sherif Omran