python - 阻止小部件相互重叠并在它们之间添加空间

标签 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_())

编辑 说明,按要求:(1) 假设父窗口小部件的大小太小(无法调整大小),(2) 父窗口小部件具有添加了窗口小部件 A 和 B 的 QHBoxLayout对此,(3)父部件太小,QHBoxLayout 排列子部件 A 和 B,使它们像第一张图片一样相互重叠。 (4) 这种重叠是不可取的,而是一个接一个放置,没有重叠,它们之间有间隙,如图2。我不知道如何用QHBoxLayout来做。

EDIT 2 这是一个直观的解释。

这里的绿色是父窗口小部件 - 无法根据假设调整大小。添加了小部件 A:

enter image description here

添加小部件 B:

enter image description here

现在,小部件 B 在 A 之上。我不想要它。我想要这个:

enter image description here

最佳答案

子widget的minimumSize不影响父widget的minimumSize,布局的使用也不影响widget的minimumSize。布局设置 minimumSizeHint 和 sizeHint,使用处理的小部件的 minimumSize 以及其他功能(例如大小和调整大小策略)作为信息。因此,在第一个实例中,您必须将父小部件的 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

关于python - 阻止小部件相互重叠并在它们之间添加空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54268604/

相关文章:

python - 将图像添加到选项卡

python - 哪些基于 python 的 ajax 推送服务器适合使用

python - 从状态文件跟踪 LFTP 下载

python - Django 测试异常 : "need more than 1 value to unpack"

python - 插入记录后让 QTableView 和数据库同步的最佳方法是什么?

python - 使用 QWebEngine 在同一窗口中打开任何链接(甚至_blank)

python - 为什么pyodbc在Fedora 27 ppc64上生成乱码错误信息?

python - 单击按钮即可更改 GIF

python - 更新: How to reduce QWidget nesting in PyQt code?

python - 用于橡皮筋的鼠标左键和用于平移 PYQT 的中间键