Не позволяйте виджетам перекрывать друг друга и добавлять пространство между ними - PullRequest
0 голосов
/ 19 января 2019

Я использую QHBoxLayout для макета.Разбивка: рис.1 - то, что происходит, рис.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 голосов
/ 20 января 2019

Минимальный размер дочерних виджетов не влияет на минимальный размер родительского виджета, а использование макета также не влияет на минимальный размер виджета.Макеты устанавливают минимальные размеры и размер размера, используя в качестве информации минимальный размер обрабатываемых виджетов, а также другие функции, такие как политика размера и размера.Таким образом, в первом случае вы должны установить минимальный размер родительского виджета равным его минимальному размеру.

С другой стороны, макет имеет интервал по умолчанию, поэтому рекомендуется установить его на 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

...