阻止小部件彼此重叠并在它们之间添加空间

时间:2019-01-19 15:28:36

标签: python pyqt pyqt5 qlayout

我正在使用QHBoxLayout进行布局。细目是:发生的事情是pic.1,我想要的是pic.2-小部件不重叠,并且它们之间存在间隙。对于图2,我创建了一个Gap小部件,以使其介于现有小部件之间。但这是一个麻烦的解决方案,需要额外的维护(尤其是当我要处理两个以上的小部件时)。而且,由于B与A重叠,所以我认为新添加的间隙控件也与A重叠,可能是根据其大小的一部分。我对此不太确定。

pic 1

pic 2

我尝试使用self.layout.addSpacing(10),但这不起作用。红色小部件会从其之前的位置偏移10个像素,而不是从左侧的小部件的边界偏移。

还请注意,所包含的小部件都将具有一些最小宽度规范。

那么,如何在图2中的两个小部件之间添加空格?

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Gap(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setMinimumWidth(10)
        self.setMinimumHeight(1)

class Line(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=parent)

        # Set layout

        self.layout = QHBoxLayout()
        self.setLayout(self.layout)

        # Set palette

        self.palette1 = QPalette()
        self.palette1.setColor(QPalette.Window, Qt.red)

        self.palette2 = QPalette()
        self.palette2.setColor(QPalette.Window, Qt.blue)

        self.palettebg = QPalette()
        self.palettebg.setColor(QPalette.Window, Qt.green)
        self.setAutoFillBackground(True)
        self.setPalette(self.palettebg)

        # Set labels

        self.label1 = QLabel(self)
        self.label1.setText("A")
        self.label1.setStyleSheet('font-size: 36pt;')
        self.label1.adjustSize()
        self.label1.setAutoFillBackground(True)
        self.label1.setPalette(self.palette1)
        self.label1.setMinimumSize(36, 36)

        self.label2 = QLabel(self)
        self.label2.setText("B")
        self.label2.move(30, 0)
        self.label2.setStyleSheet('font-size: 36pt;')
        self.label2.adjustSize()
        self.label2.setAutoFillBackground(True)
        self.label2.setPalette(self.palette2)
        self.label2.setMinimumSize(36, 36)

        self.gap = Gap()

        self.layout.addWidget(self.label1)
        # self.layout.addWidget(self.gap)
        # self.layout.addSpacing(10)
        self.layout.addWidget(self.label2)

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5'
        self.left = 10
        self.top = 10
        self.width = 200
        self.height = 54
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.line = Line(self)
        self.line.resize(74, 54)
        self.line.move(50, 50)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)

    # CUSTOM
    app.setFont(QFontDatabase().font("Monospace", "Regular", 14))

    ex = App()
    sys.exit(app.exec_())
根据要求进行

EDIT 澄清:(1)假设父窗口小部件的尺寸太小(无法调整大小),(2)父窗口小部件具有QHBoxLayout,其中添加了窗口小部件A和B为此,(3)父窗口小部件太小,QHBoxLayout将子窗口小部件A和B排列成它们彼此重叠,就像在第一张图片中一样。 (4)这种重叠是不希望的,相反,小部件只需要一个接一个地放置,没有重叠,并且它们之间有间隙,如图2所示。我不知道如何使用QHBoxLayout做到这一点。

编辑2 这是直观的说明。

此处的绿色是父窗口小部件-不能通过假设调整大小。窗口小部件A已添加:

enter image description here

添加小部件B:

enter image description here

现在,小部件B在A的顶部。我不想要它。我要代替它:

enter image description here

1 个答案:

答案 0 :(得分:1)

子窗口小部件的minimumSize不会影响父窗口小部件的minimumSize,并且布局的使用也不会影响窗口小部件的minimumSize。布局使用处理的小部件的minimumSize以及其他功能(例如大小和大小调整策略)作为信息来设置minimumSizeHint和sizeHint。因此,在第一个实例中,您必须将父窗口小部件的minimumSize设置为其的minimumSizeHint。

另一方面,布局默认情况下具有间距,因此建议将其设置为0。

class Line(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=parent, autoFillBackground=True)
        # Set palette
        palette1 = QPalette()
        palette1.setColor(QPalette.Window, Qt.red)

        palette2 = QPalette()
        palette2.setColor(QPalette.Window, Qt.blue)

        palettebg = QPalette()
        palettebg.setColor(QPalette.Window, Qt.green)
        self.setPalette(palettebg)

        # Set labels
        self.label1 = QLabel(text="A", autoFillBackground=True)
        self.label1.setStyleSheet('font-size: 36pt;')
        self.label1.setPalette(palette1)
        self.label1.setMinimumSize(36, 36)
        self.label1.adjustSize()

        self.label2 = QLabel(text="B", autoFillBackground=True)
        self.label2.setStyleSheet('font-size: 36pt;')
        self.label2.setPalette(palette2)
        self.label2.setMinimumSize(36, 36)
        self.label2.adjustSize()

        # Set layout
        layout = QHBoxLayout(self, spacing=0)
        layout.addWidget(self.label1)
        layout.addSpacing(10)
        layout.addWidget(self.label2)
        self.setMinimumSize(self.minimumSizeHint())
        # or
        # layout = QHBoxLayout(self, spacing=10)
        # layout.addWidget(self.label1)
        # layout.addWidget(self.label2)
        # self.setMinimumSize(self.minimumSizeHint())

enter image description here


更新:

可以处理的最大布局大小是父窗口小部件的大小,因此在这种情况下它将压缩而不考虑空格,一种解决方案是设置作为内容的窗口小部件,并在其中建立布局,因此布局将自由地扩展到内容小部件。

class Line(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=parent, autoFillBackground=True)
        # Set palette
        palette1 = QPalette()
        palette1.setColor(QPalette.Window, Qt.red)

        palette2 = QPalette()
        palette2.setColor(QPalette.Window, Qt.blue)

        palettebg = QPalette()
        palettebg.setColor(QPalette.Window, Qt.green)
        self.setPalette(palettebg)

        # Set labels
        self.label1 = QLabel(text="A", autoFillBackground=True)
        self.label1.setStyleSheet('font-size: 36pt;')
        self.label1.setPalette(palette1)
        self.label1.setMinimumSize(36, 36)
        self.label1.adjustSize()

        self.label2 = QLabel(text="B", autoFillBackground=True)
        self.label2.setStyleSheet('font-size: 36pt;')
        self.label2.setPalette(palette2)
        self.label2.setMinimumSize(36, 36)
        self.label2.adjustSize()

        content_widget = QWidget(self)
        layout = QHBoxLayout(content_widget, spacing=10)
        layout.addWidget(self.label1)
        layout.addWidget(self.label2)
        content_widget.setFixedSize(content_widget.minimumSizeHint())

enter image description here