【问题标题】:Empty spaces between Widgets even with setSpacing(0)即使使用 setSpacing(0),小部件之间也有空格
【发布时间】:2023-03-14 00:45:01
【问题描述】:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

data = {'dia': 23, 'mes': 8, 'ano': 2017}

class FormConfigBkpBD(QWidget):

    senha = None
    pathLine = None

    def __init__(self, parent=None,instancia=None):
        super(FormConfigBkpBD, self).__init__(parent)

        mainLayout = QVBoxLayout()

        mainLayout.setSpacing(0)
        mainLayout.setContentsMargins(0, 0, 0, 0)

        self.senha = QLineEdit()
        self.senha.setEchoMode(QLineEdit.Password)
        self.senha.setFixedSize(385, 25)

        self.pathLine = QLineEdit()
        self.pathLine.setFixedSize(355,25)

        self.senha.setContentsMargins(0,0,0,0)
        self.pathLine.setContentsMargins(0,0,0,0)

        mainLayout.addWidget(self.pathLine,0,Qt.AlignTop)
        mainLayout.addWidget(self.senha,0,Qt.AlignTop)

        self.setWindowTitle("Configuração de Backup - Banco de Dados")
        self.setFixedSize(460,640)
        self.setLayout(mainLayout)


def main():

    app = QApplication(sys.argv)

    bd = FormConfigBkpBD()
    bd.show()

    app.exec()


if __name__ == "__main__" :

    main()

上面的代码只显示了两个小部件(QLineEdit),原来的窗口有更多的小部件,这里仅用于发布。 为什么即使使用setSpacing(0)setContentsMargins(0,0,0,0),小部件之间也有空格?

【问题讨论】:

    标签: python qt layout pyqt


    【解决方案1】:

    这是因为您的窗口的固定大小和您正在使用的布局之间的组合。垂直布局尝试垂直均匀分布(除非另有说明)其所有子级并填充整个窗口。

    这里有两个小部件,所以第一个放在第一个单元格中,第二个放在第二个单元格中。由于您尚未设置任何对齐方式,因此存在默认行为,即每个单元格的左上角是小部件所在的位置。其余的只是填充布局所在的父窗口的空闲空间。

    如果您不想在小部件之间留出空间

    • 要么去掉固定大小的窗口

    • 或在布局中放置更多小部件,直到“满”为止。

    第一个选项可能不是您想要做的(否则您可能一开始就不会将其设置为固定大小)。第二个可以通过简单地使用QSpacerItem(垂直的)来实现,它将为您处理空白空间并将小部件推到您希望它们所在的顶部:

    mainLayout.addStretch(1)
    

    如果您需要对其行为进行更多控制,您也可以手动添加间隔:

    self.spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) # or Fixed
    mainLayout.addItem(self.spacer)
    

    【讨论】:

    • 对齐方式设置为 - AlignTopQVBoxLayout 的默认对齐方式实际上是 AlignVCenter)。我认为 OP 期望 both 小部件与窗口顶部对齐(而不是它们各自单元格的顶部,每个单元格都占总高度的一半)。在顶部对齐它们的正确方法是在布局的末尾添加一个分隔符(即mainLayout.addStretch()) - 这样就不需要显式设置对齐方式。
    • 是的,伙计,@ekhumoro,我把 addStretch() 放在项目的末尾,一切正常,但是现在,如果我在任何小部件中将边距放在顶部或底部,他可以缩小甚至如果边距太高就会消失。有什么办法处理吗?
    • 抱歉,我错过了AlignTop。 @JardelMatias 看到我的更新(最后一段)。您可以使用QSpacerItem 将两行编辑“推”到顶部。
    • @ekhumoro 啊,您还建议使用垫片。对不起,我只看了你评论的前两句话。 :D
    • @JardelMatias。小部件边距影响其内容,而不是其周围的空间。要在小部件上方或下方添加空间,请使用布局间距/边距,或插入固定大小的间隔。
    猜你喜欢
    • 2021-05-07
    • 2018-07-30
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多