Проблема с позиционированием одного виджета относительно позиции другого - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь сделать GUI и у меня проблемы с позиционированием виджета. Я хотел бы изменить ie позицию одного виджета (A) на позицию другого (B), который добавлен в GridLayout. Итак, основная идея: A.pos () = B.pos () + DELTA.

Подробно:

Пусть у нас будет такой QWidget с QGridLayout, содержащий четыре Qlabels:

import sys
from PySide2.QtWidgets import*
from PySide2.QtGui import*
from PySide2.QtCore import*

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(500, 300)   

    lab1 = QLabel("label1")
    lab2 = QLabel("label2")
    lab3 = QLabel("label3")
    lab4 = QLabel("label4")

    lay = QGridLayout()    
    lay.addWidget(lab1,0,0)
    lay.addWidget(lab2,0,1)
    lay.addWidget(lab3,1,0)
    lay.addWidget(lab4,1,1)

    w.setLayout(lay)
    w.show()

    sys.exit(app.exec_())

Экран GUI здесь

Итак, я хотел бы создать QLineEdit, который будет размещен прямо над lab4 и пытается реализовать что-то вроде:

le = QLineEdit(w)
le.setGeometry(QRect(lab4.pos().x(),lab4.pos().y()+10,20,20))

Но если сделать print (lab4.pos (). X (), lab4.pos (). Y ()), он напечатает (0,0) ... и мой GUI будет выглядеть вот так

Но я хочу, чтобы он выглядел так

Пожалуйста, помогите мне правильно настроить мой виджет. Как вы заметили, я пишу на PyQT, но если вы ответите мне на C ++ QT, я тоже буду благодарен!

1 Ответ

0 голосов
/ 16 июня 2020

Если, как я подозреваю, намерение состоит в том, чтобы поместить QLineEdit в верхнем левом углу одного из элементов сетки, вы можете воспользоваться тем фактом, что ...

  1. QGridLayout позволяет добавлять несколько элементов в одну ячейку.
  2. Также позволяет добавлять QLayout в ячейку.

Во-первых, создайте класс, который наследуется от QGridLayout и на самом деле ничего не делает, кроме добавления QLineEdit к ячейке (0, 0) и растяжения справа и ниже QLineEdit ...

class line_edit_overlay(QGridLayout):
    def __init__(self):
        super(line_edit_overlay, self).__init__()
        self.line_edit = QLineEdit()
        self.addWidget(self.line_edit, 0, 0);
        self.setRowStretch(1, 1);
        self.setColumnStretch(1, 1);

Теперь ваш код будет примерно таким ...

import sys
from PySide2.QtWidgets import*
from PySide2.QtGui import*
from PySide2.QtCore import*

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(500, 300)   

    lab1 = QLabel("label1")
    lab2 = QLabel("label2")
    lab3 = QLabel("label3")
    lab4 = QLabel("label4")

    lay = QGridLayout()    
    lay.addWidget(lab1,0,0)
    lay.addWidget(lab2,0,1)
    lay.addWidget(lab3,1,0)
    lay.addWidget(lab4,1,1)

    w.setLayout(lay)

    # Added the following.  Note the calls to lay.setRowStretch(...)
    # and lay.setColumnStretch(...) which seem to be required to
    # maintain even grid sizing.
    for row in range(0, lay.rowCount()):
        lay.setRowStretch(row, 1)
    for col in range(0, lay.columnCount()):
        lay.setColumnStretch(col, 1)
    lay.addLayout(line_edit_overlay(), 1, 1)

    w.show()

    sys.exit(app.exec_())

Результатом выше будет следующее ...

enter image description here

...