Я использую QHBoxLayout
для макета.Разбивка: рис.1 - то, что происходит, рис.2 - то, что я хочу - виджеты не перекрываются, и между ними есть разрыв.Для рис.2 я создал виджет Gap
, который будет вставлен между существующими виджетами.Но это громоздкое решение, которое требует дополнительного обслуживания (особенно когда мне нужно заботиться о более чем двух виджетах).Более того, поскольку B перекрывается с A, я думаю, что недавно добавленный виджет-зазор также перекрывает A, возможно, в соответствии с долей его размера.Я не уверен в этом.
Я пытался использовать 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:
Добавить виджет B:
Теперь виджет B находится сверху A. Я не хочу этого.Я хочу это вместо: