我正在使用QHBoxLayout
进行布局。细目是:发生的事情是pic.1,我想要的是pic.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的顶部。我不想要它。我要代替它:
答案 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())
可以处理的最大布局大小是父窗口小部件的大小,因此在这种情况下它将压缩而不考虑空格,一种解决方案是设置作为内容的窗口小部件,并在其中建立布局,因此布局将自由地扩展到内容小部件。
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())