小部件在 GridLayout 中相互重叠

Posted

技术标签:

【中文标题】小部件在 GridLayout 中相互重叠【英文标题】:Widget overlap eachother in GridLayout 【发布时间】:2018-07-20 09:43:08 【问题描述】:

我正在尝试使用 GridLayout 创建一个简单的程序,QWidget 窗口内的所有小部件都会显示并正确缩放,但是 LineEdit 与窗口的标题 Label 重叠。

from PySide2 import QtWidgets, QtCore, QtGui
import sys

class SimGrid(QtWidgets.QWidget):
    def __init__(self):
        super(SimGrid, self).__init__()
        self.setWindowTitle("My attempt at Grid Layout")
        grid = QtWidgets.QGridLayout()
        self.setLayout(grid)

        title = QtWidgets.QLabel("This is some big sample text to fill up")
        title.setAlignment(QtCore.Qt.AlignHCenter)
        text_edit = QtWidgets.QTextEdit()
        success = QtWidgets.QPushButton("Success", self)
        cancel = QtWidgets.QPushButton("Cancel", self)

        grid.addWidget(title, 0, 0, 0, 0)
        grid.addWidget(text_edit, 1, 0, 1, 2)
        grid.addWidget(success, 4, 0)
        grid.addWidget(cancel, 4, 1)
        self.show()

【问题讨论】:

【参考方案1】:

根据docs,您正在使用以下方法:

void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment 对齐 = ...)

第三个和第四个参数分别表示将占用的数量和列,在您的情况下标题将占用0行和0列,这是不正确的。

使用这些标准,您想要的是以下内容:

import sys
from PySide2 import QtWidgets, QtCore, QtGui


class SimGrid(QtWidgets.QWidget):
    def __init__(self):
        super(SimGrid, self).__init__()
        self.setWindowTitle("My attempt at Grid Layout")
        grid = QtWidgets.QGridLayout()
        self.setLayout(grid)

        title = QtWidgets.QLabel("This is some big sample text to fill up")
        title.setAlignment(QtCore.Qt.AlignHCenter)
        text_edit = QtWidgets.QTextEdit()
        success = QtWidgets.QPushButton("Success", self)
        cancel = QtWidgets.QPushButton("Cancel", self)

        grid.addWidget(title, 0, 0, 1, 2)
        grid.addWidget(text_edit, 1, 0, 1, 2)
        grid.addWidget(success,2, 0, 1, 1)
        grid.addWidget(cancel,  2, 1, 1, 1)
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = SimGrid()
    w.show()
    sys.exit(app.exec_())

【讨论】:

成功了,你能告诉我为什么其中一个按钮比另一个大吗?并且 AlignCenter 也不工作。

以上是关于小部件在 GridLayout 中相互重叠的主要内容,如果未能解决你的问题,请参考以下文章

Qt Designer 使小部件在布局中与另一个小部件重叠

如何在kivy的gridlayout中使小部件跨越多个列/行

减少 PyQt5 中的间距 - GridLayout - 小部件之间

如何检查两个小部件是不是在颤动中重叠?

具有重叠子小部件的 Qt 自定义小部件

Python Tkinter Checkbutton 与其他小部件对齐