一个小部件相对于另一个小部件的位置问题

时间:2020-06-16 13:13:23

标签: python pyside2

我正在尝试制作GUI,但在小部件定位方面遇到了麻烦。我想将一个小部件(A)的位置与在GridLayout中添加的另一个小部件(B)的位置联系起来。因此,主要思想是:A.pos()= B.pos()+ DELTA。

详细信息:

让我们使用带有包含四个Qlabel的QGridLayout的QWidget:

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 :(得分:0)

如果我怀疑是要在其中一个网格元素的左上角放置QLineEdit,那么您可以利用...

  1. QGridLayout允许将多个项目添加到同一单元格。
  2. 它还允许您add a QLayout进入单元格。

首先,创建一个继承自QGridLayout的类,除了向单元格(0,0)中添加QLineEdit并向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_())

现在您的代码将类似于...

NSDate

以上结果如下...

enter image description here