Как установить абсолютную позицию виджетов в qt - PullRequest
18 голосов
/ 02 декабря 2010

Я использую QT для разработки приложения с богатым пользовательским интерфейсом.

  1. Мне нужно расположить виджеты на абсолютных позициях
  2. Я должен иметь возможность разместить виджет в фоновом режиме / на переднем плане, чтобы добавить несколько эффектов.

Простой пример: я должен показать котел с уровнем воды внутри питающего резервуара.

  1. Сфотографируйте резервуар подачи и вставьте этикетку.
  2. Установите индикатор выполнения в центре резервуара для отображения уровня воды.

Теперь в этом случае индикатор выполнения будет на переднем плане, а метка на заднем плане.

С уважением,

Ответы [ 4 ]

34 голосов
/ 02 декабря 2010

Используйте QWidget :: move (), чтобы установить позицию, QWidget :: resize (), чтобы установить размер и переопределить родительский обработчик resizeEvent (), если вам нужно переместить положение виджетов, если их родительский размер изменится.

26 голосов
/ 02 декабря 2010

Вам просто нужно создать свой виджет, указать его родительский QWidget и затем отобразить его.

Не добавляйте его в родительский макет, иначе вы не сможете переместить его так, как хотите.

Не забудьте указать его родителя, иначе он будет отображаться как независимый виджет.

В этих условиях ваш виджет будет считаться дочерним элементом QWidget, но не членом макета родителя.Таким образом, это будет «плавающий» дочерний элемент, и вы должны управлять его поведением при изменении размера родительского QWidget.

3 голосов
/ 23 июня 2014

В дополнение к ответам Патрис Бернассола и Фрэнк Остерфельд порядок размещения может представлять интерес.Это соответствует порядку дочерних элементов, которые вы получаете на findChildren, и способы управления порядком используют raise_ (с последующим подчеркиванием), lower или stackUnder.

Примеризменить порядок с каждой из 3 доступных функций с помощью 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_()
0 голосов
/ 31 марта 2017

Я делаю это, создавая класс на основе Qwidget, помещая его позицию в конструктор

ex: QPointer a = new QWidget (0, posx, posy, width, height)

вконструктор этого класса Qwidget добавляет эти целые числа posx, posy, width, height и затем делает this.move (posx, posy);this.resize (ширина, высота);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...