python - 一个小部件相对于另一个小部件位置的定位问题
问题描述
我正在尝试制作一个 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 回答我,我也将不胜感激!
解决方案
如果,正如我所怀疑的那样,目的是将 aQLineEdit
放在其中一个网格元素的左上角,那么您可以利用以下事实......
QGridLayout
允许将多个项目添加到同一个单元格。- 它还允许您将 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_())
上面的结果如下......
推荐阅读
- amazon-web-services - Amazon SES 异常:IAM 用户无权对资源执行“ses:SendRawEmail”
- angular - 单击 ngx-leaflet 中的标记后,材质对话框未打开
- docker - docker module.js:550 抛出错误;^
- django - 允许 Django admin.site.register 接受超过 3 个参数
- javascript - 如何使用 react 和 typescript 在可重用组件中修复对象可能是未定义的错误?
- java - 如何制作具有准确边框的圆形 imageButton?
- c++ - TCP/IP 服务器代码在包含附加库后停止工作
- python - IndexError:在while循环中列出索引超出范围
- jquery - 添加自定义按钮后,如何更新购物车总数?
- php - PHP表单循环仅提交最后一个值或所有值