首页 > 解决方案 > 一个小部件相对于另一个小部件位置的定位问题

问题描述

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

详细地:

让我们有这样的 QWidget 和包含四个 Qlabel 的 QGridLayout:

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))

但是如果 make print(lab4.pos().x(), lab4.pos().y()) 它将打印 (0,0)... 我的 GUI 看起来像这样

但我希望它看起来像这样

请帮我正确设置我的小部件。正如您所注意到的,我使用 PyQT 编写代码,但如果您使用 C++ QT 回答我,我也将不胜感激!

标签: pythonpyside2

解决方案


如果,正如我所怀疑的那样,目的是将 aQLineEdit放在其中一个网格元素的左上角,那么您可以利用以下事实......

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

首先,创建一个继承自的类,QGridLayout实际上只添加一个QLineEdit到 cell(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_())

上面的结果如下......

在此处输入图像描述


推荐阅读